1 ! Copyright (C) 2010 Erik Charlebois, William Schlieper.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.data alien.syntax assocs
4 bit-arrays game.input gdk.ffi generalizations kernel math
5 namespaces sequences system x11.xlib ;
8 SINGLETON: gtk-game-input-backend
10 gtk-game-input-backend game-input-backend set-global
13 FUNCTION: Display* gdk_x11_display_get_xdisplay ( GdkDisplay* display )
16 gdk_display_get_default [ gdk_x11_display_get_xdisplay ] [
17 "No default display." throw
20 M: gtk-game-input-backend (open-game-input)
23 M: gtk-game-input-backend (close-game-input)
26 M: gtk-game-input-backend (reset-game-input)
29 M: gtk-game-input-backend get-controllers
32 M: gtk-game-input-backend product-string
35 M: gtk-game-input-backend product-id
38 M: gtk-game-input-backend instance-id
41 M: gtk-game-input-backend read-controller
42 drop controller-state new ;
44 M: gtk-game-input-backend calibrate-controller
47 M: gtk-game-input-backend vibrate-controller
50 HOOK: x>hid-bit-order os ( -- x )
52 M: linux x>hid-bit-order
55 0 41 30 31 32 33 34 35
56 36 37 38 39 45 46 42 43
57 20 26 8 21 23 28 24 12
58 18 19 47 48 40 224 4 22
60 52 53 225 49 29 27 6 25
61 5 17 16 54 55 56 229 85
62 226 44 57 58 59 60 61 62
63 63 64 65 66 67 83 71 95
64 96 97 86 92 93 94 87 91
67 88 228 84 70 0 0 74 82
68 75 80 79 77 81 78 73 76
69 127 129 128 102 103 0 72 0
88 : x-bits>hid-bits ( bit-array -- bit-array )
89 256 <iota> zip [ first ] filter values
90 x>hid-bit-order [ nth ] curry map
91 256 <bit-array> swap [ t swap pick set-nth ] each ;
93 M: gtk-game-input-backend read-keyboard
94 get-dpy 256 <bit-array> [ XQueryKeymap drop ] keep
95 x-bits>hid-bits keyboard-state boa ;
97 : query-pointer ( -- x y buttons )
98 get-dpy dup XDefaultRootWindow
99 { int int int int int int int }
100 [ XQueryPointer drop ] with-out-parameters
103 M: gtk-game-input-backend read-mouse
106 swap 256 /i >>buttons
109 0 >>scroll-dy 0 >>scroll-dx ;
111 M: gtk-game-input-backend reset-mouse
112 get-dpy dup XDefaultRootWindow dup
113 0 0 0 0 400 400 XWarpPointer drop ;