@@ -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
577570void 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
663646void App::OnPointer (CoreWindow^ sender, PointerEventArgs^ args)
0 commit comments