44//
55// Copyright 2022 Oxide Computer Company
66
7- use Keysym :: * ;
7+ use anyhow:: anyhow;
8+ pub use ascii:: AsciiChar ;
9+ use ascii:: ToAsciiChar ;
10+ use KeySym :: * ;
811
9- #[ derive( Debug ) ]
10- pub enum Keysym {
11- Unknown ( u32 ) ,
12- Utf32 ( char ) ,
12+ // ascii characters have the same values as their keysym
13+ const ASCII_MAX : u32 = 0x7f ;
14+
15+ const KEYSYM_BACKSPACE : u32 = 0xff08 ;
16+ const KEYSYM_TAB : u32 = 0xff09 ;
17+ const KEYSYM_RETURN_ENTER : u32 = 0xff0d ;
18+ const KEYSYM_ESCAPE : u32 = 0xff1b ;
19+ const KEYSYM_INSERT : u32 = 0xff63 ;
20+ const KEYSYM_DELETE : u32 = 0xffff ;
21+ const KEYSYM_HOME : u32 = 0xff50 ;
22+ const KEYSYM_END : u32 = 0xff57 ;
23+ const KEYSYM_PAGE_UP : u32 = 0xff55 ;
24+ const KEYSYM_PAGE_DOWN : u32 = 0xff56 ;
25+ const KEYSYM_PRINT : u32 = 0xff61 ;
26+ const KEYSYM_PAUSE : u32 = 0xff13 ;
27+ const KEYSYM_CAPS_LOCK : u32 = 0xffe5 ;
28+ const KEYSYM_SUPER_LEFT : u32 = 0xffeb ;
29+ const KEYSYM_SUPER_RIGHT : u32 = 0xffec ;
30+ const KEYSYM_MENU : u32 = 0xff67 ;
31+
32+ const KEYSYM_LEFT : u32 = 0xff51 ;
33+ const KEYSYM_UP : u32 = 0xff52 ;
34+ const KEYSYM_RIGHT : u32 = 0xff53 ;
35+ const KEYSYM_DOWN : u32 = 0xff54 ;
36+ // function keys are in the range: 0xffbe to 0xffc9, in order
37+ const KEYSYM_F1 : u32 = 0xffbe ;
38+ const KEYSYM_F12 : u32 = 0xffc9 ;
39+ const KEYSYM_SHIFT_LEFT : u32 = 0xffe1 ;
40+ const KEYSYM_SHIFT_RIGHT : u32 = 0xffe2 ;
41+ const KEYSYM_CTRL_LEFT : u32 = 0xffe3 ;
42+ const KEYSYM_CTRL_RIGHT : u32 = 0xffe4 ;
43+
44+ // XXX(JPH): do we need to support meta keys?
45+
46+ const KEYSYM_ALT_LEFT : u32 = 0xffe9 ;
47+ const KEYSYM_ALT_RIGHT : u32 = 0xffea ;
48+ const KEYSYM_SCROLL_LOCK : u32 = 0xff14 ;
49+ const KEYSYM_NUM_LOCK : u32 = 0xff7f ;
50+
51+ const KEYSYM_KP_ENTER : u32 = 0xff8d ;
52+ const KEYSYM_KP_SLASH : u32 = 0xffaf ;
53+ const KEYSYM_KP_ASTERISK : u32 = 0xffaa ;
54+ const KEYSYM_KP_MINUS : u32 = 0xffad ;
55+ const KEYSYM_KP_PLUS : u32 = 0xffab ;
56+ const KEYSYM_KP_7 : u32 = 0xffb7 ;
57+ const KEYSYM_KP_HOME : u32 = 0xff95 ;
58+ const KEYSYM_KP_8 : u32 = 0xffb8 ;
59+ const KEYSYM_KP_UP : u32 = 0xff97 ;
60+ const KEYSYM_KP_9 : u32 = 0xffb9 ;
61+ const KEYSYM_KP_PGUP : u32 = 0xff9a ;
62+ const KEYSYM_KP_4 : u32 = 0xffb4 ;
63+ const KEYSYM_KP_LEFT : u32 = 0xff96 ;
64+ const KEYSYM_KP_5 : u32 = 0xffb5 ;
65+ const KEYSYM_KP_EMPTY : u32 = 0xff9d ;
66+ const KEYSYM_KP_6 : u32 = 0xffb6 ;
67+ const KEYSYM_KP_RIGHT : u32 = 0xff98 ;
68+ const KEYSYM_KP_1 : u32 = 0xffb1 ;
69+ const KEYSYM_KP_END : u32 = 0xff9c ;
70+ const KEYSYM_KP_2 : u32 = 0xffb2 ;
71+ const KEYSYM_KP_DOWN : u32 = 0xff99 ;
72+ const KEYSYM_KP_3 : u32 = 0xffb3 ;
73+ const KEYSYM_KP_PGDOWN : u32 = 0xff9b ;
74+ const KEYSYM_KP_0 : u32 = 0xffb0 ;
75+ const KEYSYM_KP_INSERT : u32 = 0xff9e ;
76+ const KEYSYM_KP_PERIOD : u32 = 0xffae ;
77+ const KEYSYM_KP_DELETE : u32 = 0xff9f ;
78+
79+ #[ derive( Debug , Copy , Clone ) ]
80+ pub enum KeySym {
81+ Ascii ( ascii:: AsciiChar ) ,
1382 Backspace ,
1483 Tab ,
1584 ReturnOrEnter ,
@@ -20,66 +89,142 @@ pub enum Keysym {
2089 End ,
2190 PageUp ,
2291 PageDown ,
92+ Print ,
93+ Pause ,
94+ CapsLock ,
95+
96+ // "super" = windows/command key
97+ SuperLeft ,
98+ SuperRight ,
99+
100+ // usb-only
101+ Menu ,
102+
23103 Left ,
24104 Up ,
25105 Right ,
26106 Down ,
107+
27108 FunctionKey ( u8 ) ,
109+
28110 ShiftLeft ,
29111 ShiftRight ,
30112 ControlLeft ,
31113 ControlRight ,
32- MetaLeft ,
33- MetaRight ,
34114 AltLeft ,
35115 AltRight ,
116+ ScrollLock ,
117+
118+ // Number Keypad
119+ NumLock ,
120+ KeypadSlash ,
121+ KeypadAsterisk ,
122+ KeypadMinus ,
123+ KeypadPlus ,
124+ KeypadEnter ,
125+ KeypadPeriod ,
126+ KeypadDelete ,
127+ Keypad0 ,
128+ KeypadInsert ,
129+ Keypad1 ,
130+ KeypadEnd ,
131+ Keypad2 ,
132+ KeypadDown ,
133+ Keypad3 ,
134+ KeypadPgDown ,
135+ Keypad4 ,
136+ KeypadLeft ,
137+ Keypad5 ,
138+ KeypadEmpty ,
139+ Keypad6 ,
140+ KeypadRight ,
141+ Keypad7 ,
142+ KeypadHome ,
143+ Keypad8 ,
144+ KeypadUp ,
145+ Keypad9 ,
146+ KeypadPgUp ,
36147}
37148
38- impl TryFrom < u32 > for Keysym {
149+ impl TryFrom < u32 > for KeySym {
39150 type Error = anyhow:: Error ;
40151
41152 fn try_from ( value : u32 ) -> Result < Self , Self :: Error > {
42- const XK_F1 : u32 = 0xffbe ;
43- const XK_F12 : u32 = 0xffc9 ;
44-
45153 match value {
46- 0xff08 => Ok ( Backspace ) ,
47- 0xff09 => Ok ( Tab ) ,
48- 0xff0d => Ok ( ReturnOrEnter ) ,
49- 0xff1b => Ok ( Escape ) ,
50- 0xff63 => Ok ( Insert ) ,
51- 0xffff => Ok ( Delete ) ,
52- 0xff50 => Ok ( Home ) ,
53- 0xff57 => Ok ( End ) ,
54- 0xff55 => Ok ( PageUp ) ,
55- 0xff56 => Ok ( PageDown ) ,
56- 0xff51 => Ok ( Left ) ,
57- 0xff52 => Ok ( Up ) ,
58- 0xff53 => Ok ( Right ) ,
59- 0xff54 => Ok ( Down ) ,
60- f if ( f >= XK_F1 && f <= XK_F12 ) => {
61- let n = f - XK_F1 + 1 ;
154+ v if v <= ASCII_MAX => {
155+ let ac_res = v. to_ascii_char ( ) ;
156+ match ac_res {
157+ Ok ( ac) => Ok ( Ascii ( ac) ) ,
158+ Err ( e) => Err ( anyhow ! ( "invalid keysym=0x{:x} ({:?})" , value, e) ) ,
159+ }
160+ }
161+ KEYSYM_BACKSPACE => Ok ( Backspace ) ,
162+ KEYSYM_TAB => Ok ( Tab ) ,
163+ KEYSYM_RETURN_ENTER => Ok ( ReturnOrEnter ) ,
164+ KEYSYM_ESCAPE => Ok ( Escape ) ,
165+ KEYSYM_INSERT => Ok ( Insert ) ,
166+ KEYSYM_DELETE => Ok ( Delete ) ,
167+ KEYSYM_HOME => Ok ( Home ) ,
168+ KEYSYM_END => Ok ( End ) ,
169+ KEYSYM_PAGE_UP => Ok ( PageUp ) ,
170+ KEYSYM_PRINT => Ok ( Print ) ,
171+ KEYSYM_PAUSE => Ok ( Pause ) ,
172+ KEYSYM_CAPS_LOCK => Ok ( CapsLock ) ,
173+ KEYSYM_SUPER_LEFT => Ok ( SuperLeft ) ,
174+ KEYSYM_SUPER_RIGHT => Ok ( SuperRight ) ,
175+ KEYSYM_MENU => Ok ( Menu ) ,
176+
177+ KEYSYM_PAGE_DOWN => Ok ( PageDown ) ,
178+ KEYSYM_LEFT => Ok ( Left ) ,
179+ KEYSYM_UP => Ok ( Up ) ,
180+ KEYSYM_RIGHT => Ok ( Right ) ,
181+ KEYSYM_DOWN => Ok ( Down ) ,
182+
183+ f if ( f >= KEYSYM_F1 && f <= KEYSYM_F12 ) => {
184+ let n = f - KEYSYM_F1 + 1 ;
62185 // TODO: handle cast
63186 Ok ( FunctionKey ( n as u8 ) )
64187 }
65- 0xffe1 => Ok ( ShiftLeft ) ,
66- 0xffe2 => Ok ( ShiftRight ) ,
67- 0xffe3 => Ok ( ControlLeft ) ,
68- 0xffe4 => Ok ( ControlRight ) ,
69- 0xffe7 => Ok ( MetaLeft ) ,
70- 0xffe8 => Ok ( MetaRight ) ,
71- 0xffe9 => Ok ( AltLeft ) ,
72- 0xffea => Ok ( AltRight ) ,
73-
74- // TODO: figure out if there's a better way to map codes
75- other => {
76- let c = char:: from_u32 ( other) ;
77- match c {
78- // TODO: figure out what to do with these
79- None => Ok ( Unknown ( other) ) ,
80- Some ( v) => Ok ( Utf32 ( v) ) ,
81- }
82- }
188+
189+ KEYSYM_SHIFT_LEFT => Ok ( ShiftLeft ) ,
190+ KEYSYM_SHIFT_RIGHT => Ok ( ShiftRight ) ,
191+ KEYSYM_CTRL_LEFT => Ok ( ControlLeft ) ,
192+ KEYSYM_CTRL_RIGHT => Ok ( ControlRight ) ,
193+ KEYSYM_ALT_LEFT => Ok ( AltLeft ) ,
194+ KEYSYM_ALT_RIGHT => Ok ( AltRight ) ,
195+
196+ KEYSYM_SCROLL_LOCK => Ok ( ScrollLock ) ,
197+ KEYSYM_NUM_LOCK => Ok ( NumLock ) ,
198+
199+ KEYSYM_KP_ENTER => Ok ( KeypadEnter ) ,
200+ KEYSYM_KP_SLASH => Ok ( KeypadSlash ) ,
201+ KEYSYM_KP_ASTERISK => Ok ( KeypadAsterisk ) ,
202+ KEYSYM_KP_MINUS => Ok ( KeypadMinus ) ,
203+ KEYSYM_KP_PLUS => Ok ( KeypadPlus ) ,
204+ KEYSYM_KP_7 => Ok ( Keypad7 ) ,
205+ KEYSYM_KP_HOME => Ok ( KeypadHome ) ,
206+ KEYSYM_KP_8 => Ok ( Keypad8 ) ,
207+ KEYSYM_KP_UP => Ok ( KeypadUp ) ,
208+ KEYSYM_KP_9 => Ok ( Keypad9 ) ,
209+ KEYSYM_KP_PGUP => Ok ( KeypadPgUp ) ,
210+ KEYSYM_KP_4 => Ok ( Keypad4 ) ,
211+ KEYSYM_KP_LEFT => Ok ( KeypadLeft ) ,
212+ KEYSYM_KP_5 => Ok ( Keypad5 ) ,
213+ KEYSYM_KP_EMPTY => Ok ( KeypadEmpty ) ,
214+ KEYSYM_KP_6 => Ok ( Keypad6 ) ,
215+ KEYSYM_KP_RIGHT => Ok ( KeypadRight ) ,
216+ KEYSYM_KP_1 => Ok ( Keypad1 ) ,
217+ KEYSYM_KP_END => Ok ( KeypadEnd ) ,
218+ KEYSYM_KP_2 => Ok ( Keypad2 ) ,
219+ KEYSYM_KP_DOWN => Ok ( KeypadDown ) ,
220+ KEYSYM_KP_3 => Ok ( Keypad3 ) ,
221+ KEYSYM_KP_PGDOWN => Ok ( KeypadPgDown ) ,
222+ KEYSYM_KP_0 => Ok ( Keypad0 ) ,
223+ KEYSYM_KP_INSERT => Ok ( KeypadInsert ) ,
224+ KEYSYM_KP_PERIOD => Ok ( KeypadPeriod ) ,
225+ KEYSYM_KP_DELETE => Ok ( KeypadDelete ) ,
226+
227+ _ => Err ( anyhow ! ( "unknown keysym=0x{:x}" , value) ) ,
83228 }
84229 }
85230}
0 commit comments