@@ -98,6 +98,12 @@ export class Terminal extends CoreTerminal implements ITerminal {
9898 */
9999 private _keyDownHandled : boolean = false ;
100100
101+ /**
102+ * Records whether a keydown event has occured since the last keyup event, i.e. whether a key
103+ * is currently "pressed".
104+ */
105+ private _keyDownSeen : boolean = false ;
106+
101107 /**
102108 * Records whether the keypress event has already been handled and triggered a data event, if so
103109 * the input event should not trigger a data event but should still print to the textarea so
@@ -1083,6 +1089,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
10831089 */
10841090 protected _keyDown ( event : KeyboardEvent ) : boolean | undefined {
10851091 this . _keyDownHandled = false ;
1092+ this . _keyDownSeen = true ;
10861093
10871094 if ( this . _customKeyEventHandler && this . _customKeyEventHandler ( event ) === false ) {
10881095 return false ;
@@ -1168,6 +1175,8 @@ export class Terminal extends CoreTerminal implements ITerminal {
11681175 }
11691176
11701177 protected _keyUp ( ev : KeyboardEvent ) : void {
1178+ this . _keyDownSeen = false ;
1179+
11711180 if ( this . _customKeyEventHandler && this . _customKeyEventHandler ( ev ) === false ) {
11721181 return ;
11731182 }
@@ -1241,7 +1250,8 @@ export class Terminal extends CoreTerminal implements ITerminal {
12411250 protected _inputEvent ( ev : InputEvent ) : boolean {
12421251 // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to
12431252 // support reading out character input which can doubling up input characters
1244- if ( ev . data && ev . inputType === 'insertText' && ! ev . composed && ! this . optionsService . rawOptions . screenReaderMode ) {
1253+ // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679
1254+ if ( ev . data && ev . inputType === 'insertText' && ( ! ev . composed || ! this . _keyDownSeen ) && ! this . optionsService . rawOptions . screenReaderMode ) {
12451255 if ( this . _keyPressHandled ) {
12461256 return false ;
12471257 }
0 commit comments