Skip to content

Commit f33f5e2

Browse files
authored
UWP: Handle key presses while ALT is held down (#15680)
Also release held keys when unfousing the window (properly handle ALT+Tab on desktop) UWP input event code cleanup
1 parent c3a18e0 commit f33f5e2

2 files changed

Lines changed: 27 additions & 46 deletions

File tree

uwp/uwp_main.cpp

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ const struct rarch_key_map rarch_key_map_uwp[] = {
159159
{ (unsigned int)VirtualKey::RightControl, RETROK_RCTRL },
160160
{ (unsigned int)VirtualKey::LeftMenu, RETROK_LALT },
161161
{ (unsigned int)VirtualKey::RightMenu, RETROK_RALT },
162-
//key { VK_RETURN, RETROK_KP_ENTER },
163162
{ (unsigned int)VirtualKey::CapitalLock, RETROK_CAPSLOCK },
164163
{ VK_OEM_1, RETROK_SEMICOLON },
165164
{ VK_OEM_PLUS, RETROK_EQUALS },
@@ -306,12 +305,6 @@ void App::SetWindow(CoreWindow^ window)
306305
window->Closed +=
307306
ref new TypedEventHandler<CoreWindow^, CoreWindowEventArgs^>(this, &App::OnWindowClosed);
308307

309-
window->KeyDown +=
310-
ref new TypedEventHandler<CoreWindow^, KeyEventArgs^>(this, &App::OnKey);
311-
312-
window->KeyUp +=
313-
ref new TypedEventHandler<CoreWindow^, KeyEventArgs^>(this, &App::OnKey);
314-
315308
window->PointerPressed +=
316309
ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &App::OnPointer);
317310

@@ -577,11 +570,32 @@ void App::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ ar
577570
void App::OnWindowActivated(CoreWindow^ sender, WindowActivatedEventArgs^ args)
578571
{
579572
m_windowFocused = args->WindowActivationState != CoreWindowActivationState::Deactivated;
573+
if (!m_windowFocused)
574+
{
575+
/* When deactivating the window, send key up events for anything still held down */
576+
for (rarch_key_map it : rarch_key_map_uwp)
577+
{
578+
if ((sender->GetKeyState((VirtualKey)it.sym) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)
579+
input_keyboard_event(false, it.rk, 0, 0, RETRO_DEVICE_KEYBOARD);
580+
}
581+
}
580582
}
581583

582-
bool App::GetKey(CoreWindow^ window, VirtualKey vkey, bool down, bool extended, unsigned& keycode, uint16_t& mod)
584+
void App::OnAcceleratorKey(CoreDispatcher^ sender, AcceleratorKeyEventArgs^ args)
583585
{
586+
if (args->EventType != CoreAcceleratorKeyEventType::KeyDown && args->EventType != CoreAcceleratorKeyEventType::KeyUp &&
587+
args->EventType != CoreAcceleratorKeyEventType::SystemKeyDown && args->EventType != CoreAcceleratorKeyEventType::SystemKeyUp)
588+
return;
589+
590+
/* Unlike CoreWindow::KeyDown/KeyUp events, this callback gets called for all keys including
591+
* F10, Alt and any keys pressed in addition to while Alt is being held down. */
592+
bool down = !args->KeyStatus.IsKeyReleased;
593+
bool extended = args->KeyStatus.IsExtendedKey;
594+
VirtualKey vkey = args->VirtualKey;
595+
CoreWindow^ window = CoreWindow::GetForCurrentThread();
596+
584597
/* Some keys we need to specify via the extended flag */
598+
unsigned keycode = RETROK_UNKNOWN;
585599
if (vkey == VirtualKey::Enter)
586600
keycode = (extended ? RETROK_KP_ENTER : RETROK_RETURN);
587601
else if (vkey == VirtualKey::Control)
@@ -604,17 +618,14 @@ bool App::GetKey(CoreWindow^ window, VirtualKey vkey, bool down, bool extended,
604618
had_right_down = down;
605619
keycode = RETROK_RSHIFT;
606620
}
607-
else
608-
return false;
609621
}
610622
else
611-
{
612623
keycode = input_keymaps_translate_keysym_to_rk((unsigned)vkey);
613-
if (keycode == RETROK_UNKNOWN)
614-
return false;
615-
}
616624

617-
mod = 0;
625+
if (keycode == RETROK_UNKNOWN)
626+
return;
627+
628+
uint16_t mod = 0;
618629
if ((window->GetKeyState(VirtualKey::Shift) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)
619630
mod |= RETROKMOD_SHIFT;
620631
if ((window->GetKeyState(VirtualKey::Control) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)
@@ -629,35 +640,7 @@ bool App::GetKey(CoreWindow^ window, VirtualKey vkey, bool down, bool extended,
629640
(window->GetKeyState(VirtualKey::RightWindows) & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down)
630641
mod |= RETROKMOD_META;
631642

632-
return true;
633-
}
634-
635-
void App::OnKey(CoreWindow^ sender, KeyEventArgs^ args)
636-
{
637-
bool down = !args->KeyStatus.IsKeyReleased;
638-
unsigned keycode;
639-
uint16_t mod;
640-
if (GetKey(sender, args->VirtualKey, down, args->KeyStatus.IsExtendedKey, keycode, mod))
641-
input_keyboard_event(down, keycode, 0, mod, RETRO_DEVICE_KEYBOARD);
642-
}
643-
644-
void App::OnAcceleratorKey(CoreDispatcher^ sender, AcceleratorKeyEventArgs^ args)
645-
{
646-
if (args->EventType == CoreAcceleratorKeyEventType::KeyDown || args->EventType == CoreAcceleratorKeyEventType::KeyUp ||
647-
args->EventType == CoreAcceleratorKeyEventType::SystemKeyDown || args->EventType == CoreAcceleratorKeyEventType::SystemKeyUp)
648-
{
649-
/* This callback is called for all keys but we're only interested in the Alt keys which don't call OnKey */
650-
VirtualKey vkey = args->VirtualKey;
651-
if (vkey == VirtualKey::Menu || vkey == VirtualKey::LeftMenu || vkey == VirtualKey::RightMenu)
652-
{
653-
CoreWindow^ window = CoreWindow::GetForCurrentThread();
654-
bool down = !args->KeyStatus.IsKeyReleased;
655-
unsigned keycode;
656-
uint16_t mod;
657-
if (GetKey(window, vkey, down, args->KeyStatus.IsExtendedKey, keycode, mod))
658-
input_keyboard_event(down, keycode, 0, mod, RETRO_DEVICE_KEYBOARD);
659-
}
660-
}
643+
input_keyboard_event(down, keycode, 0, mod, RETRO_DEVICE_KEYBOARD);
661644
}
662645

663646
void App::OnPointer(CoreWindow^ sender, PointerEventArgs^ args)

uwp/uwp_main.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ namespace RetroArchUWP
4646
void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args);
4747
void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args);
4848
void OnWindowActivated(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowActivatedEventArgs^ args);
49-
void OnKey(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::KeyEventArgs^ args);
5049
void OnAcceleratorKey(Windows::UI::Core::CoreDispatcher^ sender, Windows::UI::Core::AcceleratorKeyEventArgs^ args);
5150
void OnPointer(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args);
5251

@@ -75,7 +74,6 @@ namespace RetroArchUWP
7574
Platform::String^ m_launchOnExit;
7675
bool m_launchOnExitShutdown;
7776
void ParseProtocolArgs(Windows::ApplicationModel::Activation::IActivatedEventArgs^ args, int *argc, std::vector<char*> *argv, std::vector<std::string> *argvTmp);
78-
bool GetKey(Windows::UI::Core::CoreWindow^ window, Windows::System::VirtualKey vkey, bool down, bool extended, unsigned& keycode, uint16_t& mod);
7977
static App^ m_instance;
8078
};
8179
}

0 commit comments

Comments
 (0)