1 USING: game-input game-input.scancodes
2 kernel ui.gadgets ui.gadgets.buttons sequences accessors
3 words arrays assocs math calendar fry alarms ui
4 ui.gadgets.borders ui.gestures ;
8 { key-escape { { 0 0 } { 10 10 } } }
10 { key-f1 { { 20 0 } { 10 10 } } }
11 { key-f2 { { 30 0 } { 10 10 } } }
12 { key-f3 { { 40 0 } { 10 10 } } }
13 { key-f4 { { 50 0 } { 10 10 } } }
15 { key-f5 { { 65 0 } { 10 10 } } }
16 { key-f6 { { 75 0 } { 10 10 } } }
17 { key-f7 { { 85 0 } { 10 10 } } }
18 { key-f8 { { 95 0 } { 10 10 } } }
20 { key-f9 { { 110 0 } { 10 10 } } }
21 { key-f10 { { 120 0 } { 10 10 } } }
22 { key-f11 { { 130 0 } { 10 10 } } }
23 { key-f12 { { 140 0 } { 10 10 } } }
26 { key-` { { 0 15 } { 10 10 } } }
27 { key-1 { { 10 15 } { 10 10 } } }
28 { key-2 { { 20 15 } { 10 10 } } }
29 { key-3 { { 30 15 } { 10 10 } } }
30 { key-4 { { 40 15 } { 10 10 } } }
31 { key-5 { { 50 15 } { 10 10 } } }
32 { key-6 { { 60 15 } { 10 10 } } }
33 { key-7 { { 70 15 } { 10 10 } } }
34 { key-8 { { 80 15 } { 10 10 } } }
35 { key-9 { { 90 15 } { 10 10 } } }
36 { key-0 { { 100 15 } { 10 10 } } }
37 { key-- { { 110 15 } { 10 10 } } }
38 { key-= { { 120 15 } { 10 10 } } }
39 { key-backspace { { 130 15 } { 20 10 } } }
41 { key-tab { { 0 25 } { 15 10 } } }
42 { key-q { { 15 25 } { 10 10 } } }
43 { key-w { { 25 25 } { 10 10 } } }
44 { key-e { { 35 25 } { 10 10 } } }
45 { key-r { { 45 25 } { 10 10 } } }
46 { key-t { { 55 25 } { 10 10 } } }
47 { key-y { { 65 25 } { 10 10 } } }
48 { key-u { { 75 25 } { 10 10 } } }
49 { key-i { { 85 25 } { 10 10 } } }
50 { key-o { { 95 25 } { 10 10 } } }
51 { key-p { { 105 25 } { 10 10 } } }
52 { key-[ { { 115 25 } { 10 10 } } }
53 { key-] { { 125 25 } { 10 10 } } }
54 { key-\ { { 135 25 } { 15 10 } } }
56 { key-caps-lock { { 0 35 } { 20 10 } } }
57 { key-a { { 20 35 } { 10 10 } } }
58 { key-s { { 30 35 } { 10 10 } } }
59 { key-d { { 40 35 } { 10 10 } } }
60 { key-f { { 50 35 } { 10 10 } } }
61 { key-g { { 60 35 } { 10 10 } } }
62 { key-h { { 70 35 } { 10 10 } } }
63 { key-j { { 80 35 } { 10 10 } } }
64 { key-k { { 90 35 } { 10 10 } } }
65 { key-l { { 100 35 } { 10 10 } } }
66 { key-; { { 110 35 } { 10 10 } } }
67 { key-' { { 120 35 } { 10 10 } } }
68 { key-return { { 130 35 } { 20 10 } } }
70 { key-left-shift { { 0 45 } { 25 10 } } }
71 { key-z { { 25 45 } { 10 10 } } }
72 { key-x { { 35 45 } { 10 10 } } }
73 { key-c { { 45 45 } { 10 10 } } }
74 { key-v { { 55 45 } { 10 10 } } }
75 { key-b { { 65 45 } { 10 10 } } }
76 { key-n { { 75 45 } { 10 10 } } }
77 { key-m { { 85 45 } { 10 10 } } }
78 { key-, { { 95 45 } { 10 10 } } }
79 { key-. { { 105 45 } { 10 10 } } }
80 { key-/ { { 115 45 } { 10 10 } } }
81 { key-right-shift { { 125 45 } { 25 10 } } }
83 { key-left-control { { 0 55 } { 15 10 } } }
84 { key-left-gui { { 15 55 } { 15 10 } } }
85 { key-left-alt { { 30 55 } { 15 10 } } }
86 { key-space { { 45 55 } { 45 10 } } }
87 { key-right-alt { { 90 55 } { 15 10 } } }
88 { key-right-gui { { 105 55 } { 15 10 } } }
89 { key-application { { 120 55 } { 15 10 } } }
90 { key-right-control { { 135 55 } { 15 10 } } }
93 { key-print-screen { { 155 0 } { 10 10 } } }
94 { key-scroll-lock { { 165 0 } { 10 10 } } }
95 { key-pause { { 175 0 } { 10 10 } } }
97 { key-insert { { 155 15 } { 10 10 } } }
98 { key-home { { 165 15 } { 10 10 } } }
99 { key-page-up { { 175 15 } { 10 10 } } }
101 { key-delete { { 155 25 } { 10 10 } } }
102 { key-end { { 165 25 } { 10 10 } } }
103 { key-page-down { { 175 25 } { 10 10 } } }
105 { key-up-arrow { { 165 45 } { 10 10 } } }
106 { key-left-arrow { { 155 55 } { 10 10 } } }
107 { key-down-arrow { { 165 55 } { 10 10 } } }
108 { key-right-arrow { { 175 55 } { 10 10 } } }
111 { key-keypad-numlock { { 190 15 } { 10 10 } } }
112 { key-keypad-/ { { 200 15 } { 10 10 } } }
113 { key-keypad-* { { 210 15 } { 10 10 } } }
114 { key-keypad-- { { 220 15 } { 10 10 } } }
116 { key-keypad-7 { { 190 25 } { 10 10 } } }
117 { key-keypad-8 { { 200 25 } { 10 10 } } }
118 { key-keypad-9 { { 210 25 } { 10 10 } } }
119 { key-keypad-+ { { 220 25 } { 10 20 } } }
121 { key-keypad-4 { { 190 35 } { 10 10 } } }
122 { key-keypad-5 { { 200 35 } { 10 10 } } }
123 { key-keypad-6 { { 210 35 } { 10 10 } } }
125 { key-keypad-1 { { 190 45 } { 10 10 } } }
126 { key-keypad-2 { { 200 45 } { 10 10 } } }
127 { key-keypad-3 { { 210 45 } { 10 10 } } }
128 { key-keypad-enter { { 220 45 } { 10 20 } } }
130 { key-keypad-0 { { 190 55 } { 20 10 } } }
131 { key-keypad-. { { 210 55 } { 10 10 } } }
134 : KEYBOARD-SIZE { 230 65 } ;
135 : FREQUENCY ( -- f ) 30 recip seconds ;
137 TUPLE: key-caps-gadget < gadget keys alarm ;
139 : make-key-gadget ( scancode dim array -- )
142 " " [ drop ] <bevel-button>
143 swap [ first >>loc ] [ second >>dim ] bi
147 : add-keys-gadgets ( gadget -- gadget )
148 key-locations 256 f <array>
149 [ [ make-key-gadget ] curry assoc-each ]
150 [ [ [ add-gadget ] when* ] each ]
153 : <key-caps-gadget> ( -- gadget )
154 key-caps-gadget new-gadget
157 M: key-caps-gadget pref-dim* drop KEYBOARD-SIZE ;
159 : update-key-caps-state ( gadget -- )
160 read-keyboard keys>> over keys>>
161 [ [ (>>selected?) ] [ drop ] if* ] 2each
164 M: key-caps-gadget graft*
165 dup '[ _ update-key-caps-state ] FREQUENCY every >>alarm
168 M: key-caps-gadget ungraft*
169 alarm>> [ cancel-alarm ] when* ;
171 M: key-caps-gadget handle-gesture
172 drop [ key-down? ] [ key-up? ] bi or not ;
177 <key-caps-gadget> 5 <border> "Key Caps" open-window