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 ",,"