1 USING: arrays accessors continuations kernel math system
2 sequences namespaces init vocabs vocabs.loader combinators ;
5 SYMBOLS: game-input-backend game-input-opened ;
7 game-input-opened [ 0 ] initialize
9 HOOK: (open-game-input) game-input-backend ( -- )
10 HOOK: (close-game-input) game-input-backend ( -- )
11 HOOK: (reset-game-input) game-input-backend ( -- )
13 HOOK: get-controllers game-input-backend ( -- sequence )
15 HOOK: product-string game-input-backend ( controller -- string )
16 HOOK: product-id game-input-backend ( controller -- id )
17 HOOK: instance-id game-input-backend ( controller -- id )
19 HOOK: read-controller game-input-backend ( controller -- controller-state )
20 HOOK: calibrate-controller game-input-backend ( controller -- )
22 HOOK: read-keyboard game-input-backend ( -- keyboard-state )
24 HOOK: read-mouse game-input-backend ( -- mouse-state )
26 HOOK: reset-mouse game-input-backend ( -- )
28 : game-input-opened? ( -- ? )
29 game-input-opened get zero? not ;
33 M: f (reset-game-input) ;
35 : reset-game-input ( -- )
38 [ reset-game-input ] "game-input" add-init-hook
42 ERROR: game-input-not-open ;
44 : open-game-input ( -- )
48 game-input-opened [ 1 + ] change-global
50 : close-game-input ( -- )
52 dup zero? [ game-input-not-open ] when
60 : with-game-input ( quot -- )
61 open-game-input [ close-game-input ] [ ] cleanup ; inline
63 TUPLE: controller handle ;
64 TUPLE: controller-state x y z rx ry rz slider pov buttons ;
66 M: controller-state clone
67 call-next-method dup buttons>> clone >>buttons ;
71 pov-up pov-up-right pov-right pov-down-right
72 pov-down pov-down-left pov-left pov-up-left ;
74 : find-controller-products ( product-id -- sequence )
75 get-controllers [ product-id = ] with filter ;
76 : find-controller-instance ( product-id instance-id -- controller/f )
80 [ instance-id = ] 2bi* and
81 ] with with find nip ;
83 TUPLE: keyboard-state keys ;
85 M: keyboard-state clone
86 call-next-method dup keys>> clone >>keys ;
88 TUPLE: mouse-state dx dy scroll-dx scroll-dy buttons ;
91 call-next-method dup buttons>> clone >>buttons ;
94 { [ os windows? ] [ "game-input.dinput" require ] }
95 { [ os macosx? ] [ "game-input.iokit" require ] }