@@ -65,6 +65,7 @@ let audioFilterFreq = 7000;
65
65
let audioFilterQ = 5 ;
66
66
let stationId = 101 ;
67
67
let econet = null ;
68
+ const isMac = window . navigator . platform . indexOf ( "Mac" ) === 0 ;
68
69
69
70
if ( queryString ) {
70
71
if ( queryString [ queryString . length - 1 ] === "/" )
@@ -444,11 +445,14 @@ function keyDown(evt) {
444
445
} else if ( code === utils . keyCodes . B && evt . ctrlKey ) {
445
446
// Ctrl-B turns on the printer, so we open a printer output
446
447
// 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 ) ;
448
449
evt . preventDefault ( ) ;
449
450
checkPrinterWindow ( ) ;
451
+ } else if ( isMac && code === utils . keyCodes . CAPSLOCK ) {
452
+ handleMacCapsLock ( ) ;
453
+ evt . preventDefault ( ) ;
450
454
} else {
451
- processor . sysvia . keyDown ( keyCode ( evt ) , evt . shiftKey ) ;
455
+ processor . sysvia . keyDown ( code , evt . shiftKey ) ;
452
456
evt . preventDefault ( ) ;
453
457
}
454
458
}
@@ -461,16 +465,33 @@ function keyUp(evt) {
461
465
if ( ! running ) return ;
462
466
if ( evt . altKey ) {
463
467
const handler = emuKeyHandlers [ code ] ;
464
- if ( handler ) {
465
- handler ( false , code ) ;
466
- evt . preventDefault ( ) ;
467
- }
468
+ if ( handler ) handler ( false , code ) ;
468
469
} else if ( code === utils . keyCodes . F12 || code === utils . keyCodes . BREAK ) {
469
470
processor . setReset ( false ) ;
471
+ } else if ( isMac && code === utils . keyCodes . CAPSLOCK ) {
472
+ handleMacCapsLock ( ) ;
470
473
}
471
474
evt . preventDefault ( ) ;
472
475
}
473
476
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
+
474
495
const $discsModal = new bootstrap . Modal ( document . getElementById ( "discs" ) ) ;
475
496
const $fsModal = new bootstrap . Modal ( document . getElementById ( "econetfs" ) ) ;
476
497
0 commit comments