Skip to content

Commit 85ffce8

Browse files
committed
Ignore modifier keys for reconnecting terminal
1 parent 46f2615 commit 85ffce8

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

site/src/pages/TerminalPage/TerminalPage.tsx

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -474,15 +474,56 @@ const useReloading = (isDisconnected: boolean) => {
474474
return;
475475
}
476476

477-
const keyDownHandler = () => {
478-
setStatus("reloading");
479-
window.location.reload();
477+
// Keep track of modifier keys since we want to avoid reconnecting while
478+
// modifiers are held. This covers cases where the terminal unexpectedly
479+
// tries to reconnect like when pressing ctrl+w, ctrl+r, and so on. This
480+
// will not work if you pressed a modifier before the disconnect and are
481+
// still holding it; if we need to account for that we will need to listen
482+
// for modifier keys while connected as well.
483+
const modifierKeyState: Record<string, boolean> = {
484+
Alt: false,
485+
AltGraph: false,
486+
CapsLock: false,
487+
Control: false,
488+
Fn: false,
489+
FnLock: false,
490+
Meta: false,
491+
NumLock: false,
492+
ScrollLock: false,
493+
Shift: false,
494+
Symbol: false,
495+
SymbolLock: false,
496+
};
497+
498+
const isModifier = (event: KeyboardEvent): boolean => {
499+
return typeof modifierKeyState[event.key] !== "undefined";
500+
};
501+
502+
const isModified = (): boolean => {
503+
return Object.values(modifierKeyState).includes(true);
504+
};
505+
506+
const keyDownHandler = (event: KeyboardEvent) => {
507+
if (isModifier(event)) {
508+
modifierKeyState[event.key] = true;
509+
} else if (!isModified()) {
510+
setStatus("reloading");
511+
window.location.reload();
512+
}
513+
};
514+
515+
const keyUpHandler = (event: KeyboardEvent) => {
516+
if (isModifier(event)) {
517+
modifierKeyState[event.key] = false;
518+
}
480519
};
481520

482521
document.addEventListener("keydown", keyDownHandler, true);
522+
document.addEventListener("keyup", keyUpHandler, true);
483523

484524
return () => {
485525
document.removeEventListener("keydown", keyDownHandler, true);
526+
document.removeEventListener("keyup", keyUpHandler, true);
486527
};
487528
}, [status, isDisconnected]);
488529

0 commit comments

Comments
 (0)