]> gitweb.factorcode.org Git - factor.git/blob - basis/game/input/gtk/gtk.factor
56f6be182b85523cfc7bfe35cc2a72ecf442d72f
[factor.git] / basis / game / input / gtk / gtk.factor
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 arrays
4 assocs bit-arrays destructors game.input gdk.ffi
5 io.encodings.binary io.files kernel linux.input-events
6 linux.input-events.ffi math namespaces sequences
7 system unix.ffi x11.xlib ;
8 IN: game.input.gtk
9
10 SINGLETON: gtk-game-input-backend
11
12 gtk-game-input-backend game-input-backend set-global
13
14 LIBRARY: gdk
15 FUNCTION: Display* gdk_x11_display_get_xdisplay ( GdkDisplay* display )
16
17 TUPLE: linux-controller < controller path meta state thread fd buttons quit? ;
18 : <linux-controller> ( path -- controller )
19     linux-controller new
20         swap >>path
21         dup path>> get-event-device-info >>meta
22         dup meta>> "path" of binary <file-reader> handle>> fd>> >>fd
23         H{ } clone >>state
24         dup meta>> "capabilities" of EV_KEY of keys seq>explode-positions >>buttons ; inline
25         ! swap over state>> '[ _ _ read-events ] in-thread ;
26
27 M: linux-controller dispose* fd>> close drop ;
28
29 TUPLE: linux-controller-state < controller-state abs ;
30
31 : get-dpy ( -- dpy )
32     gdk_display_get_default [ gdk_x11_display_get_xdisplay ] [
33         "No default display." throw
34     ] if* ;
35
36 M: gtk-game-input-backend (open-game-input)
37     reset-mouse ;
38
39 M: gtk-game-input-backend (close-game-input)
40     ;
41
42 M: gtk-game-input-backend (reset-game-input)
43     ;
44
45 M: gtk-game-input-backend get-controllers
46     get-input-events-joysticks values [ <linux-controller> ] map ;
47
48 M: gtk-game-input-backend product-string
49     meta>> "name" of ;
50
51 M: gtk-game-input-backend product-id
52     meta>> "id" of ;
53
54 M: gtk-game-input-backend instance-id
55     drop f ;
56
57 M: gtk-game-input-backend read-controller
58     [ linux-controller-state new ] dip
59     [ fd>> ] [ meta>> ] bi
60     [ drop evdev-get-key seq>explode-positions [ <INPUT_KEY> ] zip-with >>buttons ]
61     [ "capabilities" of EV_ABS of [ [ first first evdev-get-abs ] [ first ] bi swap 2array ] with map >>abs ] 2bi ;
62
63 M: gtk-game-input-backend calibrate-controller
64     drop ;
65
66 M: gtk-game-input-backend vibrate-controller
67     3drop ;
68
69 HOOK: x>hid-bit-order os ( -- x )
70
71 M: linux x>hid-bit-order
72     {
73         0 0 0 0 0 0 0 0
74         0 41 30 31 32 33 34 35
75         36 37 38 39 45 46 42 43
76         20 26 8 21 23 28 24 12
77         18 19 47 48 40 224 4 22
78         7 9 10 11 13 14 15 51
79         52 53 225 49 29 27 6 25
80         5 17 16 54 55 56 229 85
81         226 44 57 58 59 60 61 62
82         63 64 65 66 67 83 71 95
83         96 97 86 92 93 94 87 91
84         90 89 98 99 0 0 0 68
85         69 0 0 0 0 0 0 0
86         88 228 84 70 0 0 74 82
87         75 80 79 77 81 78 73 76
88         127 129 128 102 103 0 72 0
89         0 0 0 227 231 0 0 0
90         0 0 0 0 0 0 0 0
91         0 0 0 0 0 0 0 0
92         0 0 0 0 0 0 0 0
93         0 0 0 0 0 0 0 0
94         0 0 0 0 0 0 0 0
95         0 0 0 0 0 0 0 0
96         0 0 0 0 0 0 0 0
97         0 0 0 0 0 0 0 0
98         0 0 0 0 0 0 0 0
99         0 0 0 0 0 0 0 0
100         0 0 0 0 0 0 0 0
101         0 0 0 0 0 0 0 0
102         0 0 0 0 0 0 0 0
103         0 0 0 0 0 0 0 0
104         0 0 0 0 0 0 0 0
105     } ; inline
106
107 : x-bits>hid-bits ( bit-array -- bit-array )
108     256 <iota> zip [ first ] filter values
109     x>hid-bit-order [ nth ] curry map
110     256 <bit-array> swap [ t swap pick set-nth ] each ;
111
112 M: gtk-game-input-backend read-keyboard
113     get-dpy 256 <bit-array> [ XQueryKeymap drop ] keep
114     x-bits>hid-bits keyboard-state boa ;
115
116 : query-pointer ( -- x y buttons )
117     get-dpy dup XDefaultRootWindow
118     { int int int int int int int }
119     [ XQueryPointer drop ] with-out-parameters
120     [ 4drop ] 3dip ;
121
122 M: gtk-game-input-backend read-mouse
123     query-pointer
124     mouse-state new
125     swap 256 /i >>buttons
126     swap 400 - >>dy
127     swap 400 - >>dx
128     0 >>scroll-dy 0 >>scroll-dx ;
129
130 M: gtk-game-input-backend reset-mouse
131     get-dpy dup XDefaultRootWindow dup
132     0 0 0 0 400 400 XWarpPointer drop ;