| 
						
					 | 
					 | 
					@ -2,7 +2,8 @@ USING: windows.dinput windows.dinput.constants game-input
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					symbols alien.c-types windows.ole32 namespaces assocs kernel
 | 
					 | 
					 | 
					 | 
					symbols alien.c-types windows.ole32 namespaces assocs kernel
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					arrays hashtables windows.kernel32 windows.com windows.dinput
 | 
					 | 
					 | 
					 | 
					arrays hashtables windows.kernel32 windows.com windows.dinput
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					shuffle windows.user32 windows.messages sequences combinators
 | 
					 | 
					 | 
					 | 
					shuffle windows.user32 windows.messages sequences combinators
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					math.geometry.rect ui.windows accessors math windows ;
 | 
					 | 
					 | 
					 | 
					math.geometry.rect ui.windows accessors math windows
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					alien.strings io.encodings.utf16 ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					IN: game-input.backend.dinput
 | 
					 | 
					 | 
					 | 
					IN: game-input.backend.dinput
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					SINGLETON: dinput-game-input-backend
 | 
					 | 
					 | 
					 | 
					SINGLETON: dinput-game-input-backend
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
					 | 
					 | 
					@ -22,20 +23,29 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +dinput+ get swap f <void*>
 | 
					 | 
					 | 
					 | 
					    +dinput+ get swap f <void*>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ f IDirectInput8W::CreateDevice ole32-error ] keep *void* ;
 | 
					 | 
					 | 
					 | 
					    [ f IDirectInput8W::CreateDevice ole32-error ] keep *void* ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: set-coop-level ( device -- device )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    dup +device-change-window+ get DISCL_BACKGROUND DISCL_NONEXCLUSIVE bitor
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    IDirectInputDevice8W::SetCooperativeLevel ole32-error ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: configure-keyboard ( keyboard -- keyboard )
 | 
					 | 
					 | 
					 | 
					: configure-keyboard ( keyboard -- keyboard )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ;
 | 
					 | 
					 | 
					 | 
					    dup c_dfDIKeyboard_HID IDirectInputDevice8W::SetDataFormat
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ole32-error set-coop-level ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: configure-controller ( controller -- controller )
 | 
					 | 
					 | 
					 | 
					: configure-controller ( controller -- controller )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ;
 | 
					 | 
					 | 
					 | 
					    dup c_dfDIJoystick2 IDirectInputDevice8W::SetDataFormat
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ole32-error set-coop-level ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: find-keyboard ( -- )
 | 
					 | 
					 | 
					 | 
					: find-keyboard ( -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    GUID_SysKeyboard get device-for-guid
 | 
					 | 
					 | 
					 | 
					    GUID_SysKeyboard get device-for-guid
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    configure-keyboard
 | 
					 | 
					 | 
					 | 
					    configure-keyboard
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +keyboard-device+ set-global ;
 | 
					 | 
					 | 
					 | 
					    +keyboard-device+ set-global ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: controller-device? ( device -- ? )
 | 
					 | 
					 | 
					 | 
					: device-info ( device -- DIDEVICEIMAGEINFOW )
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    "DIDEVICEINSTANCEW" <c-object>
 | 
					 | 
					 | 
					 | 
					    "DIDEVICEINSTANCEW" <c-object>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    "DIDEVICEINSTANCEW" heap-size over set-DIDEVICEINSTANCEW-dwSize
 | 
					 | 
					 | 
					 | 
					    "DIDEVICEINSTANCEW" heap-size over set-DIDEVICEINSTANCEW-dwSize
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep
 | 
					 | 
					 | 
					 | 
					    [ IDirectInputDevice8W::GetDeviceInfo ole32-error ] keep ;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: controller-device? ( device -- ? )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    device-info
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    DIDEVICEINSTANCEW-dwDevType GET_DIDEVICE_TYPE
 | 
					 | 
					 | 
					 | 
					    DIDEVICEINSTANCEW-dwDevType GET_DIDEVICE_TYPE
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    DI8DEVTYPE_KEYBOARD DI8DEVTYPE_MOUSE 2array member? not ;
 | 
					 | 
					 | 
					 | 
					    DI8DEVTYPE_KEYBOARD DI8DEVTYPE_MOUSE 2array member? not ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
					 | 
					 | 
					@ -43,15 +53,17 @@ SYMBOLS: +dinput+ +keyboard-device+ +controller-devices+
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +dinput+ get swap IDirectInput8W::GetDeviceStatus
 | 
					 | 
					 | 
					 | 
					    +dinput+ get swap IDirectInput8W::GetDeviceStatus
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ ole32-error ] [ S_OK = ] bi ;
 | 
					 | 
					 | 
					 | 
					    [ ole32-error ] [ S_OK = ] bi ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: <guid> ( memory -- byte-array )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    "GUID" heap-size memory>byte-array ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: add-controller ( guid -- )
 | 
					 | 
					 | 
					 | 
					: add-controller ( guid -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ device-for-guid configure-controller ]
 | 
					 | 
					 | 
					 | 
					    [ device-for-guid configure-controller ] [ <guid> ] bi
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ "GUID" heap-size memory>byte-array ] bi
 | 
					 | 
					 | 
					 | 
					    over controller-device?
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ +controller-devices+ get set-at ]
 | 
					 | 
					 | 
					 | 
					    [ +controller-devices+ get set-at ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ drop com-release ] if ;
 | 
					 | 
					 | 
					 | 
					    [ drop com-release ] if ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: remove-controller ( guid -- )
 | 
					 | 
					 | 
					 | 
					: remove-controller ( guid -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    "GUID" heap-size memory>byte-array
 | 
					 | 
					 | 
					 | 
					    <guid> +controller-devices+ get [ com-release f ] change-at ;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +controller-devices+ get [ com-release f ] change-at ;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: find-controller-callback ( -- alien )
 | 
					 | 
					 | 
					 | 
					: find-controller-callback ( -- alien )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ ! ( lpddi pvRef -- ? )
 | 
					 | 
					 | 
					 | 
					    [ ! ( lpddi pvRef -- ? )
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
					 | 
					 | 
					@ -124,12 +136,11 @@ TUPLE: window-rect < rect window-loc ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ DestroyWindow win32-error=0/f f ] change-at ;
 | 
					 | 
					 | 
					 | 
					    [ DestroyWindow win32-error=0/f f ] change-at ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: add-wm-devicechange ( -- )
 | 
					 | 
					 | 
					 | 
					: add-wm-devicechange ( -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    create-device-change-window
 | 
					 | 
					 | 
					 | 
					    [ 4dup handle-wm-devicechange DefWindowProc ]
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    [ 4dup handle-wm-devicechange DefWindowProc ] WM_DEVICECHANGE add-wm-handler ;
 | 
					 | 
					 | 
					 | 
					    WM_DEVICECHANGE add-wm-handler ;
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: remove-wm-devicechange ( -- )
 | 
					 | 
					 | 
					 | 
					: remove-wm-devicechange ( -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    WM_DEVICECHANGE wm-handlers get-global delete-at
 | 
					 | 
					 | 
					 | 
					    WM_DEVICECHANGE wm-handlers get-global delete-at ;
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    close-device-change-window ;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: release-controllers ( -- )
 | 
					 | 
					 | 
					 | 
					: release-controllers ( -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +controller-devices+ global [
 | 
					 | 
					 | 
					 | 
					    +controller-devices+ global [
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
					 | 
					 | 
					@ -137,15 +148,80 @@ TUPLE: window-rect < rect window-loc ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] change-at ;
 | 
					 | 
					 | 
					 | 
					    ] change-at ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					: release-keyboard ( -- )
 | 
					 | 
					 | 
					 | 
					: release-keyboard ( -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    +keyboard-device+ global [ com-release f ] change-at ;
 | 
					 | 
					 | 
					 | 
					    +keyboard-device+ global
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    [ com-release f ] change-at ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					M: dinput-game-input-backend open-game-input
 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend open-game-input
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    create-dinput
 | 
					 | 
					 | 
					 | 
					    create-dinput
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    create-device-change-window
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    find-keyboard
 | 
					 | 
					 | 
					 | 
					    find-keyboard
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    find-controllers ;
 | 
					 | 
					 | 
					 | 
					    find-controllers
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    add-wm-devicechange ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					M: dinput-game-input-backend close-game-input
 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend close-game-input
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    remove-wm-devicechange
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    release-controllers
 | 
					 | 
					 | 
					 | 
					    release-controllers
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    release-keyboard
 | 
					 | 
					 | 
					 | 
					    release-keyboard
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    close-device-change-window
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    delete-dinput ;
 | 
					 | 
					 | 
					 | 
					    delete-dinput ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend get-controllers
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    +controller-devices+ get
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    [ nip controller boa ] { } assoc>map ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend product-string
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    handle>> device-info DIDEVICEINSTANCEW-tszProductName
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    utf16le alien>string ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend product-id
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    handle>> device-info DIDEVICEINSTANCEW-guidProduct <guid> ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend instance-id
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    handle>> device-info DIDEVICEINSTANCEW-guidInstance <guid> ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: with-acquisition ( device quot -- )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    over IDirectInputDevice8W::Acquire ole32-error
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    over [ IDirectInputDevice8W::Unacquire ole32-error ] curry
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    [ ] cleanup ; inline
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: >axis ( long -- float )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: >slider ( long -- float )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: >pov ( long -- float )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: >buttons ( alien -- array )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    128 memory>byte-array [ HEX: 80 bitand c-bool> ] { } map-as ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: <controller-state> ( DIJOYSTATE2 -- controller-state )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ! XXX only transfer elements that are present on device
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lX >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lY >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lZ >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lRx >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lRy >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-lRz >axis ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-rglSlider *long >slider ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-rgdwPOV *uint >pov ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        [ DIJOYSTATE2-rgbButtons >buttons ]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    } cleave controller-state boa ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: <keyboard-state> ( byte-array -- keyboard-state )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    [ c-bool> ] { } map-as keyboard-state boa ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					: get-device-state ( device state-size -- byte-array )
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    dup <byte-array>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    [ IDirectInputDevice8W::GetDeviceState ole32-error ] keep ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend read-controller
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    handle>> [
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        "DIJOYSTATE2" heap-size get-device-state
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ] with-acquisition <controller-state> ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend calibrate-controller
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    handle>> f 0 IDirectInputDevice8W::RunControlPanel ole32-error ;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					M: dinput-game-input-backend read-keyboard
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    +keyboard-device+ get [ 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        256 get-device-state
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    ] with-acquisition <keyboard-state> ;
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						 
						
						
						
						 
					 | 
					 | 
					
 
 |