mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-19 11:17:59 +01:00
178 lines
7.6 KiB
JavaScript
Executable File
178 lines
7.6 KiB
JavaScript
Executable File
/*
|
||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||
* <maglions.k at Gmail> wrote this file. As long as you retain this notice you
|
||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||
* this stuff is worth it, you can buy me a beer in return. Kris Maglione
|
||
* ---------------------------------------------------------------------------
|
||
* <phk@FreeBSD.ORG> wrote this license. As long as you retain this notice you
|
||
* can do whatever you want with this stuff. If we meet some day, and you think
|
||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
||
* ---------------------------------------------------------------------------
|
||
*
|
||
* Documentation is at the tail of this file.
|
||
*/
|
||
"use strict";
|
||
|
||
let groupId = 0;
|
||
let onUnload = overlay.overlayObject(gBrowser, {
|
||
addTab: util.wrapCallback(function addTab(uri, params, charset, postData, ownerTab) {
|
||
if (!isObject(params) || params instanceof Ci.nsIURI)
|
||
params = { referrerURI: params, ownerTab: ownerTab };
|
||
let currentTab = tabs.getTab();
|
||
let tab = addTab.superapply(this, arguments);
|
||
|
||
if (!params.ownerTab && (params.referrerURI || params.relatedToCurrent))
|
||
params.ownerTab = currentTab;
|
||
if (params.ownerTab)
|
||
tab.dactylOwner = Cu.getWeakReference(params.ownerTab);
|
||
|
||
tab.dactylGroup = browser.groupId++;
|
||
if (params.ownerTab && (params.referrerURI || params.relatedToCurrent)) {
|
||
if (params.ownerTab.dactylGroup == null)
|
||
params.ownerTab.dactylGroup = tab.dactylGroup;
|
||
tab.dactylGroup = params.ownerTab.dactylGroup;
|
||
}
|
||
|
||
// This is a hack to deal with session restore.
|
||
if (uri === "about:blank" && params.skipAnimation && Object.keys(params).length == 1)
|
||
return tab;
|
||
|
||
let source = params.fromExternal ? "external" :
|
||
params.referrerURI ? "link"
|
||
: "orphan";
|
||
let location = options["tabopen"][source];
|
||
if (uri == null || location == null)
|
||
return tab;
|
||
|
||
let visible = tabs.visibleTabs;
|
||
let index = visible.indexOf(params.ownerTab || currentTab);
|
||
if (/left$/.test(location))
|
||
;
|
||
else if (/right$/.test(location))
|
||
index++;
|
||
else if ("start" == location)
|
||
index = 0;
|
||
else if ("end" == location)
|
||
index = visible.length;
|
||
if ("groupleft" == location)
|
||
while (index > 0 && visible[index].dactylGroup && visible[index].dactylGroup == currentTab.dactylGroup)
|
||
index--;
|
||
else if ("groupright" == location)
|
||
while (index < visible.length && visible[index].dactylGroup && visible[index].dactylGroup == currentTab.dactylGroup)
|
||
index++;
|
||
config.browser.moveTabTo(tab, tabs.allTabs.concat(undefined).indexOf(visible[index]));
|
||
|
||
return tab;
|
||
}),
|
||
removeTab: util.wrapCallback(function removeTab(tab) {
|
||
if (tab == tabs.getTab()) {
|
||
let tabList = tabs.visibleTabs;
|
||
let idx = tabList.indexOf(tab);
|
||
for (let val of values(options["tabclose"])) {
|
||
if (val == "opener" && tab.dactylOwner && tabs.allTabs.indexOf(tab.dactylOwner.get()) >= 0)
|
||
tabs.select(tab.dactylOwner.get());
|
||
else if (val == "previous" && tabs.alternate)
|
||
tabs.select(tabs.alternate);
|
||
else if (val == "left" && idx > 0)
|
||
tabs.select(idx - 1);
|
||
else if (val == "right" && idx < tabList.length - 1)
|
||
tabs.select(idx + 1);
|
||
else
|
||
continue;
|
||
break;
|
||
}
|
||
}
|
||
return removeTab.superapply(this, arguments);
|
||
}),
|
||
});
|
||
|
||
group.options.add(["tabclose", "tc"],
|
||
"Tab closure options, in order of precedence",
|
||
"stringlist", "left,opener,previous,right",
|
||
{
|
||
completer: context => [
|
||
["left", "Select the tab to the left when closing"],
|
||
["opener", UTF8("Select the tab’s opener, if available")],
|
||
["previous", "Select the previously selected tab"],
|
||
["right", "Select the tab to the right when closing"]
|
||
]
|
||
});
|
||
group.options.add(["tabopen", "to"],
|
||
"Placement options for new tabs",
|
||
"stringmap", "link:right,orphan:groupright,external:end",
|
||
{
|
||
completer: function (context, extra) {
|
||
if (extra.value == null)
|
||
return [
|
||
["external", "Tabs opened from an external application"],
|
||
["link", "Tabs opened by clicking links and the like"],
|
||
["orphan", "Tabs opened by any other means"]
|
||
].filter(e => !hasOwnProperty(extra.values, e[0]));
|
||
return [
|
||
["end", "Open new tabs at the end of the tab bar"],
|
||
["groupleft", "Open tabs to the left of the current group"],
|
||
["groupright", "Open tabs to the right of the current group"],
|
||
["left", "Open new tabs to the left of the current tab"],
|
||
["right", "Open new tabs to the right of the current tab"],
|
||
["start", "Open new tabs at the start of the tab bar"]
|
||
]
|
||
}
|
||
});
|
||
|
||
var INFO =
|
||
["plugin", { name: "tab-options",
|
||
version: "0.3",
|
||
href: "http://dactyl.sf.net/pentadactyl/plugins#tab-options-plugin",
|
||
summary: "Tab options",
|
||
xmlns: "dactyl" },
|
||
["author", { email: "maglione.k@gmail.com" }, "Kris Maglione"],
|
||
["license", { href: "http://people.freebsd.org/~phk/" }, "BEER-WARE"],
|
||
["project", { name: "Pentadactyl", "min-version": "1.0" }],
|
||
["p", {},
|
||
"Adds extended tab options, including relative placement of new",
|
||
"tabs and more sensible focus changes after tab closure."],
|
||
|
||
["item", {},
|
||
["tags", {}, "'tc' 'tabclose'"],
|
||
["spec", {}, "'tabclose' 'tc'"],
|
||
["type", {}, "stringlist"],
|
||
["default", {}, options.get("tabclose").stringDefaultValue],
|
||
["description", {},
|
||
["p", {},
|
||
"Tab closure options, in order of precedence. The ",
|
||
"first item for which a valid tab exists is used."],
|
||
["dl", {},
|
||
template.map(options.get("tabclose").completer(),
|
||
([k, v]) =>
|
||
[["dt", {}, k], ["dd", {}, v]])],
|
||
["note", {},
|
||
"This option does not affect the default mappings for ",
|
||
["k", {}, "d"], "and ", ["k", {}, "D"],
|
||
", which behave as documented."]]],
|
||
|
||
["item", {},
|
||
["tags", {}, "'to' 'tabopen'"],
|
||
["spec", {}, "'tabopen' 'to'"],
|
||
["type", {}, "stringmap"],
|
||
["default", {}, options.get("tabopen").stringDefaultValue],
|
||
["description", {},
|
||
["p", {},
|
||
"New tab placement options. The keys in the ",
|
||
["t", {}, "stringmap"],
|
||
"refer to the ways the tab was opened, while the values define ",
|
||
"where such tabs are placed. The following keys are applicable:"],
|
||
["dl", {},
|
||
template.map(options.get("tabopen")
|
||
.completer(null, { values: {} }),
|
||
([k, v]) =>
|
||
[["dt", {}, k], ["dd", {}, v]])],
|
||
["p", {}, "As are the following values:"],
|
||
["dl", {},
|
||
template.map(options.get("tabopen")
|
||
.completer(null, { value: "" }),
|
||
([k, v]) =>
|
||
[["dt", {}, k], ["dd", {}, v]])]]]
|
||
];
|
||
|
||
/* vim:se sts=4 sw=4 et: */
|