@@ -474,15 +474,56 @@ const useReloading = (isDisconnected: boolean) => {
474
474
return ;
475
475
}
476
476
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
+ }
480
519
} ;
481
520
482
521
document . addEventListener ( "keydown" , keyDownHandler , true ) ;
522
+ document . addEventListener ( "keyup" , keyUpHandler , true ) ;
483
523
484
524
return ( ) => {
485
525
document . removeEventListener ( "keydown" , keyDownHandler , true ) ;
526
+ document . removeEventListener ( "keyup" , keyUpHandler , true ) ;
486
527
} ;
487
528
} , [ status , isDisconnected ] ) ;
488
529
0 commit comments