diff --git a/basis/game/input/linux/linux.factor b/basis/game/input/linux/linux.factor index 0d451e96f0..07889c8298 100644 --- a/basis/game/input/linux/linux.factor +++ b/basis/game/input/linux/linux.factor @@ -1,8 +1,12 @@ ! Copyright (C) 2010 Erik Charlebois. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel game.input namespaces classes bit-arrays vectors ; +USING: alien.c-types alien.syntax arrays kernel game.input namespaces +classes bit-arrays sequences vectors x11 x11.xlib ; IN: game.input.linux +LIBRARY: xlib +FUNCTION: int XQueryKeymap ( Display* display, char[32] keys_return ) ; + SINGLETON: linux-game-input-backend linux-game-input-backend game-input-backend set-global @@ -36,9 +40,51 @@ M: linux-game-input-backend calibrate-controller M: linux-game-input-backend vibrate-controller 3drop ; + +CONSTANT: x>hid-bit-order { + +0 0 0 0 0 0 0 0 +0 41 30 31 32 33 34 35 +36 37 38 39 45 46 42 43 +20 26 8 21 23 28 24 12 +18 19 47 48 40 224 4 22 +7 9 10 11 13 14 15 51 +52 53 225 49 29 27 6 25 +5 17 16 54 55 56 229 85 +226 44 57 58 59 60 61 62 +63 64 65 66 67 83 71 95 +96 97 86 92 93 94 87 91 +90 89 98 99 0 0 0 68 +69 0 0 0 0 0 0 0 +88 228 84 70 0 0 74 82 +75 80 79 77 81 78 73 76 +127 129 128 102 103 0 72 0 +0 0 0 227 231 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 +} +: x-bits>hid-bits ( bit-array -- bit-array ) + 256 iota [ 2array ] { } 2map-as [ first ] filter [ second ] map + x>hid-bit-order [ nth ] curry map + 256 swap [ t swap pick set-nth ] each ; + M: linux-game-input-backend read-keyboard - 256 keyboard-state boa ; + dpy get 256 [ XQueryKeymap drop ] keep + x-bits>hid-bits keyboard-state boa ; M: linux-game-input-backend read-mouse 0 0 0 0 2 mouse-state boa ;