diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index 694212f353..501272ddfa 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -130,52 +130,10 @@ bool UIScreen::UnsyncKey(const KeyInput &key) { } } - // Track modifier keys. - if (key.flags & KeyInputFlags::DOWN) { - switch (key.keyCode) { - case NKCODE_CTRL_LEFT: modifiersPressed_ |= Modifier::LCTRL; break; - case NKCODE_CTRL_RIGHT: modifiersPressed_ |= Modifier::RCTRL; break; - case NKCODE_SHIFT_LEFT: modifiersPressed_ |= Modifier::LSHIFT; break; - case NKCODE_SHIFT_RIGHT: modifiersPressed_ |= Modifier::RSHIFT; break; - case NKCODE_ALT_LEFT: modifiersPressed_ |= Modifier::LALT; break; - case NKCODE_ALT_RIGHT: modifiersPressed_ |= Modifier::RALT; break; - case NKCODE_META_LEFT: modifiersPressed_ |= Modifier::LMETA; break; - case NKCODE_META_RIGHT: modifiersPressed_ |= Modifier::RMETA; break; - default: - break; - } - } - if (key.flags & KeyInputFlags::UP) { - switch (key.keyCode) { - case NKCODE_CTRL_LEFT: modifiersPressed_ &= ~Modifier::LCTRL; break; - case NKCODE_CTRL_RIGHT: modifiersPressed_ &= ~Modifier::RCTRL; break; - case NKCODE_SHIFT_LEFT: modifiersPressed_ &= ~Modifier::LSHIFT; break; - case NKCODE_SHIFT_RIGHT: modifiersPressed_ &= ~Modifier::RSHIFT; break; - case NKCODE_ALT_LEFT: modifiersPressed_ &= ~Modifier::LALT; break; - case NKCODE_ALT_RIGHT: modifiersPressed_ &= ~Modifier::RALT; break; - case NKCODE_META_LEFT: modifiersPressed_ &= ~Modifier::LMETA; break; - case NKCODE_META_RIGHT: modifiersPressed_ &= ~Modifier::RMETA; break; - default: - break; - } - } - QueuedEvent ev{}; ev.type = QueuedEventType::KEY; ev.key = key; - if (modifiersPressed_ & (Modifier::LCTRL | Modifier::RCTRL)) { - ev.key.flags |= KeyInputFlags::MOD_CTRL; - } - if (modifiersPressed_ & (Modifier::LSHIFT | Modifier::RSHIFT)) { - ev.key.flags |= KeyInputFlags::MOD_SHIFT; - } - if (modifiersPressed_ & (Modifier::LALT | Modifier::RALT)) { - ev.key.flags |= KeyInputFlags::MOD_ALT; - } - if (modifiersPressed_ & (Modifier::LMETA | Modifier::RMETA)) { - ev.key.flags |= KeyInputFlags::MOD_META; - } std::lock_guard guard(eventQueueLock_); eventQueue_.push_back(ev); return retval; diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index 046c4a9f1d..946cb75901 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -32,19 +32,6 @@ struct QueuedEvent { }; }; -enum class Modifier { - NONE = 0, - LCTRL = 1, - RCTRL = 2, - LSHIFT = 4, - RSHIFT = 8, - LALT = 16, - RALT = 32, - LMETA = 64, - RMETA = 128, -}; -ENUM_CLASS_BITOPS(Modifier); - class UIScreen : public Screen { public: UIScreen(); @@ -76,9 +63,10 @@ public: virtual void focusChanged(ScreenFocusChange focusChange) override { Screen::focusChanged(focusChange); - modifiersPressed_ = Modifier::NONE; } + virtual bool AllowKeyboardNavigation() const { return true; } + protected: virtual void CreateViews() = 0; @@ -108,8 +96,6 @@ protected: private: std::mutex eventQueueLock_; std::deque eventQueue_; - - Modifier modifiersPressed_{}; }; class UIDialogScreen : public UIScreen { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 36ef3e2a7e..5b075b6065 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1134,6 +1134,10 @@ void EmuScreen::OnVKeyAnalog(VirtKey virtualKeyCode, float value) { limitMode = PSP_CoreParameter().analogFpsLimit == 60 ? FPSLimit::NORMAL : FPSLimit::ANALOG; } +bool EmuScreen::AllowKeyboardNavigation() const { + return true; +} + bool EmuScreen::UnsyncKey(const KeyInput &key) { System_Notify(SystemNotification::ACTIVITY); diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index a51ac364a3..dd84f1d116 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -69,6 +69,8 @@ public: } protected: + bool AllowKeyboardNavigation() const override; + void darken(); void focusChanged(ScreenFocusChange focusChange) override; ScreenRenderFlags PreRender(ScreenRenderMode mode) override; diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 5a59ea51da..d4265aa738 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -1369,6 +1369,20 @@ static void ProcessWheelRelease(InputKeyCode keyCode, double now, bool keyPress) } } +enum class Modifier { + NONE = 0, + LCTRL = 1, + RCTRL = 2, + LSHIFT = 4, + RSHIFT = 8, + LALT = 16, + RALT = 32, + LMETA = 64, + RMETA = 128, +}; +ENUM_CLASS_BITOPS(Modifier); +static Modifier g_modifiersPressed{}; + bool NativeKey(const KeyInput &key) { double now = time_now_d(); @@ -1429,8 +1443,59 @@ bool NativeKey(const KeyInput &key) { } HLEPlugins::SetKey(key.keyCode, (key.flags & KeyInputFlags::DOWN) ? 1 : 0); + + // Track and update modifiers. + + // Track modifier keys. + if (key.flags & KeyInputFlags::DOWN) { + switch (key.keyCode) { + case NKCODE_CTRL_LEFT: g_modifiersPressed |= Modifier::LCTRL; break; + case NKCODE_CTRL_RIGHT: g_modifiersPressed |= Modifier::RCTRL; break; + case NKCODE_SHIFT_LEFT: g_modifiersPressed |= Modifier::LSHIFT; break; + case NKCODE_SHIFT_RIGHT: g_modifiersPressed |= Modifier::RSHIFT; break; + case NKCODE_ALT_LEFT: g_modifiersPressed |= Modifier::LALT; break; + case NKCODE_ALT_RIGHT: g_modifiersPressed |= Modifier::RALT; break; + case NKCODE_META_LEFT: g_modifiersPressed |= Modifier::LMETA; break; + case NKCODE_META_RIGHT: g_modifiersPressed |= Modifier::RMETA; break; + default: + break; + } + } + if (key.flags & KeyInputFlags::UP) { + switch (key.keyCode) { + case NKCODE_CTRL_LEFT: g_modifiersPressed &= ~Modifier::LCTRL; break; + case NKCODE_CTRL_RIGHT: g_modifiersPressed &= ~Modifier::RCTRL; break; + case NKCODE_SHIFT_LEFT: g_modifiersPressed &= ~Modifier::LSHIFT; break; + case NKCODE_SHIFT_RIGHT: g_modifiersPressed &= ~Modifier::RSHIFT; break; + case NKCODE_ALT_LEFT: g_modifiersPressed &= ~Modifier::LALT; break; + case NKCODE_ALT_RIGHT: g_modifiersPressed &= ~Modifier::RALT; break; + case NKCODE_META_LEFT: g_modifiersPressed &= ~Modifier::LMETA; break; + case NKCODE_META_RIGHT: g_modifiersPressed &= ~Modifier::RMETA; break; + default: + break; + } + } + + KeyInputFlags modifierFlags{}; + + if (g_modifiersPressed & (Modifier::LCTRL | Modifier::RCTRL)) { + modifierFlags |= KeyInputFlags::MOD_CTRL; + } + if (g_modifiersPressed & (Modifier::LSHIFT | Modifier::RSHIFT)) { + modifierFlags |= KeyInputFlags::MOD_SHIFT; + } + if (g_modifiersPressed & (Modifier::LALT | Modifier::RALT)) { + modifierFlags |= KeyInputFlags::MOD_ALT; + } + if (g_modifiersPressed & (Modifier::LMETA | Modifier::RMETA)) { + modifierFlags |= KeyInputFlags::MOD_META; + } + + KeyInput modKey = key; + modKey.flags |= modifierFlags; + // Dispatch the key event. - bool retval = g_screenManager->key(key); + bool retval = g_screenManager->key(modKey); // The Mode key can have weird consequences on some devices, see #17245. if (key.keyCode == NKCODE_BUTTON_MODE) {