1919
2020use std:: cmp:: Ordering ;
2121use std:: collections:: { HashMap , HashSet } ;
22- use std:: convert:: TryInto ;
2322use std:: mem;
2423use std:: ops:: RangeInclusive ;
2524
@@ -29,15 +28,15 @@ use winapi::shared::minwindef::{HKL, INT, LPARAM, UINT, WPARAM};
2928use winapi:: shared:: ntdef:: SHORT ;
3029use winapi:: shared:: windef:: HWND ;
3130use winapi:: um:: winuser:: {
32- GetKeyState , GetKeyboardLayout , MapVirtualKeyExW , PeekMessageW , ToUnicodeEx , VkKeyScanW ,
33- MAPVK_VK_TO_CHAR , MAPVK_VSC_TO_VK_EX , PM_NOREMOVE , VK_ACCEPT , VK_ADD , VK_APPS , VK_ATTN ,
34- VK_BACK , VK_BROWSER_BACK , VK_BROWSER_FAVORITES , VK_BROWSER_FORWARD , VK_BROWSER_HOME ,
35- VK_BROWSER_REFRESH , VK_BROWSER_SEARCH , VK_BROWSER_STOP , VK_CANCEL , VK_CAPITAL , VK_CLEAR ,
36- VK_CONTROL , VK_CONVERT , VK_CRSEL , VK_DECIMAL , VK_DELETE , VK_DIVIDE , VK_DOWN , VK_END , VK_EREOF ,
37- VK_ESCAPE , VK_EXECUTE , VK_EXSEL , VK_F1 , VK_F10 , VK_F11 , VK_F12 , VK_F2 , VK_F3 , VK_F4 , VK_F5 ,
38- VK_F6 , VK_F7 , VK_F8 , VK_F9 , VK_FINAL , VK_HELP , VK_HOME , VK_INSERT , VK_JUNJA , VK_KANA , VK_KANJI ,
39- VK_LAUNCH_APP1 , VK_LAUNCH_APP2 , VK_LAUNCH_MAIL , VK_LAUNCH_MEDIA_SELECT , VK_LCONTROL , VK_LEFT ,
40- VK_LMENU , VK_LSHIFT , VK_LWIN , VK_MEDIA_NEXT_TRACK , VK_MEDIA_PLAY_PAUSE , VK_MEDIA_PREV_TRACK ,
31+ 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 ,
4140 VK_MEDIA_STOP , VK_MENU , VK_MODECHANGE , VK_MULTIPLY , VK_NEXT , VK_NONCONVERT , VK_NUMLOCK ,
4241 VK_NUMPAD0 , VK_NUMPAD1 , VK_NUMPAD2 , VK_NUMPAD3 , VK_NUMPAD4 , VK_NUMPAD5 , VK_NUMPAD6 , VK_NUMPAD7 ,
4342 VK_NUMPAD8 , VK_NUMPAD9 , VK_OEM_ATTN , VK_OEM_CLEAR , VK_PAUSE , VK_PLAY , VK_PRINT , VK_PRIOR ,
@@ -344,110 +343,6 @@ fn vk_to_key(vk: VkCode) -> Option<Key> {
344343 } )
345344}
346345
347- /// Convert a key to a virtual key code.
348- ///
349- /// The virtual key code is needed in various winapi interfaces, including
350- /// accelerators. This provides the virtual key code in the current keyboard
351- /// map.
352- ///
353- /// The virtual key code can have modifiers in the higher order byte when the
354- /// argument is a `Character` variant. See:
355- /// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-vkkeyscanw
356- pub ( crate ) fn key_to_vk ( key : & Key ) -> Option < i32 > {
357- Some ( match key {
358- Key :: Character ( s) => {
359- if let Some ( code_point) = s. chars ( ) . next ( ) {
360- if let Ok ( wchar) = ( code_point as u32 ) . try_into ( ) {
361- unsafe { VkKeyScanW ( wchar) as i32 }
362- } else {
363- return None ;
364- }
365- } else {
366- return None ;
367- }
368- }
369- Key :: Cancel => VK_CANCEL ,
370- Key :: Backspace => VK_BACK ,
371- Key :: Tab => VK_TAB ,
372- Key :: Clear => VK_CLEAR ,
373- Key :: Enter => VK_RETURN ,
374- Key :: Shift => VK_SHIFT ,
375- Key :: Control => VK_CONTROL ,
376- Key :: Alt => VK_MENU ,
377- Key :: Pause => VK_PAUSE ,
378- Key :: CapsLock => VK_CAPITAL ,
379- // TODO: disambiguate kana and hangul? same vk
380- Key :: KanaMode => VK_KANA ,
381- Key :: JunjaMode => VK_JUNJA ,
382- Key :: FinalMode => VK_FINAL ,
383- Key :: KanjiMode => VK_KANJI ,
384- Key :: Escape => VK_ESCAPE ,
385- Key :: NonConvert => VK_NONCONVERT ,
386- Key :: Accept => VK_ACCEPT ,
387- Key :: PageUp => VK_PRIOR ,
388- Key :: PageDown => VK_NEXT ,
389- Key :: End => VK_END ,
390- Key :: Home => VK_HOME ,
391- Key :: ArrowLeft => VK_LEFT ,
392- Key :: ArrowUp => VK_UP ,
393- Key :: ArrowRight => VK_RIGHT ,
394- Key :: ArrowDown => VK_DOWN ,
395- Key :: Select => VK_SELECT ,
396- Key :: Print => VK_PRINT ,
397- Key :: Execute => VK_EXECUTE ,
398- Key :: PrintScreen => VK_SNAPSHOT ,
399- Key :: Insert => VK_INSERT ,
400- Key :: Delete => VK_DELETE ,
401- Key :: Help => VK_HELP ,
402- Key :: Meta => VK_LWIN ,
403- Key :: ContextMenu => VK_APPS ,
404- Key :: Standby => VK_SLEEP ,
405- Key :: F1 => VK_F1 ,
406- Key :: F2 => VK_F2 ,
407- Key :: F3 => VK_F3 ,
408- Key :: F4 => VK_F4 ,
409- Key :: F5 => VK_F5 ,
410- Key :: F6 => VK_F6 ,
411- Key :: F7 => VK_F7 ,
412- Key :: F8 => VK_F8 ,
413- Key :: F9 => VK_F9 ,
414- Key :: F10 => VK_F10 ,
415- Key :: F11 => VK_F11 ,
416- Key :: F12 => VK_F12 ,
417- Key :: NumLock => VK_NUMLOCK ,
418- Key :: ScrollLock => VK_SCROLL ,
419- Key :: BrowserBack => VK_BROWSER_BACK ,
420- Key :: BrowserForward => VK_BROWSER_FORWARD ,
421- Key :: BrowserRefresh => VK_BROWSER_REFRESH ,
422- Key :: BrowserStop => VK_BROWSER_STOP ,
423- Key :: BrowserSearch => VK_BROWSER_SEARCH ,
424- Key :: BrowserFavorites => VK_BROWSER_FAVORITES ,
425- Key :: BrowserHome => VK_BROWSER_HOME ,
426- Key :: AudioVolumeMute => VK_VOLUME_MUTE ,
427- Key :: AudioVolumeDown => VK_VOLUME_DOWN ,
428- Key :: AudioVolumeUp => VK_VOLUME_UP ,
429- Key :: MediaTrackNext => VK_MEDIA_NEXT_TRACK ,
430- Key :: MediaTrackPrevious => VK_MEDIA_PREV_TRACK ,
431- Key :: MediaStop => VK_MEDIA_STOP ,
432- Key :: MediaPlayPause => VK_MEDIA_PLAY_PAUSE ,
433- Key :: LaunchMail => VK_LAUNCH_MAIL ,
434- Key :: LaunchMediaPlayer => VK_LAUNCH_MEDIA_SELECT ,
435- Key :: LaunchApplication1 => VK_LAUNCH_APP1 ,
436- Key :: LaunchApplication2 => VK_LAUNCH_APP2 ,
437- Key :: Alphanumeric => VK_OEM_ATTN ,
438- Key :: Convert => VK_CONVERT ,
439- Key :: ModeChange => VK_MODECHANGE ,
440- Key :: Process => VK_PROCESSKEY ,
441- Key :: Attn => VK_ATTN ,
442- Key :: CrSel => VK_CRSEL ,
443- Key :: ExSel => VK_EXSEL ,
444- Key :: EraseEof => VK_EREOF ,
445- Key :: Play => VK_PLAY ,
446- Key :: ZoomToggle => VK_ZOOM ,
447- _ => return None ,
448- } )
449- }
450-
451346fn code_unit_to_key ( code_unit : u32 ) -> Key {
452347 match code_unit {
453348 0x8 | 0x7F => Key :: Backspace ,
@@ -692,6 +587,7 @@ impl KeyboardState {
692587 key_state[ VK_LCONTROL as usize ] = if has_altgr { 0x80 } else { 0 } ;
693588 key_state[ VK_MENU as usize ] = if has_altgr { 0x80 } else { 0 } ;
694589 key_state[ VK_RMENU as usize ] = if has_altgr { 0x80 } else { 0 } ;
590+ #[ allow( clippy:: iter_overeager_cloned) ]
695591 for vk in PRINTABLE_VKS . iter ( ) . cloned ( ) . flatten ( ) {
696592 let ret = ToUnicodeEx (
697593 vk as UINT ,
0 commit comments