Skip to content

Commit 183280d

Browse files
authored
Mitigations for OS X caps lock (#443)
Caps lock is treated like a "sticky" key in OS X. So...treat it like a "tap". Fixes #297 and at least warns about #29
1 parent 34a2577 commit 183280d

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

main.js

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ let audioFilterFreq = 7000;
6565
let audioFilterQ = 5;
6666
let stationId = 101;
6767
let econet = null;
68+
const isMac = window.navigator.platform.indexOf("Mac") === 0;
6869

6970
if (queryString) {
7071
if (queryString[queryString.length - 1] === "/")
@@ -444,11 +445,14 @@ function keyDown(evt) {
444445
} else if (code === utils.keyCodes.B && evt.ctrlKey) {
445446
// Ctrl-B turns on the printer, so we open a printer output
446447
// window in addition to passing the keypress along to the beeb.
447-
processor.sysvia.keyDown(keyCode(evt), evt.shiftKey);
448+
processor.sysvia.keyDown(code, evt.shiftKey);
448449
evt.preventDefault();
449450
checkPrinterWindow();
451+
} else if (isMac && code === utils.keyCodes.CAPSLOCK) {
452+
handleMacCapsLock();
453+
evt.preventDefault();
450454
} else {
451-
processor.sysvia.keyDown(keyCode(evt), evt.shiftKey);
455+
processor.sysvia.keyDown(code, evt.shiftKey);
452456
evt.preventDefault();
453457
}
454458
}
@@ -461,16 +465,33 @@ function keyUp(evt) {
461465
if (!running) return;
462466
if (evt.altKey) {
463467
const handler = emuKeyHandlers[code];
464-
if (handler) {
465-
handler(false, code);
466-
evt.preventDefault();
467-
}
468+
if (handler) handler(false, code);
468469
} else if (code === utils.keyCodes.F12 || code === utils.keyCodes.BREAK) {
469470
processor.setReset(false);
471+
} else if (isMac && code === utils.keyCodes.CAPSLOCK) {
472+
handleMacCapsLock();
470473
}
471474
evt.preventDefault();
472475
}
473476

477+
function handleMacCapsLock() {
478+
// Mac browsers seem to model caps lock as a physical key that's down when capslock is on, and up when it's off.
479+
// No event is generated when it is physically released on the keyboard. So, we simulate a "tap" here.
480+
processor.sysvia.keyDown(utils.keyCodes.CAPSLOCK);
481+
setTimeout(() => processor.sysvia.keyUp(utils.keyCodes.CAPSLOCK), 100);
482+
if (!window.localStorage.getItem("warnedAboutRubbishMacs")) {
483+
showError(
484+
"handling caps lock on Mac OS X",
485+
"Mac OS X does not generate key up events for caps lock presses. " +
486+
"jsbeeb can only simulate a 'tap' of the caps lock key. This means it doesn't work well for games " +
487+
" that use caps lock for left or fire, as we can't tell if it's being held down. If you need to play " +
488+
"such a game, please see the documentation about remapping keys." +
489+
"Close this window to continue (you won't see this error again)",
490+
);
491+
window.localStorage.setItem("warnedAboutRubbishMacs", true);
492+
}
493+
}
494+
474495
const $discsModal = new bootstrap.Modal(document.getElementById("discs"));
475496
const $fsModal = new bootstrap.Modal(document.getElementById("econetfs"));
476497

0 commit comments

Comments
 (0)