1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-01-04 07:24:12 +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:
Kris Maglione
2011-01-20 00:30:14 -05:00
parent 8df4e908e8
commit 8fbe8fffec
2 changed files with 59 additions and 48 deletions

View File

@@ -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,6 +860,13 @@ var Events = Module("events", {
event.stopPropagation(); event.stopPropagation();
} }
function shouldPass()
(!dactyl.focusedElement || events.isContentNode(dactyl.focusedElement)) &&
options.get("passkeys").has(events.toString(event));
let duringFeed = this.duringFeed;
this.duringFeed = [];
try {
if (this.feedingEvent && [!(k in event) || event[k] === v for ([k, v] in Iterator(this.feedingEvent))].every(util.identity)) { 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)) for (let [k, v] in Iterator(this.feedingEvent))
if (!(k in event)) if (!(k in event))
@@ -900,11 +899,6 @@ var Events = Module("events", {
return kill(event); return kill(event);
} }
function shouldPass()
(!dactyl.focusedElement || events.isContentNode(dactyl.focusedElement)) &&
options.get("passkeys").has(events.toString(event));
try {
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) {

View File

@@ -1465,7 +1465,10 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
return results; return results;
}, },
yielders: 0,
threadYield: function (flush, interruptable) { threadYield: function (flush, interruptable) {
this.yielders++;
try {
let mainThread = services.threading.mainThread; let mainThread = services.threading.mainThread;
/* FIXME */ /* FIXME */
util.interrupted = false; util.interrupted = false;
@@ -1475,6 +1478,10 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
throw new Error("Interrupted"); throw new Error("Interrupted");
} }
while (flush === true && mainThread.hasPendingEvents()); while (flush === true && mainThread.hasPendingEvents());
}
finally {
this.yielders--;
}
}, },
yieldable: function yieldable(func) yieldable: function yieldable(func)