diff --git a/common/content/events.js b/common/content/events.js index 476f8b55..93f297a1 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -923,7 +923,8 @@ var Events = Module("events", { events: { DOMMenuBarActive: function () { this._activeMenubar = true; - modes.add(modes.MENU); + if (modes.main != modes.MENU) + modes.push(modes.MENU); }, DOMMenuBarInactive: function () { @@ -1057,11 +1058,6 @@ var Events = Module("events", { mode = Modes.StackElement(event.dactylMode); let ignore = false; - let overrideMode = null; - - // menus have their own command handlers - if (modes.extended & modes.MENU) - overrideMode = modes.MENU; if (modes.main == modes.PASS_THROUGH) ignore = !Events.isEscape(key) && key != ""; @@ -1090,13 +1086,10 @@ var Events = Module("events", { if (config.ignoreKeys[key] & mode.main) return null; - if (overrideMode) - var keyModes = array([overrideMode]); - else - keyModes = array([mode.params.keyModes, mode.main, mode.main.allBases]).flatten().compact(); - let hives = mappings.hives.slice(event.noremap ? -1 : 0); + let keyModes = array([mode.params.keyModes, mode.main, mode.main.allBases]).flatten().compact(); + this.processor = ProcessorStack(mode, hives, keyModes); } @@ -1153,7 +1146,8 @@ var Events = Module("events", { popupshown: function onPopupShown(event) { if (event.originalTarget.localName !== "tooltip" && event.originalTarget.id !== "dactyl-visualbell") - modes.add(modes.MENU); + if (modes.main != modes.MENU) + modes.push(modes.MENU); }, popuphidden: function onPopupHidden() { diff --git a/common/content/modes.js b/common/content/modes.js index b4a89b0a..422bbee1 100644 --- a/common/content/modes.js +++ b/common/content/modes.js @@ -155,6 +155,11 @@ var Modes = Module("modes", { bases: [] }); + this.addMode("MENU", { + description: "Active when a menu or other pop-up is open", + input: true + }); + // this._extended modes, can include multiple modes, and even main modes this.addMode("EX", { extended: true, @@ -172,14 +177,9 @@ var Modes = Module("modes", { hidden: true, input: true }); - this.addMode("MENU", { - extended: true, - input: true, - description: "Active when a menu or other pop-up is open", - }); // a popupmenu is active this.addMode("LINE", { extended: true, hidden: true - }); // linewise visual mode + }); this.addMode("PROMPT", { extended: true, description: "Active when a prompt is open in the command line", @@ -219,14 +219,9 @@ var Modes = Module("modes", { else if (modes.replaying) macromode = "replaying"; - let ext = ""; - if (this._extended & modes.MENU) // TODO: desirable? - ext += " (menu)"; - ext += " --" + macromode; - let val = this._modeMap[this._main].display(); if (val) - return "-- " + val + ext; + return "-- " + val + " --" + macromode;; return macromode; }, @@ -270,6 +265,8 @@ var Modes = Module("modes", { getStack: function (idx) this._modeStack[this._modeStack.length - idx - 1] || this._modeStack[0], + get stack() this._modeStack.slice(), + getCharModes: function (chr) (this.modeChars[chr] || []).slice(), matchModes: function (obj) @@ -285,10 +282,11 @@ var Modes = Module("modes", { commandline.widgets.mode = msg || null; }, - // add/remove always work on the this._extended mode only - add: function add(mode) { - this._extended |= mode; - this.show(); + remove: function remove(mode) { + if (this.stack.some(function (m) m.main == mode)) { + this.pop(mode); + this.pop(); + } }, delayed: [], @@ -391,13 +389,6 @@ var Modes = Module("modes", { this.pop(); }, - remove: function remove(mode) { - if (this._extended & mode) { - this._extended &= ~mode; - this.show(); - } - }, - get recording() this._recording, set recording(value) { this._recording = value; this.show(); }, @@ -505,10 +496,13 @@ var Modes = Module("modes", { "Return to the previous mode", function () { modes.pop(); }); - mappings.add([modes.MENU], - ["", ""], + mappings.add([modes.MENU], [""], "Close the current popup", function () Events.PASS); + + mappings.add([modes.MENU], [""], + "Close the current popup", + function () { events.feedkeys("") }); }, prefs: function () { prefs.watch("accessibility.browsewithcaret", modes.closure.onCaretChange);