diff --git a/packages/tools/src/eventListeners/keyboard/keyDownListener.ts b/packages/tools/src/eventListeners/keyboard/keyDownListener.ts index f78043f79c..e82a24bc6a 100644 --- a/packages/tools/src/eventListeners/keyboard/keyDownListener.ts +++ b/packages/tools/src/eventListeners/keyboard/keyDownListener.ts @@ -64,11 +64,23 @@ function keyListener(evt: KeyboardEvent): void { triggerEvent(eventDetail.element, Events.KEY_DOWN, eventDetail); document.addEventListener('keyup', _onKeyUp); + document.addEventListener('visibilitychange', _onVisibilityChange); // Todo: handle combination of keys state.element.removeEventListener('keydown', keyListener); } +/** + * Whenever the visibility (i.e. tab focus) changes such that the tab is NOT the + * active tab, reset the modifier key. + */ +function _onVisibilityChange(): void { + document.removeEventListener('visibilitychange', _onVisibilityChange); + if (document.visibilityState === 'hidden') { + resetModifierKey(); + } +} + function _onKeyUp(evt: KeyboardEvent): void { const eventDetail: KeyUpEventDetail = { renderingEngineId: state.renderingEngineId, @@ -81,6 +93,7 @@ function _onKeyUp(evt: KeyboardEvent): void { // Remove our temporary handlers document.removeEventListener('keyup', _onKeyUp); + document.removeEventListener('visibilitychange', _onVisibilityChange); state.element.addEventListener('keydown', keyListener); // Restore `state` to `defaultState`