diff --git a/js/accessibility/KeyStateTracker.ts b/js/accessibility/KeyStateTracker.ts index d538499ec..ef2c92a00 100644 --- a/js/accessibility/KeyStateTracker.ts +++ b/js/accessibility/KeyStateTracker.ts @@ -94,6 +94,9 @@ class KeyStateTracker { if ( assert && !KeyboardUtils.isControlKey( domEvent ) ) { assert( domEvent.ctrlKey === this.ctrlKeyDown, 'ctrl key inconsistency between event and keyState.' ); } + if ( assert && !KeyboardUtils.isMetaKey( domEvent ) ) { + assert( domEvent.metaKey === this.metaKeyDown, 'meta key inconsistency between event and keyState.' ); + } // if the key is already down, don't do anything else (we don't want to create a new keyState object // for a key that is already being tracked and down) @@ -210,6 +213,13 @@ class KeyStateTracker { timeDown: 0 // in ms }; } + if ( domEvent.metaKey && !KeyboardUtils.isMetaKey( domEvent ) && !this.metaKeyDown ) { + this.keyState[ KeyboardUtils.KEY_META_LEFT ] = { + keyDown: true, + key: key, + timeDown: 0 // in ms + }; + } // delete modifier keys if we think they are down if ( !domEvent.shiftKey && this.shiftKeyDown ) { @@ -224,6 +234,9 @@ class KeyStateTracker { delete this.keyState[ KeyboardUtils.KEY_CONTROL_LEFT ]; delete this.keyState[ KeyboardUtils.KEY_CONTROL_RIGHT ]; } + if ( !domEvent.metaKey && this.metaKeyDown ) { + KeyboardUtils.META_KEYS.forEach( key => { delete this.keyState[ key ]; } ); + } } /** @@ -392,6 +405,13 @@ class KeyStateTracker { return this.isAnyKeyInListDown( KeyboardUtils.CONTROL_KEYS ); } + /** + * Returns true if one of the meta keys is currently down. + */ + public get metaKeyDown(): boolean { + return this.isAnyKeyInListDown( KeyboardUtils.META_KEYS ); + } + /** * Returns the amount of time that the provided key has been held down. Error if the key is not currently down. * @param key - KeyboardEvent.code for the key you are inspecting.