From 5b7c23325c2e37ee84f3dad74b940002ac46ff98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=96R=C3=96K=20Attila?= Date: Sat, 26 Mar 2022 04:01:52 +0100 Subject: [PATCH] WIP android: Add mapping from NDK Keycode to VirtualKeyCode --- src/platform_impl/android/mod.rs | 455 ++++++++++++++++++++++++++++++- 1 file changed, 452 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/android/mod.rs b/src/platform_impl/android/mod.rs index c9e1220e2b4..6d7c4b57ee8 100644 --- a/src/platform_impl/android/mod.rs +++ b/src/platform_impl/android/mod.rs @@ -2,13 +2,14 @@ use crate::{ dpi::{PhysicalPosition, PhysicalSize, Position, Size}, - error, event, + error, + event::{self, VirtualKeyCode}, event_loop::{self, ControlFlow}, monitor, window, }; use ndk::{ configuration::Configuration, - event::{InputEvent, KeyAction, MotionAction}, + event::{InputEvent, KeyAction, Keycode, MotionAction}, looper::{ForeignLooper, Poll, ThreadLooper}, }; use ndk_glue::{Event, Rect}; @@ -44,6 +45,452 @@ enum EventSource { Internal(InternalEvent), } +fn ndk_keycode_to_virtualkeycode(keycode: Keycode) -> Option { + match keycode { + Keycode::A => Some(VirtualKeyCode::A), + Keycode::B => Some(VirtualKeyCode::B), + Keycode::C => Some(VirtualKeyCode::C), + Keycode::D => Some(VirtualKeyCode::D), + Keycode::E => Some(VirtualKeyCode::E), + Keycode::F => Some(VirtualKeyCode::F), + Keycode::G => Some(VirtualKeyCode::G), + Keycode::H => Some(VirtualKeyCode::H), + Keycode::I => Some(VirtualKeyCode::I), + Keycode::J => Some(VirtualKeyCode::J), + Keycode::K => Some(VirtualKeyCode::K), + Keycode::L => Some(VirtualKeyCode::L), + Keycode::M => Some(VirtualKeyCode::M), + Keycode::N => Some(VirtualKeyCode::N), + Keycode::O => Some(VirtualKeyCode::O), + Keycode::P => Some(VirtualKeyCode::P), + Keycode::Q => Some(VirtualKeyCode::Q), + Keycode::R => Some(VirtualKeyCode::R), + Keycode::S => Some(VirtualKeyCode::S), + Keycode::T => Some(VirtualKeyCode::T), + Keycode::U => Some(VirtualKeyCode::U), + Keycode::V => Some(VirtualKeyCode::V), + Keycode::W => Some(VirtualKeyCode::W), + Keycode::X => Some(VirtualKeyCode::X), + Keycode::Y => Some(VirtualKeyCode::Y), + Keycode::Z => Some(VirtualKeyCode::Z), + + Keycode::Keycode0 => Some(VirtualKeyCode::Key0), + Keycode::Keycode1 => Some(VirtualKeyCode::Key1), + Keycode::Keycode2 => Some(VirtualKeyCode::Key2), + Keycode::Keycode3 => Some(VirtualKeyCode::Key3), + Keycode::Keycode4 => Some(VirtualKeyCode::Key4), + Keycode::Keycode5 => Some(VirtualKeyCode::Key5), + Keycode::Keycode6 => Some(VirtualKeyCode::Key6), + Keycode::Keycode7 => Some(VirtualKeyCode::Key7), + Keycode::Keycode8 => Some(VirtualKeyCode::Key8), + Keycode::Keycode9 => Some(VirtualKeyCode::Key9), + + Keycode::Numpad0 => Some(VirtualKeyCode::Numpad0), + Keycode::Numpad1 => Some(VirtualKeyCode::Numpad1), + Keycode::Numpad2 => Some(VirtualKeyCode::Numpad2), + Keycode::Numpad3 => Some(VirtualKeyCode::Numpad3), + Keycode::Numpad4 => Some(VirtualKeyCode::Numpad4), + Keycode::Numpad5 => Some(VirtualKeyCode::Numpad5), + Keycode::Numpad6 => Some(VirtualKeyCode::Numpad6), + Keycode::Numpad7 => Some(VirtualKeyCode::Numpad7), + Keycode::Numpad8 => Some(VirtualKeyCode::Numpad8), + Keycode::Numpad9 => Some(VirtualKeyCode::Numpad9), + + Keycode::DpadLeft => Some(VirtualKeyCode::Left), + Keycode::DpadRight => Some(VirtualKeyCode::Right), + Keycode::DpadUp => Some(VirtualKeyCode::Up), + Keycode::DpadDown => Some(VirtualKeyCode::Down), + + Keycode::F1 => Some(VirtualKeyCode::F1), + Keycode::F2 => Some(VirtualKeyCode::F2), + Keycode::F3 => Some(VirtualKeyCode::F3), + Keycode::F4 => Some(VirtualKeyCode::F4), + Keycode::F5 => Some(VirtualKeyCode::F5), + Keycode::F6 => Some(VirtualKeyCode::F6), + Keycode::F7 => Some(VirtualKeyCode::F7), + Keycode::F8 => Some(VirtualKeyCode::F8), + Keycode::F9 => Some(VirtualKeyCode::F9), + Keycode::F10 => Some(VirtualKeyCode::F10), + Keycode::F11 => Some(VirtualKeyCode::F11), + Keycode::F12 => Some(VirtualKeyCode::F12), + + /* + Some more `Keycode`s that are not mapped from: + + See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-53) + + Unknown = ffi::AKEYCODE_UNKNOWN, + SoftLeft = ffi::AKEYCODE_SOFT_LEFT, + SoftRight = ffi::AKEYCODE_SOFT_RIGHT, + Home = ffi::AKEYCODE_HOME, + Back = ffi::AKEYCODE_BACK, + Call = ffi::AKEYCODE_CALL, + Endcall = ffi::AKEYCODE_ENDCALL, + + + Star = ffi::AKEYCODE_STAR, + Pound = ffi::AKEYCODE_POUND, + + + DpadCenter = ffi::AKEYCODE_DPAD_CENTER, + VolumeUp = ffi::AKEYCODE_VOLUME_UP, + VolumeDown = ffi::AKEYCODE_VOLUME_DOWN, + Power = ffi::AKEYCODE_POWER, + Camera = ffi::AKEYCODE_CAMERA, + Clear = ffi::AKEYCODE_CLEAR, + + + Comma = ffi::AKEYCODE_COMMA, + Period = ffi::AKEYCODE_PERIOD, + AltLeft = ffi::AKEYCODE_ALT_LEFT, + AltRight = ffi::AKEYCODE_ALT_RIGHT, + ShiftLeft = ffi::AKEYCODE_SHIFT_LEFT, + ShiftRight = ffi::AKEYCODE_SHIFT_RIGHT, + Tab = ffi::AKEYCODE_TAB, + Space = ffi::AKEYCODE_SPACE, + Sym = ffi::AKEYCODE_SYM, + Explorer = ffi::AKEYCODE_EXPLORER, + Envelope = ffi::AKEYCODE_ENVELOPE, + Enter = ffi::AKEYCODE_ENTER, + Del = ffi::AKEYCODE_DEL, + Grave = ffi::AKEYCODE_GRAVE, + Minus = ffi::AKEYCODE_MINUS, + Equals = ffi::AKEYCODE_EQUALS, + LeftBracket = ffi::AKEYCODE_LEFT_BRACKET, + RightBracket = ffi::AKEYCODE_RIGHT_BRACKET, + Backslash = ffi::AKEYCODE_BACKSLASH, + Semicolon = ffi::AKEYCODE_SEMICOLON, + Apostrophe = ffi::AKEYCODE_APOSTROPHE, + Slash = ffi::AKEYCODE_SLASH, + At = ffi::AKEYCODE_AT, + Num = ffi::AKEYCODE_NUM, + Headsethook = ffi::AKEYCODE_HEADSETHOOK, + Focus = ffi::AKEYCODE_FOCUS, + Plus = ffi::AKEYCODE_PLUS, + Menu = ffi::AKEYCODE_MENU, + Notification = ffi::AKEYCODE_NOTIFICATION, + Search = ffi::AKEYCODE_SEARCH, + MediaPlayPause = ffi::AKEYCODE_MEDIA_PLAY_PAUSE, + MediaStop = ffi::AKEYCODE_MEDIA_STOP, + MediaNext = ffi::AKEYCODE_MEDIA_NEXT, + MediaPrevious = ffi::AKEYCODE_MEDIA_PREVIOUS, + MediaRewind = ffi::AKEYCODE_MEDIA_REWIND, + MediaFastForward = ffi::AKEYCODE_MEDIA_FAST_FORWARD, + Mute = ffi::AKEYCODE_MUTE, + PageUp = ffi::AKEYCODE_PAGE_UP, + PageDown = ffi::AKEYCODE_PAGE_DOWN, + Pictsymbols = ffi::AKEYCODE_PICTSYMBOLS, + SwitchCharset = ffi::AKEYCODE_SWITCH_CHARSET, + ButtonA = ffi::AKEYCODE_BUTTON_A, + ButtonB = ffi::AKEYCODE_BUTTON_B, + ButtonC = ffi::AKEYCODE_BUTTON_C, + ButtonX = ffi::AKEYCODE_BUTTON_X, + ButtonY = ffi::AKEYCODE_BUTTON_Y, + ButtonZ = ffi::AKEYCODE_BUTTON_Z, + ButtonL1 = ffi::AKEYCODE_BUTTON_L1, + ButtonR1 = ffi::AKEYCODE_BUTTON_R1, + ButtonL2 = ffi::AKEYCODE_BUTTON_L2, + ButtonR2 = ffi::AKEYCODE_BUTTON_R2, + ButtonThumbl = ffi::AKEYCODE_BUTTON_THUMBL, + ButtonThumbr = ffi::AKEYCODE_BUTTON_THUMBR, + ButtonStart = ffi::AKEYCODE_BUTTON_START, + ButtonSelect = ffi::AKEYCODE_BUTTON_SELECT, + ButtonMode = ffi::AKEYCODE_BUTTON_MODE, + Escape = ffi::AKEYCODE_ESCAPE, + ForwardDel = ffi::AKEYCODE_FORWARD_DEL, + CtrlLeft = ffi::AKEYCODE_CTRL_LEFT, + CtrlRight = ffi::AKEYCODE_CTRL_RIGHT, + CapsLock = ffi::AKEYCODE_CAPS_LOCK, + ScrollLock = ffi::AKEYCODE_SCROLL_LOCK, + MetaLeft = ffi::AKEYCODE_META_LEFT, + MetaRight = ffi::AKEYCODE_META_RIGHT, + Function = ffi::AKEYCODE_FUNCTION, + Sysrq = ffi::AKEYCODE_SYSRQ, + Break = ffi::AKEYCODE_BREAK, + MoveHome = ffi::AKEYCODE_MOVE_HOME, + MoveEnd = ffi::AKEYCODE_MOVE_END, + Insert = ffi::AKEYCODE_INSERT, + Forward = ffi::AKEYCODE_FORWARD, + MediaPlay = ffi::AKEYCODE_MEDIA_PLAY, + MediaPause = ffi::AKEYCODE_MEDIA_PAUSE, + MediaClose = ffi::AKEYCODE_MEDIA_CLOSE, + MediaEject = ffi::AKEYCODE_MEDIA_EJECT, + MediaRecord = ffi::AKEYCODE_MEDIA_RECORD, + + + NumLock = ffi::AKEYCODE_NUM_LOCK, + + NumpadDivide = ffi::AKEYCODE_NUMPAD_DIVIDE, + NumpadMultiply = ffi::AKEYCODE_NUMPAD_MULTIPLY, + NumpadSubtract = ffi::AKEYCODE_NUMPAD_SUBTRACT, + NumpadAdd = ffi::AKEYCODE_NUMPAD_ADD, + NumpadDot = ffi::AKEYCODE_NUMPAD_DOT, + NumpadComma = ffi::AKEYCODE_NUMPAD_COMMA, + NumpadEnter = ffi::AKEYCODE_NUMPAD_ENTER, + NumpadEquals = ffi::AKEYCODE_NUMPAD_EQUALS, + NumpadLeftParen = ffi::AKEYCODE_NUMPAD_LEFT_PAREN, + NumpadRightParen = ffi::AKEYCODE_NUMPAD_RIGHT_PAREN, + VolumeMute = ffi::AKEYCODE_VOLUME_MUTE, + Info = ffi::AKEYCODE_INFO, + ChannelUp = ffi::AKEYCODE_CHANNEL_UP, + ChannelDown = ffi::AKEYCODE_CHANNEL_DOWN, + ZoomIn = ffi::AKEYCODE_ZOOM_IN, + ZoomOut = ffi::AKEYCODE_ZOOM_OUT, + Tv = ffi::AKEYCODE_TV, + Window = ffi::AKEYCODE_WINDOW, + Guide = ffi::AKEYCODE_GUIDE, + Dvr = ffi::AKEYCODE_DVR, + Bookmark = ffi::AKEYCODE_BOOKMARK, + Captions = ffi::AKEYCODE_CAPTIONS, + Settings = ffi::AKEYCODE_SETTINGS, + TvPower = ffi::AKEYCODE_TV_POWER, + TvInput = ffi::AKEYCODE_TV_INPUT, + StbPower = ffi::AKEYCODE_STB_POWER, + StbInput = ffi::AKEYCODE_STB_INPUT, + AvrPower = ffi::AKEYCODE_AVR_POWER, + AvrInput = ffi::AKEYCODE_AVR_INPUT, + ProgRed = ffi::AKEYCODE_PROG_RED, + ProgGreen = ffi::AKEYCODE_PROG_GREEN, + ProgYellow = ffi::AKEYCODE_PROG_YELLOW, + ProgBlue = ffi::AKEYCODE_PROG_BLUE, + AppSwitch = ffi::AKEYCODE_APP_SWITCH, + Button1 = ffi::AKEYCODE_BUTTON_1, + Button2 = ffi::AKEYCODE_BUTTON_2, + Button3 = ffi::AKEYCODE_BUTTON_3, + Button4 = ffi::AKEYCODE_BUTTON_4, + Button5 = ffi::AKEYCODE_BUTTON_5, + Button6 = ffi::AKEYCODE_BUTTON_6, + Button7 = ffi::AKEYCODE_BUTTON_7, + Button8 = ffi::AKEYCODE_BUTTON_8, + Button9 = ffi::AKEYCODE_BUTTON_9, + Button10 = ffi::AKEYCODE_BUTTON_10, + Button11 = ffi::AKEYCODE_BUTTON_11, + Button12 = ffi::AKEYCODE_BUTTON_12, + Button13 = ffi::AKEYCODE_BUTTON_13, + Button14 = ffi::AKEYCODE_BUTTON_14, + Button15 = ffi::AKEYCODE_BUTTON_15, + Button16 = ffi::AKEYCODE_BUTTON_16, + LanguageSwitch = ffi::AKEYCODE_LANGUAGE_SWITCH, + MannerMode = ffi::AKEYCODE_MANNER_MODE, + Keycode3dMode = ffi::AKEYCODE_3D_MODE, + Contacts = ffi::AKEYCODE_CONTACTS, + Calendar = ffi::AKEYCODE_CALENDAR, + Music = ffi::AKEYCODE_MUSIC, + Calculator = ffi::AKEYCODE_CALCULATOR, + ZenkakuHankaku = ffi::AKEYCODE_ZENKAKU_HANKAKU, + Eisu = ffi::AKEYCODE_EISU, + Muhenkan = ffi::AKEYCODE_MUHENKAN, + Henkan = ffi::AKEYCODE_HENKAN, + KatakanaHiragana = ffi::AKEYCODE_KATAKANA_HIRAGANA, + Yen = ffi::AKEYCODE_YEN, + Ro = ffi::AKEYCODE_RO, + Kana = ffi::AKEYCODE_KANA, + Assist = ffi::AKEYCODE_ASSIST, + BrightnessDown = ffi::AKEYCODE_BRIGHTNESS_DOWN, + BrightnessUp = ffi::AKEYCODE_BRIGHTNESS_UP, + MediaAudioTrack = ffi::AKEYCODE_MEDIA_AUDIO_TRACK, + Sleep = ffi::AKEYCODE_SLEEP, + Wakeup = ffi::AKEYCODE_WAKEUP, + Pairing = ffi::AKEYCODE_PAIRING, + MediaTopMenu = ffi::AKEYCODE_MEDIA_TOP_MENU, + Keycode11 = ffi::AKEYCODE_11, + Keycode12 = ffi::AKEYCODE_12, + LastChannel = ffi::AKEYCODE_LAST_CHANNEL, + TvDataService = ffi::AKEYCODE_TV_DATA_SERVICE, + VoiceAssist = ffi::AKEYCODE_VOICE_ASSIST, + TvRadioService = ffi::AKEYCODE_TV_RADIO_SERVICE, + TvTeletext = ffi::AKEYCODE_TV_TELETEXT, + TvNumberEntry = ffi::AKEYCODE_TV_NUMBER_ENTRY, + TvTerrestrialAnalog = ffi::AKEYCODE_TV_TERRESTRIAL_ANALOG, + TvTerrestrialDigital = ffi::AKEYCODE_TV_TERRESTRIAL_DIGITAL, + TvSatellite = ffi::AKEYCODE_TV_SATELLITE, + TvSatelliteBs = ffi::AKEYCODE_TV_SATELLITE_BS, + TvSatelliteCs = ffi::AKEYCODE_TV_SATELLITE_CS, + TvSatelliteService = ffi::AKEYCODE_TV_SATELLITE_SERVICE, + TvNetwork = ffi::AKEYCODE_TV_NETWORK, + TvAntennaCable = ffi::AKEYCODE_TV_ANTENNA_CABLE, + TvInputHdmi1 = ffi::AKEYCODE_TV_INPUT_HDMI_1, + TvInputHdmi2 = ffi::AKEYCODE_TV_INPUT_HDMI_2, + TvInputHdmi3 = ffi::AKEYCODE_TV_INPUT_HDMI_3, + TvInputHdmi4 = ffi::AKEYCODE_TV_INPUT_HDMI_4, + TvInputComposite1 = ffi::AKEYCODE_TV_INPUT_COMPOSITE_1, + TvInputComposite2 = ffi::AKEYCODE_TV_INPUT_COMPOSITE_2, + TvInputComponent1 = ffi::AKEYCODE_TV_INPUT_COMPONENT_1, + TvInputComponent2 = ffi::AKEYCODE_TV_INPUT_COMPONENT_2, + TvInputVga1 = ffi::AKEYCODE_TV_INPUT_VGA_1, + TvAudioDescription = ffi::AKEYCODE_TV_AUDIO_DESCRIPTION, + TvAudioDescriptionMixUp = ffi::AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP, + TvAudioDescriptionMixDown = ffi::AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN, + TvZoomMode = ffi::AKEYCODE_TV_ZOOM_MODE, + TvContentsMenu = ffi::AKEYCODE_TV_CONTENTS_MENU, + TvMediaContextMenu = ffi::AKEYCODE_TV_MEDIA_CONTEXT_MENU, + TvTimerProgramming = ffi::AKEYCODE_TV_TIMER_PROGRAMMING, + Help = ffi::AKEYCODE_HELP, + NavigatePrevious = ffi::AKEYCODE_NAVIGATE_PREVIOUS, + NavigateNext = ffi::AKEYCODE_NAVIGATE_NEXT, + NavigateIn = ffi::AKEYCODE_NAVIGATE_IN, + NavigateOut = ffi::AKEYCODE_NAVIGATE_OUT, + StemPrimary = ffi::AKEYCODE_STEM_PRIMARY, + Stem1 = ffi::AKEYCODE_STEM_1, + Stem2 = ffi::AKEYCODE_STEM_2, + Stem3 = ffi::AKEYCODE_STEM_3, + DpadUpLeft = ffi::AKEYCODE_DPAD_UP_LEFT, + DpadDownLeft = ffi::AKEYCODE_DPAD_DOWN_LEFT, + DpadUpRight = ffi::AKEYCODE_DPAD_UP_RIGHT, + DpadDownRight = ffi::AKEYCODE_DPAD_DOWN_RIGHT, + MediaSkipForward = ffi::AKEYCODE_MEDIA_SKIP_FORWARD, + MediaSkipBackward = ffi::AKEYCODE_MEDIA_SKIP_BACKWARD, + MediaStepForward = ffi::AKEYCODE_MEDIA_STEP_FORWARD, + MediaStepBackward = ffi::AKEYCODE_MEDIA_STEP_BACKWARD, + SoftSleep = ffi::AKEYCODE_SOFT_SLEEP, + Cut = ffi::AKEYCODE_CUT, + Copy = ffi::AKEYCODE_COPY, + Paste = ffi::AKEYCODE_PASTE, + SystemNavigationUp = ffi::AKEYCODE_SYSTEM_NAVIGATION_UP, + SystemNavigationDown = ffi::AKEYCODE_SYSTEM_NAVIGATION_DOWN, + SystemNavigationLeft = ffi::AKEYCODE_SYSTEM_NAVIGATION_LEFT, + SystemNavigationRight = ffi::AKEYCODE_SYSTEM_NAVIGATION_RIGHT, + AllApps = ffi::AKEYCODE_ALL_APPS, + Refresh = ffi::AKEYCODE_REFRESH, + ThumbsUp = ffi::AKEYCODE_THUMBS_UP, + ThumbsDown = ffi::AKEYCODE_THUMBS_DOWN, + ProfileSwitch = ffi::AKEYCODE_PROFILE_SWITCH, + + */ + + + + /* Some more `VirtualKeyCode`s not mapped to: + + + /// The Escape key, next to F1. + Escape, + + + F13, + F14, + F15, + F16, + F17, + F18, + F19, + F20, + F21, + F22, + F23, + F24, + + /// Print Screen/SysRq. + Snapshot, + /// Scroll Lock. + Scroll, + /// Pause/Break key, next to Scroll lock. + Pause, + + /// `Insert`, next to Backspace. + Insert, + Home, + Delete, + End, + PageDown, + PageUp, + + + /// The Backspace key, right over Enter. + // TODO: rename + Back, + /// The Enter key. + Return, + /// The space bar. + Space, + + /// The "Compose" key on Linux. + Compose, + + Caret, + + Numlock, + NumpadAdd, + NumpadDivide, + NumpadDecimal, + NumpadComma, + NumpadEnter, + NumpadEquals, + NumpadMultiply, + NumpadSubtract, + + AbntC1, + AbntC2, + Apostrophe, + Apps, + Asterisk, + At, + Ax, + Backslash, + Calculator, + Capital, + Colon, + Comma, + Convert, + Equals, + Grave, + Kana, + Kanji, + LAlt, + LBracket, + LControl, + LShift, + LWin, + Mail, + MediaSelect, + MediaStop, + Minus, + Mute, + MyComputer, + // also called "Next" + NavigateForward, + // also called "Prior" + NavigateBackward, + NextTrack, + NoConvert, + OEM102, + Period, + PlayPause, + Plus, + Power, + PrevTrack, + RAlt, + RBracket, + RControl, + RShift, + RWin, + Semicolon, + Slash, + Sleep, + Stop, + Sysrq, + Tab, + Underline, + Unlabeled, + VolumeDown, + VolumeUp, + Wake, + WebBack, + WebFavorites, + WebForward, + WebHome, + WebRefresh, + WebSearch, + WebStop, + Yen, + Copy, + Paste, + Cut, + */ + _ => None, + } +} + fn poll(poll: Poll) -> Option { match poll { Poll::Event { ident, .. } => match ident { @@ -279,7 +726,9 @@ impl EventLoop { input: event::KeyboardInput { scancode: key.scan_code() as u32, state, - virtual_keycode: None, + virtual_keycode: ndk_keycode_to_virtualkeycode( + key.key_code(), + ), modifiers: event::ModifiersState::default(), }, is_synthetic: false,