Skip to content

Commit b4cf6e4

Browse files
javier-godoypaodb
authored andcommitted
feat: add method for enqueuing a listener before others
By default, custom key listeners execute in the same order they were registered. In some cases, it's desirable to add a listener that executes before others, so that it can prevent the event from propagating, so that the event is not handled by other listeners that have been added earlier.
1 parent c265af7 commit b4cf6e4

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

src/main/resources/META-INF/frontend/fc-xterm/xterm-element.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,13 @@ interface CustomKeyEventHandler {
4343

4444
interface CustomKeyEventHandlerRegistryDisposable extends IDisposable {
4545
id: integer;
46+
unshift: () => void;
4647
}
4748

4849
//sparse array of CustomKeyEventHandler
4950
class CustomKeyEventHandlerRegistry {
5051
private handlers: CustomKeyEventHandler[] = [];
52+
private indexes: number[] = [];
5153
private next:integer=0;
5254

5355
register(customKey: CustomKey, handle?: (event: KeyboardEvent) => void): CustomKeyEventHandlerRegistryDisposable;
@@ -67,15 +69,36 @@ class CustomKeyEventHandlerRegistry {
6769
const id = this.next++;
6870
if (!handle) handle = () => {};
6971
this.handlers[id] = {predicate, handle};
70-
return {id, dispose : () => delete this.handlers[id]};
72+
this.indexes.push(id);
73+
return {id, dispose : () => this.remove(id), unshift : () => this.unshift(id)};
7174
}
7275

76+
private unshift(id: integer) : void {
77+
const i= this.indexes.indexOf(id);
78+
if (i>=0) {
79+
this.indexes.splice(i, 1);
80+
this.indexes.unshift(id);
81+
}
82+
}
83+
7384
remove(id: integer) : void {
7485
delete this.handlers[id];
86+
const i= this.indexes.indexOf(id);
87+
if (i>=0) this.indexes.splice(i, 1);
7588
}
7689

7790
handle(context: XTermElement, ev: KeyboardEvent) : boolean {
7891
//invoke all the applicable handlers for event
92+
93+
let listeners : CustomKeyEventHandler[] = [];
94+
95+
for(var i=0;i<this.indexes.length;i++) {
96+
const h = this.handlers[this.indexes[i]];
97+
if (h.predicate(ev)) {
98+
listeners.push(h);
99+
}
100+
}
101+
79102
let stopImmediatePropagation = ev.stopImmediatePropagation.bind(ev);
80103

81104
let immediatePropagationStopped = false;
@@ -84,13 +107,10 @@ class CustomKeyEventHandlerRegistry {
84107
immediatePropagationStopped=true;
85108
};
86109

87-
let handled = false;
88-
for(const i in this.handlers) {
89-
if (/\d+/.test(i) && this.handlers[i].predicate(ev)) {
90-
handled=true;
91-
this.handlers[i].handle?.call(context, ev);
110+
let handled = listeners.length>0;
111+
for (var i=0;i<listeners.length;i++) {
112+
listeners[i].handle?.call(context, ev);
92113
if (immediatePropagationStopped) break;
93-
}
94114
}
95115

96116
if ((ev as any).requestCustomEvent) {

0 commit comments

Comments
 (0)