@@ -14,6 +14,7 @@ import {
1414 emulatorUsesCDROMDrive ,
1515 emulatorUsesPrefs ,
1616 emulatorUsesArgs ,
17+ emulatorNeedsPointerLock ,
1718} from "./emulator-common-emulators" ;
1819import { getEmulatorWasmPath } from "./emulator-ui-emulators" ;
1920import Worker from "./emulator-worker?worker" ;
@@ -153,6 +154,8 @@ export class Emulator {
153154 // some edge cases.
154155 #downKeyCodes = new Set < string > ( ) ;
155156
157+ #requestedPointerLock = false ;
158+
156159 constructor ( config : EmulatorConfig , delegate ?: EmulatorDelegate ) {
157160 console . time ( "Emulator first blit" ) ;
158161 console . time ( "Emulator quiescent" ) ;
@@ -253,6 +256,10 @@ export class Emulator {
253256 "visibilitychange" ,
254257 this . #handleVisibilityChange
255258 ) ;
259+ document . addEventListener (
260+ "pointerlockchange" ,
261+ this . #handlePointerLockChange
262+ ) ;
256263
257264 await this . #startWorker( ) ;
258265 }
@@ -383,6 +390,10 @@ export class Emulator {
383390 "visibilitychange" ,
384391 this . #handleVisibilityChange
385392 ) ;
393+ document . addEventListener (
394+ "pointerlockchange" ,
395+ this . #handlePointerLockChange
396+ ) ;
386397
387398 this . #input. handleInput ( { type : "stop" } ) ;
388399 this . #ethernetPinger. stop ( ) ;
@@ -444,6 +455,21 @@ export class Emulator {
444455
445456 #handleMouseDown = ( event : MouseEvent ) => {
446457 this . #input. handleInput ( { type : "mousedown" } ) ;
458+ if (
459+ emulatorNeedsPointerLock ( this . #config. machine . emulatorType ) &&
460+ ! this . #requestedPointerLock
461+ ) {
462+ this . #config. screenCanvas . requestPointerLock ( {
463+ unadjustedMovement : true ,
464+ } ) ;
465+ this . #requestedPointerLock = true ;
466+ }
467+ } ;
468+
469+ #handlePointerLockChange = ( event : Event ) : void => {
470+ if ( ! document . pointerLockElement ) {
471+ this . #requestedPointerLock = false ;
472+ }
447473 } ;
448474
449475 #handleMouseUp = ( event : MouseEvent ) => {
0 commit comments