Skip to content

Commit e7a9a72

Browse files
authored
[FIX] Handle key events when window is blurred or becomes hidden (playcanvas#2860)
1 parent 22ba30a commit e7a9a72

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/input/keyboard.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ function makeKeyboardEvent(event) {
2020
* @param {string|number} s - Either a character code or the key character.
2121
* @returns {number} The character code.
2222
*/
23-
function toKeyCode(s){
23+
function toKeyCode(s) {
2424
if (typeof s === "string") {
2525
return s.toUpperCase().charCodeAt(0);
2626
}
@@ -99,6 +99,8 @@ class Keyboard extends EventHandler {
9999
this._keyDownHandler = this._handleKeyDown.bind(this);
100100
this._keyUpHandler = this._handleKeyUp.bind(this);
101101
this._keyPressHandler = this._handleKeyPress.bind(this);
102+
this._visibilityChangeHandler = this._handleVisibilityChange.bind(this);
103+
this._windowBlurHandler = this._handleWindowBlur.bind(this);
102104

103105
this._keymap = {};
104106
this._lastmap = {};
@@ -126,6 +128,8 @@ class Keyboard extends EventHandler {
126128
this._element.addEventListener("keydown", this._keyDownHandler, false);
127129
this._element.addEventListener("keypress", this._keyPressHandler, false);
128130
this._element.addEventListener("keyup", this._keyUpHandler, false);
131+
document.addEventListener('visibilitychange', this._visibilityChangeHandler, false);
132+
window.addEventListener('blur', this._windowBlurHandler, false);
129133
}
130134

131135
/**
@@ -138,6 +142,8 @@ class Keyboard extends EventHandler {
138142
this._element.removeEventListener("keypress", this._keyPressHandler);
139143
this._element.removeEventListener("keyup", this._keyUpHandler);
140144
this._element = null;
145+
document.removeEventListener('visibilitychange', this._visibilityChangeHandler, false);
146+
window.removeEventListener('blur', this._windowBlurHandler, false);
141147
}
142148

143149
/**
@@ -148,7 +154,7 @@ class Keyboard extends EventHandler {
148154
* @param {number} keyCode - The key code.
149155
* @returns {string} The key identifier.
150156
*/
151-
toKeyIdentifier(keyCode){
157+
toKeyIdentifier(keyCode) {
152158
keyCode = toKeyCode(keyCode);
153159
var count;
154160
var hex;
@@ -192,7 +198,7 @@ class Keyboard extends EventHandler {
192198
}
193199
}
194200

195-
_handleKeyUp(event){
201+
_handleKeyUp(event) {
196202
var code = event.keyCode || event.charCode;
197203

198204
// Google Chrome auto-filling of login forms could raise a malformed event
@@ -215,7 +221,7 @@ class Keyboard extends EventHandler {
215221
}
216222
}
217223

218-
_handleKeyPress(event){
224+
_handleKeyPress(event) {
219225
this.fire("keypress", makeKeyboardEvent(event));
220226

221227
if (this.preventDefault) {
@@ -226,6 +232,17 @@ class Keyboard extends EventHandler {
226232
}
227233
}
228234

235+
_handleVisibilityChange() {
236+
if (document.visibilityState === 'hidden') {
237+
this._handleWindowBlur();
238+
}
239+
}
240+
241+
_handleWindowBlur() {
242+
this._keymap = {};
243+
this._lastmap = {};
244+
}
245+
229246
/**
230247
* @private
231248
* @function

0 commit comments

Comments
 (0)