From 289b766266e86eb35dd514fccc2918afce6da85c Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 25 Dec 2010 22:57:00 -0500 Subject: [PATCH] Get rid of stupid special casing of "q" in the key press handler. --- common/content/events.js | 60 +++++++++++++++++++++------------------- common/content/modes.js | 16 +++++------ 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/common/content/events.js b/common/content/events.js index 1d4dedaa..2ab628d2 100644 --- a/common/content/events.js +++ b/common/content/events.js @@ -16,6 +16,7 @@ var Events = Module("events", { this._fullscreen = window.fullScreen; this._lastFocus = null; this._currentMacro = ""; + this._macroKeys = []; this._lastMacro = ""; this.sessionListeners = []; @@ -138,19 +139,30 @@ var Events = Module("events", { dactyl.assert(/[a-zA-Z0-9]/.test(macro), "E354: Invalid register name: '" + macro + "'"); - modes.isRecording = true; + modes.recording = true; if (/[A-Z]/.test(macro)) { // uppercase (append) this._currentMacro = macro.toLowerCase(); - if (!this._macros.get(this._currentMacro)) - this._macros.set(this._currentMacro, { keys: "", timeRecorded: Date.now() }); // initialize if it does not yet exist + this._macroKeys = events.fromString((this._macros.get(this._currentMacro) || { keys: "" }).keys, true) + .map(events.closure.toString); } else { this._currentMacro = macro; - this._macros.set(this._currentMacro, { keys: "", timeRecorded: Date.now() }); + this._macroKeys = []; } }, + finishRecording: function () { + modes.recording = false; + this._macros.set(this._currentMacro, { + keys: this._macroKeys.join(""), + timeRecorded: Date.now() + }); + + dactyl.log("Recorded " + this._currentMacro + ": " + this._macroKeys.join(""), 9); + dactyl.echomsg("Recorded macro '" + this._currentMacro + "'"); + }, + /** * Replays a macro. * @@ -181,9 +193,9 @@ var Events = Module("events", { catch (e) {} buffer.loaded = 1; // even if not a full page load, assume it did load correctly before starting the macro - modes.isReplaying = true; + modes.replaying = true; res = events.feedkeys(this._macros.get(this._lastMacro).keys, { noremap: true }); - modes.isReplaying = false; + modes.replaying = false; } else // TODO: ignore this like Vim? @@ -263,7 +275,7 @@ var Events = Module("events", { break; // Stop feeding keys if page loading failed. - if (modes.isReplaying && !this.waitForPageLoad()) + if (modes.replaying && !this.waitForPageLoad()) break; } } @@ -822,19 +834,8 @@ var Events = Module("events", { if (!key) return null; - if (modes.isRecording) { - if (key == "q" && !modes.main.input) { // TODO: should not be hard-coded - modes.isRecording = false; - dactyl.log("Recorded " + this._currentMacro + ": " + this._macros.get(this._currentMacro, {}).keys, 9); - dactyl.echomsg("Recorded macro '" + this._currentMacro + "'"); - return killEvent(); - } - else if (this._input && !mappings.hasMap(modes.main, this._input.buffer + key)) - this._macros.set(this._currentMacro, { - keys: this._macros.get(this._currentMacro, {}).keys + key, - timeRecorded: Date.now() - }); - } + if (modes.recording && (!this._input || !mappings.hasMap(modes.main, this._input.buffer + key))) + events._macroKeys.push(key); // feedingKeys needs to be separate from interrupted so // we can differentiate between a recorded @@ -843,8 +844,8 @@ var Events = Module("events", { if (events.feedingKeys && !event.isMacro) { if (key == "") { events.feedingKeys = false; - if (modes.isReplaying) { - modes.isReplaying = false; + if (modes.replaying) { + modes.replaying = false; this.timeout(function () { dactyl.echomsg("Canceled playback of macro '" + this._lastMacro + "'"); }, 100); } } @@ -1091,7 +1092,7 @@ var Events = Module("events", { else if (this.pendingArgMap) { let map = this.pendingArgMap; if (!Events.isEscape(key)) - if (!modes.isReplaying || this.waitForPageLoad()) + if (!modes.replaying || this.waitForPageLoad()) execute(map, null, this.count, key); return true; } @@ -1118,7 +1119,7 @@ var Events = Module("events", { this.pendingMotionMap = map; } else { - if (modes.isReplaying && !this.waitForPageLoad()) + if (modes.replaying && !this.waitForPageLoad()) return true; let ret = execute(map, null, this.count); @@ -1211,12 +1212,15 @@ var Events = Module("events", { function () { return; }); // macros - mappings.add([modes.NORMAL, modes.PLAYER, modes.MESSAGE].filter(util.identity), + mappings.add([modes.NORMAL, modes.TEXT_AREA, modes.PLAYER].filter(util.identity), ["q"], "Record a key sequence into a macro", - function (arg) { events.startRecording(arg); }, - { arg: true }); + function (arg) { + events._macroKeys.pop(); + events[modes.recording ? "finishRecording" : "startRecording"](arg); + }, + { get arg() !modes.recording }); - mappings.add([modes.NORMAL, modes.PLAYER, modes.MESSAGE].filter(util.identity), + mappings.add([modes.NORMAL, modes.TEXT_AREA, modes.PLAYER].filter(util.identity), ["@"], "Play a macro", function (count, arg) { count = Math.max(count, 1); diff --git a/common/content/modes.js b/common/content/modes.js index aab3b314..8f3f0ca1 100644 --- a/common/content/modes.js +++ b/common/content/modes.js @@ -18,8 +18,8 @@ var Modes = Module("modes", { this._passNextKey = false; this._passAllKeys = false; - this._isRecording = false; - this._isReplaying = false; // playing a macro + this._recording = false; + this._replaying = false; // playing a macro this._modeStack = update([], { pop: function pop() { @@ -119,9 +119,9 @@ var Modes = Module("modes", { _getModeMessage: function () { // when recording a macro let macromode = ""; - if (modes.isRecording) + if (modes.recording) macromode = "recording"; - else if (modes.isReplaying) + else if (modes.replaying) macromode = "replaying"; let ext = ""; @@ -323,11 +323,11 @@ var Modes = Module("modes", { } }, - get isRecording() this._isRecording, - set isRecording(value) { this._isRecording = value; this.show(); }, + get recording() this._recording, + set recording(value) { this._recording = value; this.show(); }, - get isReplaying() this._isReplaying, - set isReplaying(value) { this._isReplaying = value; this.show(); }, + get replaying() this._replaying, + set replaying(value) { this._replaying = value; this.show(); }, get main() this._main, set main(value) { this.set(value); },