diff --git a/common/content/bindings.xml b/common/content/bindings.xml
index 746ca242..901e467e 100644
--- a/common/content/bindings.xml
+++ b/common/content/bindings.xml
@@ -19,11 +19,55 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/common/content/commandline.js b/common/content/commandline.js
index c53ed173..84afd990 100644
--- a/common/content/commandline.js
+++ b/common/content/commandline.js
@@ -176,6 +176,8 @@ var CommandWidgets = Class("CommandWidgets", {
let elem = document.getElementById("dactyl-multiline-output");
elem.contentWindow.addEventListener("unload", function (event) { event.preventDefault(); }, true);
elem.contentDocument.body.id = "dactyl-multiline-output-content";
+ elem.__defineGetter__("atEnd", function ()
+ !Buffer.isScrollable(elem.contentDocument.documentElement, 1));
["copy", "copylink", "selectall"].forEach(function (tail) {
// some host apps use "hostPrefixContext-copy" ids
let xpath = "//xul:menuitem[contains(@id, '" + "ontext-" + tail + "') and not(starts-with(@id, 'dactyl-'))]";
diff --git a/common/content/configbase.js b/common/content/configbase.js
index b068dac7..92b389f6 100644
--- a/common/content/configbase.js
+++ b/common/content/configbase.js
@@ -20,6 +20,16 @@ var ConfigBase = Class(ModuleBase, {
highlight.styleableChrome = this.styleableChrome;
highlight.loadCSS(this.CSS);
highlight.loadCSS(this.helpCSS);
+ if (!util.haveGecko("2b"))
+ highlight.loadCSS();
let img = Image();
img.src = this.logo || "chrome://" + this.name + "/content/logo.png";
diff --git a/common/content/dactyl.js b/common/content/dactyl.js
index 48848609..bb79b679 100644
--- a/common/content/dactyl.js
+++ b/common/content/dactyl.js
@@ -1313,9 +1313,12 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
styles.system.add("taboptions", "chrome://*",
classes.length ? classes.join(",") + "{ display: none; }" : "");
- },
- validator: function (opts) dactyl.has("Gecko2") ||
- Option.validIf(!/[nN]/.test(opts), "Tab numbering not available in this " + config.host + " version")
+
+ if (!dactyl.has("Gecko2")) {
+ tabs.tabBinding.enabled = Array.some(opts, function (k) k in this.opts, this);
+ tabs.updateTabCount();
+ }
+ }
}
].filter(function (group) !group.feature || dactyl.has(group.feature));
diff --git a/common/content/options.js b/common/content/options.js
index 3df9e724..38303c4e 100644
--- a/common/content/options.js
+++ b/common/content/options.js
@@ -661,7 +661,7 @@ var Options = Module("options", {
}
let closure = function () options._optionMap[name];
- memoize(this._options, this._options.length, closure);
+
memoize(this._optionMap, name, function () Option(names, description, type, defaultValue, extraInfo));
for (let alias in values(names.slice(1)))
memoize(this._optionMap, alias, closure);
@@ -670,6 +670,8 @@ var Options = Module("options", {
closure().initValue();
else
memoize(this.needInit, this.needInit.length, closure);
+ this._floptions = (this._floptions || []).concat(name);
+ memoize(this._options, this._options.length, closure);
// quickly access options with options["wildmode"]:
this.__defineGetter__(name, function () this._optionMap[name].value);
@@ -813,9 +815,9 @@ var Options = Module("options", {
*/
remove: function (name) {
let opt = this.get(name);
+ this._options = this._options.filter(function (o) o != opt);
for (let name in values(opt.names))
delete this._optionMap[name];
- this._options = this._options.filter(function (o) o != opt);
},
/** @property {Object} The options store. */
diff --git a/common/content/tabs.js b/common/content/tabs.js
index f7a6ad5f..fbefa2af 100644
--- a/common/content/tabs.js
+++ b/common/content/tabs.js
@@ -34,6 +34,11 @@ var Tabs = Module("tabs", {
dactyl.commands["tabs.select"] = function (event) {
tabs.select(event.originalTarget.getAttribute("identifier"));
};
+
+ this.tabBinding = styles.system.add("tab-binding", "chrome://browser/content/browser.xul", String.replace(<>>, /tab-./g, function (m) util.OS.isMacOSX ? "tab-mac" : m),
+ false, true);
},
cleanup: function cleanup() {
@@ -45,9 +50,9 @@ var Tabs = Module("tabs", {
}
},
- _updateTabCount: function () {
- if (dactyl.has("Gecko2"))
- for (let [i, tab] in Iterator(this.visibleTabs)) {
+ updateTabCount: function () {
+ for (let [i, tab] in Iterator(this.visibleTabs)) {
+ if (dactyl.has("Gecko2")) {
function node(clas) document.getAnonymousElementByAttribute(tab, "class", clas);
if (!node("dactyl-tab-number")) {
let nodes = {};
@@ -60,8 +65,10 @@ var Tabs = Module("tabs", {
tab.__defineGetter__("dactylOrdinal", function () Number(nodes.icon.value));
tab.__defineSetter__("dactylOrdinal", function (i) nodes.icon.value = nodes.label.textContent = i);
}
- tab.dactylOrdinal = i + 1;
}
+ tab.setAttribute("dactylOrdinal", i + 1);
+ tab.dactylOrdinal = i + 1;
+ }
statusline.updateTabCount(true);
},
@@ -497,7 +504,7 @@ var Tabs = Module("tabs", {
}
}, {
load: function () {
- tabs._updateTabCount();
+ tabs.updateTabCount();
},
commands: function () {
commands.add(["bd[elete]", "bw[ipeout]", "bun[load]", "tabc[lose]"],
@@ -864,7 +871,7 @@ var Tabs = Module("tabs", {
events: function () {
let tabContainer = config.tabbrowser.mTabContainer;
["TabMove", "TabOpen", "TabClose"].forEach(function (event) {
- events.addSessionListener(tabContainer, event, this.closure._updateTabCount, false);
+ events.addSessionListener(tabContainer, event, this.closure.updateTabCount, false);
}, this);
events.addSessionListener(tabContainer, "TabSelect", this.closure._onTabSelect, false);
},
diff --git a/common/modules/base.jsm b/common/modules/base.jsm
index 765247f4..bbae6553 100644
--- a/common/modules/base.jsm
+++ b/common/modules/base.jsm
@@ -10,7 +10,6 @@ if (!JSMLoader)
globals: {},
stale: {},
load: function load(url, target) {
- dump("dactyl: load: " + url + "\n");
if (this.stale[url]) {
delete this.stale[url];
let global = this.globals[url];
@@ -26,7 +25,6 @@ if (!JSMLoader)
Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
.getService(Components.interfaces.mozIJSSubScriptLoader)
.loadSubScript(url, global);
- dump("dactyl: load reloaded: " + url + "\n");
}
Components.utils.import(url, target);
},
diff --git a/common/skin/dactyl.css b/common/skin/dactyl.css
index 62c92ca1..4d4b59d4 100644
--- a/common/skin/dactyl.css
+++ b/common/skin/dactyl.css
@@ -77,9 +77,9 @@
@-moz-document
url-prefix(chrome://) {
-.tab-icon-image, .tab-throbber { -moz-box-ordinal-group: 10; }
-[dactyl|highlight~=tab-number] { -moz-box-ordinal-group: 20; }
-.tab-text, .tab-label, .tab-close-button { -moz-box-ordinal-group: 50; }
+#TabsToolbar .tab-icon-image, .tab-throbber { -moz-box-ordinal-group: 10; }
+[dactyl|highlight~=tab-number] { -moz-box-ordinal-group: 20; }
+.tab-text, .tab-label, .tab-close-button { -moz-box-ordinal-group: 50; }
[dactyl|highlight~=Bell] {
-moz-appearance: none !important;
diff --git a/pentadactyl/NEWS b/pentadactyl/NEWS
index dde31cc7..6d42bd9b 100644
--- a/pentadactyl/NEWS
+++ b/pentadactyl/NEWS
@@ -82,7 +82,7 @@
- Active filters are not highlighted in :style listings.
- :style-related commands now divide their completions between
those active and inactive for the current site.
- - CSS property name completion is not available.
+ - CSS property name completion is now available.
* IMPORTANT option changes:
- Boolean options no longer accept an argument.
- 'cdpath' and 'runtimepath' no longer treat ",,"