Update Unicode docs
[factor/jcg.git] / extra / key-caps / key-caps.factor
blob05edb205d2e04c495b2998e2a3a1863e5487abfd
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 ;
5 IN: key-caps
7 : key-locations H{
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 } } }
96     
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 } } }
132 } ;
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 -- )
140     [ 
141         swap [ 
142             " " [ drop ] <bevel-button>
143             swap [ first >>loc ] [ second >>dim ] bi
144         ] [ execute ] bi*
145     ] dip set-nth ;
147 : add-keys-gadgets ( gadget -- gadget )
148     key-locations 256 f <array>
149     [ [ make-key-gadget ] curry assoc-each ]
150     [ [ [ add-gadget ] when* ] each ] 
151     [ >>keys ] tri ;
153 : <key-caps-gadget> ( -- gadget )
154     key-caps-gadget new-gadget
155     add-keys-gadgets ;
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 
162     relayout-1 ;
164 M: key-caps-gadget graft*
165     dup '[ _ update-key-caps-state ] FREQUENCY every >>alarm
166     drop ;
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 ;
174 : key-caps ( -- )
175     [
176         open-game-input
177         <key-caps-gadget> 5 <border> "Key Caps" open-window
178     ] with-ui ;
180 MAIN: key-caps