diff --git a/common/content/events.js b/common/content/events.js index ced08bf2..378c493d 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -852,7 +852,6 @@ const Events = Module("events", { } try { - let stop = false; let mode = modes.getStack(0); if (event.dactylMode) mode = Modes.StackElement(event.dactylMode); @@ -864,41 +863,35 @@ const Events = Module("events", { let input = this._input; this._input = null; if (!input) { + let ignore = false; + // menus have their own command handlers if (modes.extended & modes.MENU) - stop = true; + ignore = true; else if (modes.main == modes.PASS_THROUGH) - // let flow continue to handle these keys to cancel escape-all-keys mode - stop = !Events.isEscape(key) && key != ""; - // handle Escape-one-key mode (Ctrl-v) + ignore = !Events.isEscape(key) && key != ""; else if (modes.main == modes.QUOTE) { if (modes.getStack(1).main == modes.PASS_THROUGH) { mode.params.mainMode = modes.getStack(2).main; - stop = Events.isEscape(key); + ignore = Events.isEscape(key); } else if (shouldPass()) mode.params.mainMode = modes.getStack(1).main; else - stop = true; + ignore = true; - if (stop && !Events.isEscape(key)) + if (ignore && !Events.isEscape(key)) modes.pop(); } else if (!event.isMacro && !event.noremap && shouldPass()) - stop = true; + ignore = true; - if (stop) + if (ignore) return null; if (key == "") util.interrupted = true; - stop = true; // set to false if we should NOT consume this event but let the host app handle it - - // XXX: ugly hack for now pass certain keys to the host app as - // they are without beeping also fixes key navigation in combo - // boxes, submitting forms, etc. - // FIXME: breaks iabbr for now --mst if (key in config.ignoreKeys && (config.ignoreKeys[key] & mode.main)) return null; @@ -909,6 +902,7 @@ const Events = Module("events", { input.postExecute = mode.params.postExecute; if (mode.params.onEvent) input.fallthrough = function (event) { + util.dump("fallthrough", String(mode), events.toString(event)); // Bloody hell. if (events.toString(event) === "") event.dactylString = ""; @@ -924,13 +918,6 @@ const Events = Module("events", { dactyl.reportError(e); } finally { - if (!this._input) - statusline.updateInputBuffer(""); - else if (!(modes.extended & modes.HINTS)) { - let motionMap = (this._input.pendingMotionMap && this._input.pendingMotionMap.names[0]) || ""; - statusline.updateInputBuffer(motionMap + this._input.buffer); - } - // This is a stupid, silly, and revolting hack. if (Events.isEscape(key) && !shouldPass()) this.onEscape(); @@ -1015,6 +1002,7 @@ const Events = Module("events", { append: function append(event) { this.events.push(event); this.buffer += events.toString(event); + return this.events; }, process: function process(event) { @@ -1052,11 +1040,22 @@ const Events = Module("events", { else events.onKeyPress(event); } + + if (!this.main.ownsBuffer) { + if (res != null) + statusline.updateInputBuffer(""); + else { + let motionMap = (this.pendingMotionMap && this.pendingMotionMap.names[0]) || ""; + statusline.updateInputBuffer(motionMap + this.buffer); + } + } + return res != null; }, onKeyPress: function onKeyPress(event) { const self = this; + let key = events.toString(event); let inputStr = this.buffer + key; let countStr = inputStr.match(/^[1-9][0-9]*|/)[0]; @@ -1083,7 +1082,9 @@ const Events = Module("events", { // counts must be at the start of a complete mapping (10j -> go 10 lines down) if (countStr && !candidateCommand) { // no count for insert mode mappings - if (!this.main.count || this.main.input) + if (!this.main.count) + return this.append(event); + else if (this.main.input) return false; else this.append(event); diff --git a/common/content/modes.js b/common/content/modes.js index e5352c61..c59e85b6 100644 --- a/common/content/modes.js +++ b/common/content/modes.js @@ -69,10 +69,10 @@ const Modes = Module("modes", { } }); this.addMode("TEXT_EDIT", { char: "t", ownsFocus: true }); - this.addMode("EMBED", { input: true, ownsFocus: true }); + this.addMode("EMBED", { input: true, ownsFocus: true }); this.addMode("PASS_THROUGH"); - this.addMode("QUOTE", { + this.addMode("QUOTE", { display: function () modes.getStack(1).main == modes.PASS_THROUGH ? (modes.getStack(2).mainMode.display() || modes.getStack(2).mainMode.name) + " (next)" : "PASS THROUGH (next)" @@ -85,7 +85,7 @@ const Modes = Module("modes", { // this._extended modes, can include multiple modes, and even main modes this.addMode("EX", true); - this.addMode("HINTS", true); + this.addMode("HINTS", { count: false, ownsBuffer: true }); this.addMode("INPUT_MULTILINE", true); this.addMode("OUTPUT_MULTILINE", true); this.addMode("SEARCH_FORWARD", true); diff --git a/common/content/tabs.js b/common/content/tabs.js index 16ad6d62..db906ff0 100644 --- a/common/content/tabs.js +++ b/common/content/tabs.js @@ -714,7 +714,7 @@ const Tabs = Module("tabs", { commands.add(["tabo[nly]"], "Close all other tabs", - function () { tabs.keepOnly(config.tabbrowser.mCurrentTab); }, + function () { tabs.keepOnly(tabs.getTab()); }, { argCount: "0" }); commands.add(["tabopen", "t[open]", "tabnew"],