mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-28 08:12:27 +01:00
Fix overlong stack generated by key events received during feedkeys, along with related "Attempt to execute mapping recursively" errors.
This commit is contained in:
@@ -272,7 +272,6 @@ var Events = Module("events", {
|
|||||||
try {
|
try {
|
||||||
var wasFeeding = this.feedingKeys;
|
var wasFeeding = this.feedingKeys;
|
||||||
this.feedingKeys = true;
|
this.feedingKeys = true;
|
||||||
this.duringFeed = this.duringFeed || [];
|
|
||||||
|
|
||||||
var wasQuiet = commandline.quiet;
|
var wasQuiet = commandline.quiet;
|
||||||
if (quiet)
|
if (quiet)
|
||||||
@@ -315,13 +314,6 @@ var Events = Module("events", {
|
|||||||
this.feedingKeys = wasFeeding;
|
this.feedingKeys = wasFeeding;
|
||||||
if (quiet)
|
if (quiet)
|
||||||
commandline.quiet = wasQuiet;
|
commandline.quiet = wasQuiet;
|
||||||
|
|
||||||
if (this.duringFeed.length) {
|
|
||||||
let duringFeed = this.duringFeed;
|
|
||||||
this.duringFeed = [];
|
|
||||||
for (let [, event] in Iterator(duringFeed))
|
|
||||||
events.dispatch(event.originalTarget, event, event);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -868,43 +860,45 @@ var Events = Module("events", {
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.feedingEvent && [!(k in event) || event[k] === v for ([k, v] in Iterator(this.feedingEvent))].every(util.identity)) {
|
|
||||||
for (let [k, v] in Iterator(this.feedingEvent))
|
|
||||||
if (!(k in event))
|
|
||||||
event[k] = v;
|
|
||||||
this.feedingEvent = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let key = events.toString(event);
|
|
||||||
if (!key)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
if (modes.recording && (!this._input || !mappings.userHive.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 <C-c>
|
|
||||||
// interrupting whatever it's started and a real <C-c>
|
|
||||||
// interrupting our playback.
|
|
||||||
if (events.feedingKeys && !event.isMacro) {
|
|
||||||
if (key == "<C-c>") {
|
|
||||||
events.feedingKeys = false;
|
|
||||||
if (modes.replaying) {
|
|
||||||
modes.replaying = false;
|
|
||||||
this.timeout(function () { dactyl.echomsg("Canceled playback of macro '" + this._lastMacro + "'"); }, 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
events.duringFeed.push(event);
|
|
||||||
|
|
||||||
return kill(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
function shouldPass()
|
function shouldPass()
|
||||||
(!dactyl.focusedElement || events.isContentNode(dactyl.focusedElement)) &&
|
(!dactyl.focusedElement || events.isContentNode(dactyl.focusedElement)) &&
|
||||||
options.get("passkeys").has(events.toString(event));
|
options.get("passkeys").has(events.toString(event));
|
||||||
|
|
||||||
|
let duringFeed = this.duringFeed;
|
||||||
|
this.duringFeed = [];
|
||||||
try {
|
try {
|
||||||
|
if (this.feedingEvent && [!(k in event) || event[k] === v for ([k, v] in Iterator(this.feedingEvent))].every(util.identity)) {
|
||||||
|
for (let [k, v] in Iterator(this.feedingEvent))
|
||||||
|
if (!(k in event))
|
||||||
|
event[k] = v;
|
||||||
|
this.feedingEvent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let key = events.toString(event);
|
||||||
|
if (!key)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (modes.recording && (!this._input || !mappings.userHive.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 <C-c>
|
||||||
|
// interrupting whatever it's started and a real <C-c>
|
||||||
|
// interrupting our playback.
|
||||||
|
if (events.feedingKeys && !event.isMacro) {
|
||||||
|
if (key == "<C-c>") {
|
||||||
|
events.feedingKeys = false;
|
||||||
|
if (modes.replaying) {
|
||||||
|
modes.replaying = false;
|
||||||
|
this.timeout(function () { dactyl.echomsg("Canceled playback of macro '" + this._lastMacro + "'"); }, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
events.duringFeed.push(event);
|
||||||
|
|
||||||
|
return kill(event);
|
||||||
|
}
|
||||||
|
|
||||||
let mode = modes.getStack(0);
|
let mode = modes.getStack(0);
|
||||||
if (event.dactylMode)
|
if (event.dactylMode)
|
||||||
mode = Modes.StackElement(event.dactylMode);
|
mode = Modes.StackElement(event.dactylMode);
|
||||||
@@ -1020,6 +1014,16 @@ var Events = Module("events", {
|
|||||||
catch (e) {
|
catch (e) {
|
||||||
dactyl.reportError(e);
|
dactyl.reportError(e);
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
[duringFeed, this.duringFeed] = [this.duringFeed, duringFeed];
|
||||||
|
for (let event in this.duringFeed)
|
||||||
|
try {
|
||||||
|
this.dispatch(event.originalTarget, event, event);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
util.reportError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onKeyUpOrDown: function onKeyUpOrDown(event) {
|
onKeyUpOrDown: function onKeyUpOrDown(event) {
|
||||||
|
|||||||
@@ -1465,16 +1465,23 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
|
|||||||
return results;
|
return results;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
yielders: 0,
|
||||||
threadYield: function (flush, interruptable) {
|
threadYield: function (flush, interruptable) {
|
||||||
let mainThread = services.threading.mainThread;
|
this.yielders++;
|
||||||
/* FIXME */
|
try {
|
||||||
util.interrupted = false;
|
let mainThread = services.threading.mainThread;
|
||||||
do {
|
/* FIXME */
|
||||||
mainThread.processNextEvent(!flush);
|
util.interrupted = false;
|
||||||
if (util.interrupted)
|
do {
|
||||||
throw new Error("Interrupted");
|
mainThread.processNextEvent(!flush);
|
||||||
|
if (util.interrupted)
|
||||||
|
throw new Error("Interrupted");
|
||||||
|
}
|
||||||
|
while (flush === true && mainThread.hasPendingEvents());
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
this.yielders--;
|
||||||
}
|
}
|
||||||
while (flush === true && mainThread.hasPendingEvents());
|
|
||||||
},
|
},
|
||||||
|
|
||||||
yieldable: function yieldable(func)
|
yieldable: function yieldable(func)
|
||||||
|
|||||||
Reference in New Issue
Block a user