@@ -29,14 +29,14 @@ use winapi::shared::ntdef::SHORT;
2929use winapi:: shared:: windef:: HWND ;
3030use winapi:: um:: winuser:: {
3131 GetKeyState , GetKeyboardLayout , MapVirtualKeyExW , PeekMessageW , ToUnicodeEx , MAPVK_VK_TO_CHAR ,
32- MAPVK_VSC_TO_VK_EX , PM_NOREMOVE , VK_ACCEPT , VK_ADD , VK_APPS , VK_ATTN , VK_BACK , VK_BROWSER_BACK ,
33- VK_BROWSER_FAVORITES , VK_BROWSER_FORWARD , VK_BROWSER_HOME , VK_BROWSER_REFRESH ,
34- VK_BROWSER_SEARCH , VK_BROWSER_STOP , VK_CANCEL , VK_CAPITAL , VK_CLEAR , VK_CONTROL , VK_CONVERT ,
35- VK_CRSEL , VK_DECIMAL , VK_DELETE , VK_DIVIDE , VK_DOWN , VK_END , VK_EREOF , VK_ESCAPE , VK_EXECUTE ,
36- VK_EXSEL , VK_F1 , VK_F10 , VK_F11 , VK_F12 , VK_F2 , VK_F3 , VK_F4 , VK_F5 , VK_F6 , VK_F7 , VK_F8 ,
37- VK_F9 , VK_FINAL , VK_HELP , VK_HOME , VK_INSERT , VK_JUNJA , VK_KANA , VK_KANJI , VK_LAUNCH_APP1 ,
38- VK_LAUNCH_APP2 , VK_LAUNCH_MAIL , VK_LAUNCH_MEDIA_SELECT , VK_LCONTROL , VK_LEFT , VK_LMENU ,
39- VK_LSHIFT , VK_LWIN , VK_MEDIA_NEXT_TRACK , VK_MEDIA_PLAY_PAUSE , VK_MEDIA_PREV_TRACK ,
32+ MAPVK_VSC_TO_VK_EX , MK_CONTROL , MK_SHIFT , PM_NOREMOVE , VK_ACCEPT , VK_ADD , VK_APPS , VK_ATTN ,
33+ VK_BACK , VK_BROWSER_BACK , VK_BROWSER_FAVORITES , VK_BROWSER_FORWARD , VK_BROWSER_HOME ,
34+ VK_BROWSER_REFRESH , VK_BROWSER_SEARCH , VK_BROWSER_STOP , VK_CANCEL , VK_CAPITAL , VK_CLEAR ,
35+ VK_CONTROL , VK_CONVERT , VK_CRSEL , VK_DECIMAL , VK_DELETE , VK_DIVIDE , VK_DOWN , VK_END , VK_EREOF ,
36+ VK_ESCAPE , VK_EXECUTE , VK_EXSEL , VK_F1 , VK_F10 , VK_F11 , VK_F12 , VK_F2 , VK_F3 , VK_F4 , VK_F5 ,
37+ VK_F6 , VK_F7 , VK_F8 , VK_F9 , VK_FINAL , VK_HELP , VK_HOME , VK_INSERT , VK_JUNJA , VK_KANA , VK_KANJI ,
38+ VK_LAUNCH_APP1 , VK_LAUNCH_APP2 , VK_LAUNCH_MAIL , VK_LAUNCH_MEDIA_SELECT , VK_LCONTROL , VK_LEFT ,
39+ VK_LMENU , VK_LSHIFT , VK_LWIN , VK_MEDIA_NEXT_TRACK , VK_MEDIA_PLAY_PAUSE , VK_MEDIA_PREV_TRACK ,
4040 VK_MEDIA_STOP , VK_MENU , VK_MODECHANGE , VK_MULTIPLY , VK_NEXT , VK_NONCONVERT , VK_NUMLOCK ,
4141 VK_NUMPAD0 , VK_NUMPAD1 , VK_NUMPAD2 , VK_NUMPAD3 , VK_NUMPAD4 , VK_NUMPAD5 , VK_NUMPAD6 , VK_NUMPAD7 ,
4242 VK_NUMPAD8 , VK_NUMPAD9 , VK_OEM_ATTN , VK_OEM_CLEAR , VK_PAUSE , VK_PLAY , VK_PRINT , VK_PRIOR ,
@@ -562,6 +562,30 @@ impl KeyboardState {
562562 }
563563 }
564564
565+ /// The same as [Self::get_modifiers()], but it reads the Ctrl and Shift state from a mouse
566+ /// event's wParam parameter. Saves two calls to [GetKeyState()].
567+ pub ( crate ) fn get_modifiers_from_mouse_wparam ( & self , wparam : WPARAM ) -> Modifiers {
568+ unsafe {
569+ let mut modifiers = Modifiers :: empty ( ) ;
570+ for & ( vk, modifier, mask) in MODIFIER_MAP {
571+ let modifier_active = match modifier {
572+ Modifiers :: CONTROL => wparam & MK_CONTROL != 0 ,
573+ Modifiers :: SHIFT => wparam & MK_SHIFT != 0 ,
574+ _ => GetKeyState ( vk) & mask != 0 ,
575+ } ;
576+
577+ if modifier_active {
578+ modifiers |= modifier;
579+ }
580+ }
581+ if self . has_altgr && GetKeyState ( VK_RMENU ) & 0x80 != 0 {
582+ modifiers |= Modifiers :: ALT_GRAPH ;
583+ modifiers &= !( Modifiers :: CONTROL | Modifiers :: ALT ) ;
584+ }
585+ modifiers
586+ }
587+ }
588+
565589 /// Load a keyboard layout.
566590 ///
567591 /// We need to retain a map of virtual key codes in various modifier
0 commit comments