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}