Skip to main content

starnix_modules_input_event_conversion/
keymap.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_fuchsia_input::Key;
6use starnix_logging::log_warn;
7use starnix_uapi::uapi;
8use std::collections::HashMap;
9use std::sync::LazyLock;
10
11pub static KEY_MAP: LazyLock<KeyMap> = LazyLock::new(|| init_key_map());
12
13/// linux <-> fuchsia key map allow search from 2 way.
14pub struct KeyMap {
15    linux_to_fuchsia: HashMap<u32, Key>,
16    fuchsia_to_linux: HashMap<Key, u32>,
17}
18
19impl KeyMap {
20    fn insert(&mut self, linux_keycode: u32, fuchsia_key: Key) {
21        // Should not have any conflict keys.
22        assert!(
23            !self.linux_to_fuchsia.contains_key(&linux_keycode),
24            "conflicted linux keycode={} fuchsia keycode={:?}",
25            linux_keycode,
26            fuchsia_key
27        );
28        assert!(
29            !self.fuchsia_to_linux.contains_key(&fuchsia_key),
30            "conflicted fuchsia keycode={:?}, linux keycode={}",
31            fuchsia_key,
32            linux_keycode
33        );
34
35        self.linux_to_fuchsia.insert(linux_keycode, fuchsia_key);
36        self.fuchsia_to_linux.insert(fuchsia_key, linux_keycode);
37    }
38
39    pub fn linux_keycode_to_fuchsia_input_key(&self, key: u32) -> Key {
40        match self.linux_to_fuchsia.get(&key) {
41            Some(k) => *k,
42            None => {
43                log_warn!("unknown linux keycode {}", key);
44                Key::Unknown
45            }
46        }
47    }
48
49    pub fn fuchsia_input_key_to_linux_keycode(&self, key: Key) -> u32 {
50        match self.fuchsia_to_linux.get(&key) {
51            Some(k) => *k,
52            None => {
53                log_warn!("unknown fuchsia key {:?}", key);
54                // this is the invalid key code 0
55                uapi::KEY_RESERVED
56            }
57        }
58    }
59
60    /// Returns every Linux keycode present in the keymap.
61    ///
62    /// The iteration order is unspecified. The result also includes the block of
63    /// test-only keycodes described in b/311425670, so callers building user-visible
64    /// capability bitmaps will generally want to filter it — see
65    /// `keyboard_key_attributes` in `input_file.rs` for an example.
66    pub fn all_linux_keycodes(&self) -> impl Iterator<Item = u32> + '_ {
67        self.linux_to_fuchsia.keys().copied()
68    }
69}
70
71fn init_key_map() -> KeyMap {
72    let mut m = KeyMap { linux_to_fuchsia: HashMap::new(), fuchsia_to_linux: HashMap::new() };
73
74    m.insert(uapi::KEY_ESC, Key::Escape);
75    m.insert(uapi::KEY_1, Key::Key1);
76    m.insert(uapi::KEY_2, Key::Key2);
77    m.insert(uapi::KEY_3, Key::Key3);
78    m.insert(uapi::KEY_4, Key::Key4);
79    m.insert(uapi::KEY_5, Key::Key5);
80    m.insert(uapi::KEY_6, Key::Key6);
81    m.insert(uapi::KEY_7, Key::Key7);
82    m.insert(uapi::KEY_8, Key::Key8);
83    m.insert(uapi::KEY_9, Key::Key9);
84    m.insert(uapi::KEY_0, Key::Key0);
85    m.insert(uapi::KEY_MINUS, Key::Minus);
86    m.insert(uapi::KEY_EQUAL, Key::Equals);
87    m.insert(uapi::KEY_BACKSPACE, Key::Backspace);
88    m.insert(uapi::KEY_TAB, Key::Tab);
89    m.insert(uapi::KEY_Q, Key::Q);
90    m.insert(uapi::KEY_W, Key::W);
91    m.insert(uapi::KEY_E, Key::E);
92    m.insert(uapi::KEY_R, Key::R);
93    m.insert(uapi::KEY_T, Key::T);
94    m.insert(uapi::KEY_Y, Key::Y);
95    m.insert(uapi::KEY_U, Key::U);
96    m.insert(uapi::KEY_I, Key::I);
97    m.insert(uapi::KEY_O, Key::O);
98    m.insert(uapi::KEY_P, Key::P);
99    m.insert(uapi::KEY_LEFTBRACE, Key::LeftBrace);
100    m.insert(uapi::KEY_RIGHTBRACE, Key::RightBrace);
101    m.insert(uapi::KEY_ENTER, Key::Enter);
102    m.insert(uapi::KEY_LEFTCTRL, Key::LeftCtrl);
103    m.insert(uapi::KEY_A, Key::A);
104    m.insert(uapi::KEY_S, Key::S);
105    m.insert(uapi::KEY_D, Key::D);
106    m.insert(uapi::KEY_F, Key::F);
107    m.insert(uapi::KEY_G, Key::G);
108    m.insert(uapi::KEY_H, Key::H);
109    m.insert(uapi::KEY_J, Key::J);
110    m.insert(uapi::KEY_K, Key::K);
111    m.insert(uapi::KEY_L, Key::L);
112    m.insert(uapi::KEY_SEMICOLON, Key::Semicolon);
113    m.insert(uapi::KEY_APOSTROPHE, Key::Apostrophe);
114    m.insert(uapi::KEY_GRAVE, Key::GraveAccent);
115    m.insert(uapi::KEY_LEFTSHIFT, Key::LeftShift);
116    m.insert(uapi::KEY_BACKSLASH, Key::Backslash);
117    m.insert(uapi::KEY_Z, Key::Z);
118    m.insert(uapi::KEY_X, Key::X);
119    m.insert(uapi::KEY_C, Key::C);
120    m.insert(uapi::KEY_V, Key::V);
121    m.insert(uapi::KEY_B, Key::B);
122    m.insert(uapi::KEY_N, Key::N);
123    m.insert(uapi::KEY_M, Key::M);
124    m.insert(uapi::KEY_COMMA, Key::Comma);
125    m.insert(uapi::KEY_DOT, Key::Dot);
126    m.insert(uapi::KEY_SLASH, Key::Slash);
127    m.insert(uapi::KEY_RIGHTSHIFT, Key::RightShift);
128    m.insert(uapi::KEY_KPASTERISK, Key::KeypadAsterisk);
129    m.insert(uapi::KEY_LEFTALT, Key::LeftAlt);
130    m.insert(uapi::KEY_SPACE, Key::Space);
131    m.insert(uapi::KEY_CAPSLOCK, Key::CapsLock);
132    m.insert(uapi::KEY_F1, Key::F1);
133    m.insert(uapi::KEY_F2, Key::F2);
134    m.insert(uapi::KEY_F3, Key::F3);
135    m.insert(uapi::KEY_F4, Key::F4);
136    m.insert(uapi::KEY_F5, Key::F5);
137    m.insert(uapi::KEY_F6, Key::F6);
138    m.insert(uapi::KEY_F7, Key::F7);
139    m.insert(uapi::KEY_F8, Key::F8);
140    m.insert(uapi::KEY_F9, Key::F9);
141    m.insert(uapi::KEY_F10, Key::F10);
142    m.insert(uapi::KEY_NUMLOCK, Key::NumLock);
143    m.insert(uapi::KEY_SCROLLLOCK, Key::ScrollLock);
144    m.insert(uapi::KEY_KP7, Key::Keypad7);
145    m.insert(uapi::KEY_KP8, Key::Keypad8);
146    m.insert(uapi::KEY_KP9, Key::Keypad9);
147    m.insert(uapi::KEY_KPMINUS, Key::KeypadMinus);
148    m.insert(uapi::KEY_KP4, Key::Keypad4);
149    m.insert(uapi::KEY_KP5, Key::Keypad5);
150    m.insert(uapi::KEY_KP6, Key::Keypad6);
151    m.insert(uapi::KEY_KPPLUS, Key::KeypadPlus);
152    m.insert(uapi::KEY_KP1, Key::Keypad1);
153    m.insert(uapi::KEY_KP2, Key::Keypad2);
154    m.insert(uapi::KEY_KP3, Key::Keypad3);
155    m.insert(uapi::KEY_KP0, Key::Keypad0);
156    m.insert(uapi::KEY_KPDOT, Key::KeypadDot);
157    // Germany Keyboard layout.
158    //
159    // m.insert(uapi::KEY_ZENKAKUHANKAKU,);
160    // m.insert(uapi::KEY_102ND,);
161    m.insert(uapi::KEY_F11, Key::F11);
162    m.insert(uapi::KEY_F12, Key::F12);
163    // Japan Keyboard layout.
164    //
165    // m.insert(uapi::KEY_RO,);
166    // m.insert(uapi::KEY_KATAKANA,);
167    // m.insert(uapi::KEY_HIRAGANA,);
168    // m.insert(uapi::KEY_HENKAN,);
169    // m.insert(uapi::KEY_KATAKANAHIRAGANA,);
170    // m.insert(uapi::KEY_MUHENKAN,);
171    // m.insert(uapi::KEY_KPJPCOMMA,);
172    m.insert(uapi::KEY_KPENTER, Key::KeypadEnter);
173    m.insert(uapi::KEY_RIGHTCTRL, Key::RightCtrl);
174    m.insert(uapi::KEY_KPSLASH, Key::KeypadSlash);
175    // SYSRQ is "PrintScreen" Key located on the right of F12 on 104 keyboard.
176    m.insert(uapi::KEY_SYSRQ, Key::PrintScreen);
177    m.insert(uapi::KEY_RIGHTALT, Key::RightAlt);
178    // m.insert(uapi::KEY_LINEFEED,);
179    m.insert(uapi::KEY_HOME, Key::Home);
180    m.insert(uapi::KEY_UP, Key::Up);
181    m.insert(uapi::KEY_PAGEUP, Key::PageUp);
182    m.insert(uapi::KEY_LEFT, Key::Left);
183    m.insert(uapi::KEY_RIGHT, Key::Right);
184    m.insert(uapi::KEY_END, Key::End);
185    m.insert(uapi::KEY_DOWN, Key::Down);
186    m.insert(uapi::KEY_PAGEDOWN, Key::PageDown);
187    m.insert(uapi::KEY_INSERT, Key::Insert);
188    m.insert(uapi::KEY_DELETE, Key::Delete);
189    // m.insert(uapi::KEY_MACRO,);
190    m.insert(uapi::KEY_MUTE, Key::Mute);
191    m.insert(uapi::KEY_VOLUMEDOWN, Key::VolumeDown);
192    m.insert(uapi::KEY_VOLUMEUP, Key::VolumeUp);
193    m.insert(uapi::KEY_POWER, Key::Power);
194    m.insert(uapi::KEY_KPEQUAL, Key::KeypadEquals);
195    // m.insert(uapi::KEY_KPPLUSMINUS,);
196    m.insert(uapi::KEY_PAUSE, Key::Pause);
197    // m.insert(uapi::KEY_SCALE,);
198    // m.insert(uapi::KEY_KPCOMMA,);
199    //
200    // Japan Keyboard layout.
201    //
202    // m.insert(uapi::KEY_HANGEUL,);
203    // m.insert(uapi::KEY_HANGUEL,);
204    // m.insert(uapi::KEY_HANJA,);
205    // m.insert(uapi::KEY_YEN,);
206    m.insert(uapi::KEY_LEFTMETA, Key::LeftMeta);
207    m.insert(uapi::KEY_RIGHTMETA, Key::RightMeta);
208    // m.insert(uapi::KEY_COMPOSE,);
209    // m.insert(uapi::KEY_STOP,);
210    // m.insert(uapi::KEY_AGAIN,);
211    // m.insert(uapi::KEY_PROPS,);
212    // m.insert(uapi::KEY_UNDO,);
213    // m.insert(uapi::KEY_FRONT,);
214    // m.insert(uapi::KEY_COPY,);
215    // m.insert(uapi::KEY_OPEN,);
216    // m.insert(uapi::KEY_PASTE,);
217    // m.insert(uapi::KEY_FIND,);
218    // m.insert(uapi::KEY_CUT,);
219    // m.insert(uapi::KEY_HELP,);
220    m.insert(uapi::KEY_MENU, Key::Menu);
221    // m.insert(uapi::KEY_CALC,);
222    // m.insert(uapi::KEY_SETUP,);
223    m.insert(uapi::KEY_SLEEP, Key::Sleep);
224    // m.insert(uapi::KEY_WAKEUP,);
225    // m.insert(uapi::KEY_FILE,);
226    // m.insert(uapi::KEY_SENDFILE,);
227    // m.insert(uapi::KEY_DELETEFILE,);
228    // m.insert(uapi::KEY_XFER,);
229    // m.insert(uapi::KEY_PROG1,);
230    // m.insert(uapi::KEY_PROG2,);
231    // m.insert(uapi::KEY_WWW,);
232    // m.insert(uapi::KEY_MSDOS,);
233    // m.insert(uapi::KEY_COFFEE,);
234    // m.insert(uapi::KEY_SCREENLOCK,);
235    // m.insert(uapi::KEY_ROTATE_DISPLAY,);
236    // m.insert(uapi::KEY_DIRECTION,);
237    // m.insert(uapi::KEY_CYCLEWINDOWS,);
238    // m.insert(uapi::KEY_MAIL,);
239    // m.insert(uapi::KEY_BOOKMARKS,);
240    // m.insert(uapi::KEY_COMPUTER,);
241    // m.insert(uapi::KEY_BACK,);
242    // m.insert(uapi::KEY_FORWARD,);
243    // m.insert(uapi::KEY_CLOSECD,);
244    // m.insert(uapi::KEY_EJECTCD,);
245    // m.insert(uapi::KEY_EJECTCLOSECD,);
246    // m.insert(uapi::KEY_NEXTSONG,);
247    m.insert(uapi::KEY_PLAYPAUSE, Key::PlayPause);
248    // m.insert(uapi::KEY_PREVIOUSSONG,);
249    // m.insert(uapi::KEY_STOPCD,);
250    // m.insert(uapi::KEY_RECORD,);
251    // m.insert(uapi::KEY_REWIND,);
252    // m.insert(uapi::KEY_PHONE,);
253    // m.insert(uapi::KEY_ISO,);
254    // m.insert(uapi::KEY_CONFIG,);
255    // m.insert(uapi::KEY_HOMEPAGE,);
256    // m.insert(uapi::KEY_REFRESH,);
257    // m.insert(uapi::KEY_EXIT,);
258    // m.insert(uapi::KEY_MOVE,);
259    // m.insert(uapi::KEY_EDIT,);
260    // m.insert(uapi::KEY_SCROLLUP,);
261    // m.insert(uapi::KEY_SCROLLDOWN,);
262    // m.insert(uapi::KEY_KPLEFTPAREN,);
263    // m.insert(uapi::KEY_KPRIGHTPAREN,);
264    // m.insert(uapi::KEY_NEW,);
265    // m.insert(uapi::KEY_REDO,);
266    // m.insert(uapi::KEY_F13,);
267    // m.insert(uapi::KEY_F14,);
268    // m.insert(uapi::KEY_F15,);
269    // m.insert(uapi::KEY_F16,);
270    // m.insert(uapi::KEY_F17,);
271    // m.insert(uapi::KEY_F18,);
272    // m.insert(uapi::KEY_F19,);
273    // m.insert(uapi::KEY_F20,);
274    // m.insert(uapi::KEY_F21,);
275    // m.insert(uapi::KEY_F22,);
276    // m.insert(uapi::KEY_F23,);
277    // m.insert(uapi::KEY_F24,);
278    // m.insert(uapi::KEY_PLAYCD,);
279    // m.insert(uapi::KEY_PAUSECD,);
280    // m.insert(uapi::KEY_PROG3,);
281    // m.insert(uapi::KEY_PROG4,);
282    // m.insert(uapi::KEY_ALL_APPLICATIONS,);
283    // m.insert(uapi::KEY_DASHBOARD,);
284    // m.insert(uapi::KEY_SUSPEND,);
285    // m.insert(uapi::KEY_CLOSE,);
286    // m.insert(uapi::KEY_PLAY,);
287    // m.insert(uapi::KEY_FASTFORWARD,);
288    // m.insert(uapi::KEY_BASSBOOST,);
289    // m.insert(uapi::KEY_PRINT,);
290    // m.insert(uapi::KEY_HP,);
291    // m.insert(uapi::KEY_CAMERA,);
292    // m.insert(uapi::KEY_SOUND,);
293    // m.insert(uapi::KEY_QUESTION,);
294    // m.insert(uapi::KEY_EMAIL,);
295    // m.insert(uapi::KEY_CHAT,);
296    // m.insert(uapi::KEY_SEARCH,);
297    // m.insert(uapi::KEY_CONNECT,);
298    // m.insert(uapi::KEY_FINANCE,);
299    // m.insert(uapi::KEY_SPORT,);
300    // m.insert(uapi::KEY_SHOP,);
301    // m.insert(uapi::KEY_ALTERASE,);
302    // m.insert(uapi::KEY_CANCEL,);
303    m.insert(uapi::KEY_BRIGHTNESSDOWN, Key::BrightnessDown);
304    m.insert(uapi::KEY_BRIGHTNESSUP, Key::BrightnessUp);
305    // m.insert(uapi::KEY_MEDIA,);
306    // m.insert(uapi::KEY_SWITCHVIDEOMODE,);
307    // m.insert(uapi::KEY_KBDILLUMTOGGLE,);
308    // m.insert(uapi::KEY_KBDILLUMDOWN,);
309    // m.insert(uapi::KEY_KBDILLUMUP,);
310    // m.insert(uapi::KEY_SEND,);
311    // m.insert(uapi::KEY_REPLY,);
312    // m.insert(uapi::KEY_FORWARDMAIL,);
313    // m.insert(uapi::KEY_SAVE,);
314    // m.insert(uapi::KEY_DOCUMENTS,);
315    // m.insert(uapi::KEY_BATTERY,);
316    // m.insert(uapi::KEY_BLUETOOTH,);
317    // m.insert(uapi::KEY_WLAN,);
318    // m.insert(uapi::KEY_UWB,);
319    // m.insert(uapi::KEY_UNKNOWN,);
320    // m.insert(uapi::KEY_VIDEO_NEXT,);
321    // m.insert(uapi::KEY_VIDEO_PREV,);
322    // m.insert(uapi::KEY_BRIGHTNESS_CYCLE,);
323    // m.insert(uapi::KEY_BRIGHTNESS_AUTO,);
324    // m.insert(uapi::KEY_BRIGHTNESS_ZERO,);
325    // m.insert(uapi::KEY_DISPLAY_OFF,);
326    // m.insert(uapi::KEY_WWAN,);
327    // m.insert(uapi::KEY_WIMAX,);
328    // m.insert(uapi::KEY_RFKILL,);
329    // m.insert(uapi::KEY_MICMUTE,);
330    // m.insert(uapi::KEY_OK,);
331    // m.insert(uapi::KEY_SELECT,);
332    // m.insert(uapi::KEY_GOTO,);
333    // m.insert(uapi::KEY_CLEAR,);
334    // m.insert(uapi::KEY_POWER2,);
335    // m.insert(uapi::KEY_OPTION,);
336    // m.insert(uapi::KEY_INFO,);
337    // m.insert(uapi::KEY_TIME,);
338    // m.insert(uapi::KEY_VENDOR,);
339    // m.insert(uapi::KEY_ARCHIVE,);
340    // m.insert(uapi::KEY_PROGRAM,);
341    // m.insert(uapi::KEY_CHANNEL,);
342    // m.insert(uapi::KEY_FAVORITES,);
343    // m.insert(uapi::KEY_EPG,);
344    // m.insert(uapi::KEY_PVR,);
345    // m.insert(uapi::KEY_MHP,);
346    // m.insert(uapi::KEY_LANGUAGE,);
347    // m.insert(uapi::KEY_TITLE,);
348    // m.insert(uapi::KEY_SUBTITLE,);
349    // m.insert(uapi::KEY_ANGLE,);
350    // m.insert(uapi::KEY_FULL_SCREEN,);
351    // m.insert(uapi::KEY_ZOOM,);
352    // m.insert(uapi::KEY_MODE,);
353    // m.insert(uapi::KEY_KEYBOARD,);
354    // m.insert(uapi::KEY_ASPECT_RATIO,);
355    // m.insert(uapi::KEY_SCREEN,);
356    // m.insert(uapi::KEY_PC,);
357    // m.insert(uapi::KEY_TV,);
358    // m.insert(uapi::KEY_TV2,);
359    // m.insert(uapi::KEY_VCR,);
360    // m.insert(uapi::KEY_VCR2,);
361    // m.insert(uapi::KEY_SAT,);
362    // m.insert(uapi::KEY_SAT2,);
363    // m.insert(uapi::KEY_CD,);
364    // m.insert(uapi::KEY_TAPE,);
365    // m.insert(uapi::KEY_RADIO,);
366    // m.insert(uapi::KEY_TUNER,);
367    // m.insert(uapi::KEY_PLAYER,);
368    // m.insert(uapi::KEY_TEXT,);
369    // m.insert(uapi::KEY_DVD,);
370    // m.insert(uapi::KEY_AUX,);
371    // m.insert(uapi::KEY_MP3,);
372    // m.insert(uapi::KEY_AUDIO,);
373    // m.insert(uapi::KEY_VIDEO,);
374    // m.insert(uapi::KEY_DIRECTORY,);
375    // m.insert(uapi::KEY_LIST,);
376    // m.insert(uapi::KEY_MEMO,);
377    // m.insert(uapi::KEY_CALENDAR,);
378    // m.insert(uapi::KEY_RED,);
379    // m.insert(uapi::KEY_GREEN,);
380    // m.insert(uapi::KEY_YELLOW,);
381    // m.insert(uapi::KEY_BLUE,);
382    // m.insert(uapi::KEY_CHANNELUP,);
383    // m.insert(uapi::KEY_CHANNELDOWN,);
384    // m.insert(uapi::KEY_FIRST,);
385    // m.insert(uapi::KEY_LAST,);
386    // m.insert(uapi::KEY_AB,);
387    // m.insert(uapi::KEY_NEXT,);
388    // m.insert(uapi::KEY_RESTART,);
389    // m.insert(uapi::KEY_SLOW,);
390    // m.insert(uapi::KEY_SHUFFLE,);
391    // m.insert(uapi::KEY_BREAK,);
392    // m.insert(uapi::KEY_PREVIOUS,);
393    // m.insert(uapi::KEY_DIGITS,);
394    // m.insert(uapi::KEY_TEEN,);
395    // m.insert(uapi::KEY_TWEN,);
396    // m.insert(uapi::KEY_VIDEOPHONE,);
397    // m.insert(uapi::KEY_GAMES,);
398    // m.insert(uapi::KEY_ZOOMIN,);
399    // m.insert(uapi::KEY_ZOOMOUT,);
400    // m.insert(uapi::KEY_ZOOMRESET,);
401    // m.insert(uapi::KEY_WORDPROCESSOR,);
402    // m.insert(uapi::KEY_EDITOR,);
403    // m.insert(uapi::KEY_SPREADSHEET,);
404    // m.insert(uapi::KEY_GRAPHICSEDITOR,);
405    // m.insert(uapi::KEY_PRESENTATION,);
406    // m.insert(uapi::KEY_DATABASE,);
407    // m.insert(uapi::KEY_NEWS,);
408    // m.insert(uapi::KEY_VOICEMAIL,);
409    // m.insert(uapi::KEY_ADDRESSBOOK,);
410    // m.insert(uapi::KEY_MESSENGER,);
411    // m.insert(uapi::KEY_DISPLAYTOGGLE,);
412    // m.insert(uapi::KEY_BRIGHTNESS_TOGGLE,);
413    // m.insert(uapi::KEY_SPELLCHECK,);
414    // m.insert(uapi::KEY_LOGOFF,);
415    // m.insert(uapi::KEY_DOLLAR,);
416    // m.insert(uapi::KEY_EURO,);
417    // m.insert(uapi::KEY_FRAMEBACK,);
418    // m.insert(uapi::KEY_FRAMEFORWARD,);
419    // m.insert(uapi::KEY_CONTEXT_MENU,);
420    // m.insert(uapi::KEY_MEDIA_REPEAT,);
421    // m.insert(uapi::KEY_10CHANNELSUP,);
422    // m.insert(uapi::KEY_10CHANNELSDOWN,);
423    // m.insert(uapi::KEY_IMAGES,);
424    // m.insert(uapi::KEY_NOTIFICATION_CENTER,);
425    // m.insert(uapi::KEY_PICKUP_PHONE,);
426    // m.insert(uapi::KEY_HANGUP_PHONE,);
427    // m.insert(uapi::KEY_DEL_EOL,);
428    // m.insert(uapi::KEY_DEL_EOS,);
429    // m.insert(uapi::KEY_INS_LINE,);
430    // m.insert(uapi::KEY_DEL_LINE,);
431    // m.insert(uapi::KEY_FN,);
432    // m.insert(uapi::KEY_FN_ESC,);
433    // m.insert(uapi::KEY_FN_F1,);
434    // m.insert(uapi::KEY_FN_F2,);
435    // m.insert(uapi::KEY_FN_F3,);
436    // m.insert(uapi::KEY_FN_F4,);
437    // m.insert(uapi::KEY_FN_F5,);
438    // m.insert(uapi::KEY_FN_F6,);
439    // m.insert(uapi::KEY_FN_F7,);
440    // m.insert(uapi::KEY_FN_F8,);
441    // m.insert(uapi::KEY_FN_F9,);
442    // m.insert(uapi::KEY_FN_F10,);
443    // m.insert(uapi::KEY_FN_F11,);
444    // m.insert(uapi::KEY_FN_F12,);
445    // m.insert(uapi::KEY_FN_1,);
446    // m.insert(uapi::KEY_FN_2,);
447    // m.insert(uapi::KEY_FN_D,);
448    // m.insert(uapi::KEY_FN_E,);
449    // m.insert(uapi::KEY_FN_F,);
450    // m.insert(uapi::KEY_FN_S,);
451    // m.insert(uapi::KEY_FN_B,);
452    // m.insert(uapi::KEY_FN_RIGHT_SHIFT,);
453    // m.insert(uapi::KEY_BRL_DOT1,);
454    // m.insert(uapi::KEY_BRL_DOT2,);
455    // m.insert(uapi::KEY_BRL_DOT3,);
456    // m.insert(uapi::KEY_BRL_DOT4,);
457    // m.insert(uapi::KEY_BRL_DOT5,);
458    // m.insert(uapi::KEY_BRL_DOT6,);
459    // m.insert(uapi::KEY_BRL_DOT7,);
460    // m.insert(uapi::KEY_BRL_DOT8,);
461    // m.insert(uapi::KEY_BRL_DOT9,);
462    // m.insert(uapi::KEY_BRL_DOT10,);
463    // m.insert(uapi::KEY_NUMERIC_0,);
464    // m.insert(uapi::KEY_NUMERIC_1,);
465    // m.insert(uapi::KEY_NUMERIC_2,);
466    // m.insert(uapi::KEY_NUMERIC_3,);
467    // m.insert(uapi::KEY_NUMERIC_4,);
468    // m.insert(uapi::KEY_NUMERIC_5,);
469    // m.insert(uapi::KEY_NUMERIC_6,);
470    // m.insert(uapi::KEY_NUMERIC_7,);
471    // m.insert(uapi::KEY_NUMERIC_8,);
472    // m.insert(uapi::KEY_NUMERIC_9,);
473    // m.insert(uapi::KEY_NUMERIC_STAR,);
474    // m.insert(uapi::KEY_NUMERIC_POUND,);
475    // m.insert(uapi::KEY_NUMERIC_A,);
476    // m.insert(uapi::KEY_NUMERIC_B,);
477    // m.insert(uapi::KEY_NUMERIC_C,);
478    // m.insert(uapi::KEY_NUMERIC_D,);
479    // m.insert(uapi::KEY_CAMERA_FOCUS,);
480    // m.insert(uapi::KEY_WPS_BUTTON,);
481    // m.insert(uapi::KEY_TOUCHPAD_TOGGLE,);
482    // m.insert(uapi::KEY_TOUCHPAD_ON,);
483    // m.insert(uapi::KEY_TOUCHPAD_OFF,);
484    // m.insert(uapi::KEY_CAMERA_ZOOMIN,);
485    // m.insert(uapi::KEY_CAMERA_ZOOMOUT,);
486    // m.insert(uapi::KEY_CAMERA_UP,);
487    // m.insert(uapi::KEY_CAMERA_DOWN,);
488    // m.insert(uapi::KEY_CAMERA_LEFT,);
489    // m.insert(uapi::KEY_CAMERA_RIGHT,);
490    // m.insert(uapi::KEY_ATTENDANT_ON,);
491    // m.insert(uapi::KEY_ATTENDANT_OFF,);
492    // m.insert(uapi::KEY_ATTENDANT_TOGGLE,);
493    // m.insert(uapi::KEY_LIGHTS_TOGGLE,);
494    // m.insert(uapi::KEY_ALS_TOGGLE,);
495    // m.insert(uapi::KEY_ROTATE_LOCK_TOGGLE,);
496    // m.insert(uapi::KEY_BUTTONCONFIG,);
497    // m.insert(uapi::KEY_TASKMANAGER,);
498    // m.insert(uapi::KEY_JOURNAL,);
499    // m.insert(uapi::KEY_CONTROLPANEL,);
500    // m.insert(uapi::KEY_APPSELECT,);
501    // m.insert(uapi::KEY_SCREENSAVER,);
502    // m.insert(uapi::KEY_VOICECOMMAND,);
503    // m.insert(uapi::KEY_ASSISTANT,);
504    // m.insert(uapi::KEY_KBD_LAYOUT_NEXT,);
505    // m.insert(uapi::KEY_EMOJI_PICKER,);
506    // m.insert(uapi::KEY_DICTATE,);
507    // m.insert(uapi::KEY_CAMERA_ACCESS_ENABLE,);
508    // m.insert(uapi::KEY_CAMERA_ACCESS_DISABLE,);
509    // m.insert(uapi::KEY_CAMERA_ACCESS_TOGGLE,);
510    // m.insert(uapi::KEY_BRIGHTNESS_MIN,);
511    // m.insert(uapi::KEY_BRIGHTNESS_MAX,);
512    // m.insert(uapi::KEY_KBDINPUTASSIST_PREV,);
513    // m.insert(uapi::KEY_KBDINPUTASSIST_NEXT,);
514    // m.insert(uapi::KEY_KBDINPUTASSIST_PREVGROUP,);
515    // m.insert(uapi::KEY_KBDINPUTASSIST_NEXTGROUP,);
516    // m.insert(uapi::KEY_KBDINPUTASSIST_ACCEPT,);
517    // m.insert(uapi::KEY_KBDINPUTASSIST_CANCEL,);
518    // m.insert(uapi::KEY_RIGHT_UP,);
519    // m.insert(uapi::KEY_RIGHT_DOWN,);
520    // m.insert(uapi::KEY_LEFT_UP,);
521    // m.insert(uapi::KEY_LEFT_DOWN,);
522    // m.insert(uapi::KEY_ROOT_MENU,);
523    // m.insert(uapi::KEY_MEDIA_TOP_MENU,);
524    // m.insert(uapi::KEY_NUMERIC_11,);
525    // m.insert(uapi::KEY_NUMERIC_12,);
526    // m.insert(uapi::KEY_AUDIO_DESC,);
527    // m.insert(uapi::KEY_3D_MODE,);
528    // m.insert(uapi::KEY_NEXT_FAVORITE,);
529    // m.insert(uapi::KEY_STOP_RECORD,);
530    // m.insert(uapi::KEY_PAUSE_RECORD,);
531    // m.insert(uapi::KEY_VOD,);
532    // m.insert(uapi::KEY_UNMUTE,);
533    // m.insert(uapi::KEY_FASTREVERSE,);
534    // m.insert(uapi::KEY_SLOWREVERSE,);
535    // m.insert(uapi::KEY_DATA,);
536    // m.insert(uapi::KEY_ONSCREEN_KEYBOARD,);
537    // m.insert(uapi::KEY_PRIVACY_SCREEN_TOGGLE,);
538    // m.insert(uapi::KEY_SELECTIVE_SCREENSHOT,);
539    // m.insert(uapi::KEY_NEXT_ELEMENT,);
540    // m.insert(uapi::KEY_PREVIOUS_ELEMENT,);
541    // m.insert(uapi::KEY_AUTOPILOT_ENGAGE_TOGGLE,);
542    // m.insert(uapi::KEY_MARK_WAYPOINT,);
543    // m.insert(uapi::KEY_SOS,);
544    // m.insert(uapi::KEY_NAV_CHART,);
545    // m.insert(uapi::KEY_FISHING_CHART,);
546    // m.insert(uapi::KEY_SINGLE_RANGE_RADAR,);
547    // m.insert(uapi::KEY_DUAL_RANGE_RADAR,);
548    // m.insert(uapi::KEY_RADAR_OVERLAY,);
549    // m.insert(uapi::KEY_TRADITIONAL_SONAR,);
550    // m.insert(uapi::KEY_CLEARVU_SONAR,);
551    // m.insert(uapi::KEY_SIDEVU_SONAR,);
552    // m.insert(uapi::KEY_NAV_INFO,);
553    // m.insert(uapi::KEY_BRIGHTNESS_MENU,);
554    // m.insert(uapi::KEY_MACRO1,);
555    // m.insert(uapi::KEY_MACRO2,);
556    // m.insert(uapi::KEY_MACRO3,);
557    // m.insert(uapi::KEY_MACRO4,);
558    // m.insert(uapi::KEY_MACRO5,);
559    // m.insert(uapi::KEY_MACRO6,);
560    // m.insert(uapi::KEY_MACRO7,);
561    // m.insert(uapi::KEY_MACRO8,);
562    // m.insert(uapi::KEY_MACRO9,);
563    // m.insert(uapi::KEY_MACRO10,);
564    // m.insert(uapi::KEY_MACRO11,);
565    // m.insert(uapi::KEY_MACRO12,);
566    // m.insert(uapi::KEY_MACRO13,);
567    // m.insert(uapi::KEY_MACRO14,);
568    // m.insert(uapi::KEY_MACRO15,);
569    // m.insert(uapi::KEY_MACRO16,);
570    // m.insert(uapi::KEY_MACRO17,);
571    // m.insert(uapi::KEY_MACRO18,);
572    // m.insert(uapi::KEY_MACRO19,);
573    // m.insert(uapi::KEY_MACRO20,);
574    // m.insert(uapi::KEY_MACRO21,);
575    // m.insert(uapi::KEY_MACRO22,);
576    // m.insert(uapi::KEY_MACRO23,);
577    // m.insert(uapi::KEY_MACRO24,);
578    // m.insert(uapi::KEY_MACRO25,);
579    // m.insert(uapi::KEY_MACRO26,);
580    // m.insert(uapi::KEY_MACRO27,);
581    // m.insert(uapi::KEY_MACRO28,);
582    // m.insert(uapi::KEY_MACRO29,);
583    // m.insert(uapi::KEY_MACRO30,);
584    // m.insert(uapi::KEY_MACRO_RECORD_START,);
585    // m.insert(uapi::KEY_MACRO_RECORD_STOP,);
586    // m.insert(uapi::KEY_MACRO_PRESET_CYCLE,);
587    // m.insert(uapi::KEY_MACRO_PRESET1,);
588    // m.insert(uapi::KEY_MACRO_PRESET2,);
589    // m.insert(uapi::KEY_MACRO_PRESET3,);
590    // m.insert(uapi::KEY_KBD_LCD_MENU1,);
591    // m.insert(uapi::KEY_KBD_LCD_MENU2,);
592    // m.insert(uapi::KEY_KBD_LCD_MENU3,);
593    // m.insert(uapi::KEY_KBD_LCD_MENU4,);
594    // m.insert(uapi::KEY_KBD_LCD_MENU5,);
595
596    // we use following keycodes in starnix tests. See b/311425670 for details.
597    m.insert(0x0055, Key::Unknown0055);
598    m.insert(0x0056, Key::Unknown0056);
599    m.insert(0x0059, Key::Unknown0059);
600    m.insert(0x005c, Key::Unknown005C);
601    m.insert(0x005d, Key::Unknown005D);
602    m.insert(0x005e, Key::Unknown005E);
603    m.insert(0x0079, Key::Unknown0079);
604    m.insert(0x007a, Key::Unknown007A);
605    m.insert(0x007b, Key::Unknown007B);
606    m.insert(0x007c, Key::Unknown007C);
607    m.insert(0x0085, Key::Unknown0085);
608    m.insert(0x0087, Key::Unknown0087);
609    m.insert(0x0089, Key::Unknown0089);
610    m.insert(0x009c, Key::Unknown009C);
611    m.insert(0x009f, Key::Unknown009F);
612    m.insert(0x00a0, Key::Unknown00A0);
613    m.insert(0x00a2, Key::Unknown00A2);
614    m.insert(0x00a3, Key::Unknown00A3);
615    m.insert(0x00a5, Key::Unknown00A5);
616    m.insert(0x00a6, Key::Unknown00A6);
617    m.insert(0x00a7, Key::Unknown00A7);
618    m.insert(0x00a8, Key::Unknown00A8);
619    m.insert(0x00a9, Key::Unknown00A9);
620    m.insert(0x00ad, Key::Unknown00Ad);
621    m.insert(0x00b1, Key::Unknown00B1);
622    m.insert(0x00b2, Key::Unknown00B2);
623    m.insert(0x00b3, Key::Unknown00B3);
624    m.insert(0x00b4, Key::Unknown00B4);
625    m.insert(0x00c9, Key::Unknown00C9);
626    m.insert(0x00cf, Key::Unknown00Cf);
627    m.insert(0x00d0, Key::Unknown00D0);
628    m.insert(0x00d4, Key::Unknown00D4);
629    m.insert(0x00e2, Key::Unknown00E2);
630    m.insert(0x0120, Key::Unknown0120);
631    m.insert(0x0121, Key::Unknown0121);
632    m.insert(0x0122, Key::Unknown0122);
633    m.insert(0x0123, Key::Unknown0123);
634    m.insert(0x0124, Key::Unknown0124);
635    m.insert(0x0125, Key::Unknown0125);
636    m.insert(0x0126, Key::Unknown0126);
637    m.insert(0x0127, Key::Unknown0127);
638    m.insert(0x0128, Key::Unknown0128);
639    m.insert(0x0129, Key::Unknown0129);
640    m.insert(0x012a, Key::Unknown012A);
641    m.insert(0x012b, Key::Unknown012B);
642    m.insert(0x012c, Key::Unknown012C);
643    m.insert(0x012d, Key::Unknown012D);
644    m.insert(0x012e, Key::Unknown012E);
645    m.insert(0x012f, Key::Unknown012F);
646    m.insert(0x0130, Key::Unknown0130);
647    m.insert(0x0131, Key::Unknown0131);
648    m.insert(0x0132, Key::Unknown0132);
649    m.insert(0x0133, Key::Unknown0133);
650    m.insert(0x0134, Key::Unknown0134);
651    m.insert(0x0135, Key::Unknown0135);
652    m.insert(0x0136, Key::Unknown0136);
653    m.insert(0x0137, Key::Unknown0137);
654    m.insert(0x0138, Key::Unknown0138);
655    m.insert(0x0139, Key::Unknown0139);
656    m.insert(0x013a, Key::Unknown013A);
657    m.insert(0x013b, Key::Unknown013B);
658    m.insert(0x013c, Key::Unknown013C);
659    m.insert(0x013d, Key::Unknown013D);
660    m.insert(0x013e, Key::Unknown013E);
661    m.insert(0x0161, Key::Unknown0161);
662    m.insert(0x016a, Key::Unknown016A);
663    m.insert(0x016e, Key::Unknown016E);
664    m.insert(0x0172, Key::Unknown0172);
665    m.insert(0x0179, Key::Unknown0179);
666    m.insert(0x018e, Key::Unknown018E);
667    m.insert(0x018f, Key::Unknown018F);
668    m.insert(0x0190, Key::Unknown0190);
669    m.insert(0x0191, Key::Unknown0191);
670    m.insert(0x0192, Key::Unknown0192);
671    m.insert(0x0193, Key::Unknown0193);
672    m.insert(0x0195, Key::Unknown0195);
673    m.insert(0x01d0, Key::Unknown01D0);
674    m.insert(0x020a, Key::Unknown020A);
675    m.insert(0x020b, Key::Unknown020B);
676
677    m
678}
679
680#[cfg(test)]
681mod keymap_tests {
682    use super::*;
683    use pretty_assertions::assert_eq;
684
685    #[test]
686    fn init_key_map_no_assert_failed() {
687        let _ = init_key_map();
688    }
689
690    #[test]
691    fn linux_keycode_to_fuchsia_input_key() {
692        let km = init_key_map();
693        for (&linux_key, &want) in km.linux_to_fuchsia.iter() {
694            let got = km.linux_keycode_to_fuchsia_input_key(linux_key);
695            assert_eq!(want, got);
696        }
697    }
698
699    #[test]
700    fn unknown_linux_keycode_to_fuchsia_input_key() {
701        let km = init_key_map();
702        let got = km.linux_keycode_to_fuchsia_input_key(701);
703        assert_eq!(Key::Unknown, got);
704    }
705
706    #[test]
707    fn fuchsia_input_key_to_linux_keycode() {
708        let km = init_key_map();
709        for (&fuchsia_key, &want) in km.fuchsia_to_linux.iter() {
710            let got = km.fuchsia_input_key_to_linux_keycode(fuchsia_key);
711            assert_eq!(want, got);
712        }
713    }
714
715    #[test]
716    fn linux_keycode_testset() {
717        // Want to ensure all linux keycode in this can map to fuchsia key. See b/311425670 for
718        // details.
719        let linux_keycodes: Vec<u32> = vec![
720            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
721            25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 44, 45, 46, 47,
722            48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
723            70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 92, 93, 94,
724            96, 97, 98, 100, 102, 103, 105, 106, 107, 108, 110, 111, 113, 114, 115, 117, 119, 121,
725            122, 123, 124, 133, 135, 137, 139, 142, 156, 159, 160, 162, 163, 164, 165, 166, 167,
726            168, 169, 173, 177, 178, 179, 180, 201, 207, 208, 212, 226, 288, 289, 290, 291, 292,
727            293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309,
728            310, 311, 312, 313, 314, 315, 316, 317, 318, 353, 362, 366, 370, 377, 398, 399, 400,
729            401, 402, 403, 405, 464, 522, 523,
730        ];
731
732        let km = init_key_map();
733
734        let mut kcs = vec![];
735        for kc in linux_keycodes {
736            if km.linux_keycode_to_fuchsia_input_key(kc) == Key::Unknown {
737                kcs.push(kc);
738            }
739        }
740
741        assert_eq!(kcs.len(), 0, "{:?}", kcs);
742    }
743}