mirror of
https://github.com/ARMSX2/ARMSX3.git
synced 2026-08-24 16:58:52 -07:00
cellKb reported no keyboard at all, so games that need one were unreachable: NFS Most Wanted's beta debug menu, and native keyboard support in games like Counter-Strike. The only handler upstream ships, basic_keyboard_handler, derives from QObject and filters QKeyEvent off a QWindow, and android/CMakeLists.txt excludes it with the rest of the Qt input layer -- init_kb_handler was hardcoded to NullKeyboardHandler as a result. Almost none of that handler is actually Qt-bound. KeyboardHandlerBase::HandleKey already takes plain u32 codes and keyboard_consumer::ConsumeKey resolves them through m_keys.find(code), so the code space only has to agree between whatever registers the buttons and whatever injects them. android_keyboard_handler therefore registers ANDROID KeyEvent keycodes directly rather than impersonating Qt. The PS3 side uses USB HID usage IDs and Android's letters and digits are contiguous too, so those map arithmetically and only the remainder needs a table. Android also distinguishes left from right modifiers, which Qt cannot, so all eight are wired rather than four. init_kb_handler now honours the Keyboard setting instead of always reporting none, and _rpcsx_keyboardKey delivers one key through the usual dlsym bridge, returning false when no keyboard is active so a caller can tell the difference. A physical keyboard reaches the guest through dispatchKeyEvent. The test there is KEYBOARD_TYPE_ALPHABETIC, not the event source: gamepads also report SOURCE_KEYBOARD for their buttons, so filtering on source alone would send every controller press to the guest keyboard as well as the pad. The event is consumed only when the native side reports the key landed, which keeps a physical keyboard usable for UI navigation everywhere else. Not yet done: the on-screen keyboard overlay, and a UI setting for the handler. The core default is still keyboard_handler::null, so this is inert until Keyboard is set to Basic.