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:
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user