@@ -26,6 +26,7 @@ pub(crate) const WM_GPUI_DOCK_MENU_ACTION: u32 = WM_USER + 4;
2626pub ( crate ) const WM_GPUI_FORCE_UPDATE_WINDOW : u32 = WM_USER + 5 ;
2727pub ( crate ) const WM_GPUI_KEYBOARD_LAYOUT_CHANGED : u32 = WM_USER + 6 ;
2828pub ( crate ) const WM_GPUI_GPU_DEVICE_LOST : u32 = WM_USER + 7 ;
29+ pub ( crate ) const WM_GPUI_KEYDOWN : u32 = WM_USER + 8 ;
2930
3031const SIZE_MOVE_LOOP_TIMER_ID : usize = 1 ;
3132const AUTO_HIDE_TASKBAR_THICKNESS_PX : i32 = 1 ;
@@ -92,13 +93,10 @@ impl WindowsWindowInner {
9293 }
9394 WM_MOUSEWHEEL => self . handle_mouse_wheel_msg ( handle, wparam, lparam) ,
9495 WM_MOUSEHWHEEL => self . handle_mouse_horizontal_wheel_msg ( handle, wparam, lparam) ,
95- WM_SYSKEYDOWN => self . handle_syskeydown_msg ( handle, wparam, lparam) ,
96- WM_SYSKEYUP => self . handle_syskeyup_msg ( handle, wparam, lparam) ,
97- WM_SYSCOMMAND => self . handle_system_command ( wparam) ,
98- WM_KEYDOWN => self . handle_keydown_msg ( handle, wparam, lparam) ,
99- WM_KEYUP => self . handle_keyup_msg ( handle, wparam, lparam) ,
96+ WM_SYSKEYUP => self . handle_syskeyup_msg ( wparam, lparam) ,
97+ WM_KEYUP => self . handle_keyup_msg ( wparam, lparam) ,
98+ WM_GPUI_KEYDOWN => self . handle_keydown_msg ( wparam, lparam) ,
10099 WM_CHAR => self . handle_char_msg ( wparam) ,
101- WM_DEADCHAR => self . handle_dead_char_msg ( wparam) ,
102100 WM_IME_STARTCOMPOSITION => self . handle_ime_position ( handle) ,
103101 WM_IME_COMPOSITION => self . handle_ime_composition ( handle, lparam) ,
104102 WM_SETCURSOR => self . handle_set_cursor ( handle, lparam) ,
@@ -327,35 +325,9 @@ impl WindowsWindowInner {
327325 Some ( 0 )
328326 }
329327
330- fn handle_syskeydown_msg ( & self , handle : HWND , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
328+ fn handle_syskeyup_msg ( & self , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
331329 let mut lock = self . state . borrow_mut ( ) ;
332- let input = handle_key_event ( handle, wparam, lparam, & mut lock, |keystroke| {
333- PlatformInput :: KeyDown ( KeyDownEvent {
334- keystroke,
335- is_held : lparam. 0 & ( 0x1 << 30 ) > 0 ,
336- } )
337- } ) ?;
338- let mut func = lock. callbacks . input . take ( ) ?;
339- drop ( lock) ;
340-
341- let handled = !func ( input) . propagate ;
342-
343- let mut lock = self . state . borrow_mut ( ) ;
344- lock. callbacks . input = Some ( func) ;
345-
346- if handled {
347- lock. system_key_handled = true ;
348- Some ( 0 )
349- } else {
350- // we need to call `DefWindowProcW`, or we will lose the system-wide `Alt+F4`, `Alt+{other keys}`
351- // shortcuts.
352- None
353- }
354- }
355-
356- fn handle_syskeyup_msg ( & self , handle : HWND , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
357- let mut lock = self . state . borrow_mut ( ) ;
358- let input = handle_key_event ( handle, wparam, lparam, & mut lock, |keystroke| {
330+ let input = handle_key_event ( wparam, lparam, & mut lock, |keystroke| {
359331 PlatformInput :: KeyUp ( KeyUpEvent { keystroke } )
360332 } ) ?;
361333 let mut func = lock. callbacks . input . take ( ) ?;
@@ -369,9 +341,9 @@ impl WindowsWindowInner {
369341
370342 // It's a known bug that you can't trigger `ctrl-shift-0`. See:
371343 // https://superuser.com/questions/1455762/ctrl-shift-number-key-combination-has-stopped-working-for-a-few-numbers
372- fn handle_keydown_msg ( & self , handle : HWND , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
344+ fn handle_keydown_msg ( & self , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
373345 let mut lock = self . state . borrow_mut ( ) ;
374- let Some ( input) = handle_key_event ( handle , wparam, lparam, & mut lock, |keystroke| {
346+ let Some ( input) = handle_key_event ( wparam, lparam, & mut lock, |keystroke| {
375347 PlatformInput :: KeyDown ( KeyDownEvent {
376348 keystroke,
377349 is_held : lparam. 0 & ( 0x1 << 30 ) > 0 ,
@@ -381,15 +353,6 @@ impl WindowsWindowInner {
381353 } ;
382354 drop ( lock) ;
383355
384- let is_composing = self
385- . with_input_handler ( |input_handler| input_handler. marked_text_range ( ) )
386- . flatten ( )
387- . is_some ( ) ;
388- if is_composing {
389- translate_message ( handle, wparam, lparam) ;
390- return Some ( 0 ) ;
391- }
392-
393356 let Some ( mut func) = self . state . borrow_mut ( ) . callbacks . input . take ( ) else {
394357 return Some ( 1 ) ;
395358 } ;
@@ -398,17 +361,12 @@ impl WindowsWindowInner {
398361
399362 self . state . borrow_mut ( ) . callbacks . input = Some ( func) ;
400363
401- if handled {
402- Some ( 0 )
403- } else {
404- translate_message ( handle, wparam, lparam) ;
405- Some ( 1 )
406- }
364+ if handled { Some ( 0 ) } else { Some ( 1 ) }
407365 }
408366
409- fn handle_keyup_msg ( & self , handle : HWND , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
367+ fn handle_keyup_msg ( & self , wparam : WPARAM , lparam : LPARAM ) -> Option < isize > {
410368 let mut lock = self . state . borrow_mut ( ) ;
411- let Some ( input) = handle_key_event ( handle , wparam, lparam, & mut lock, |keystroke| {
369+ let Some ( input) = handle_key_event ( wparam, lparam, & mut lock, |keystroke| {
412370 PlatformInput :: KeyUp ( KeyUpEvent { keystroke } )
413371 } ) else {
414372 return Some ( 1 ) ;
@@ -434,14 +392,6 @@ impl WindowsWindowInner {
434392 Some ( 0 )
435393 }
436394
437- fn handle_dead_char_msg ( & self , wparam : WPARAM ) -> Option < isize > {
438- let ch = char:: from_u32 ( wparam. 0 as u32 ) ?. to_string ( ) ;
439- self . with_input_handler ( |input_handler| {
440- input_handler. replace_and_mark_text_in_range ( None , & ch, None ) ;
441- } ) ;
442- None
443- }
444-
445395 fn handle_mouse_down_msg (
446396 & self ,
447397 handle : HWND ,
@@ -1127,17 +1077,6 @@ impl WindowsWindowInner {
11271077 Some ( 0 )
11281078 }
11291079
1130- fn handle_system_command ( & self , wparam : WPARAM ) -> Option < isize > {
1131- if wparam. 0 == SC_KEYMENU as usize {
1132- let mut lock = self . state . borrow_mut ( ) ;
1133- if lock. system_key_handled {
1134- lock. system_key_handled = false ;
1135- return Some ( 0 ) ;
1136- }
1137- }
1138- None
1139- }
1140-
11411080 fn handle_system_theme_changed ( & self , handle : HWND , lparam : LPARAM ) -> Option < isize > {
11421081 // lParam is a pointer to a string that indicates the area containing the system parameter
11431082 // that was changed.
@@ -1281,23 +1220,7 @@ impl WindowsWindowInner {
12811220 }
12821221}
12831222
1284- #[ inline]
1285- fn translate_message ( handle : HWND , wparam : WPARAM , lparam : LPARAM ) {
1286- let msg = MSG {
1287- hwnd : handle,
1288- message : WM_KEYDOWN ,
1289- wParam : wparam,
1290- lParam : lparam,
1291- // It seems like leaving the following two parameters empty doesn't break key events, they still work as expected.
1292- // But if any bugs pop up after this PR, this is probably the place to look first.
1293- time : 0 ,
1294- pt : POINT :: default ( ) ,
1295- } ;
1296- unsafe { TranslateMessage ( & msg) . ok ( ) . log_err ( ) } ;
1297- }
1298-
12991223fn handle_key_event < F > (
1300- handle : HWND ,
13011224 wparam : WPARAM ,
13021225 lparam : LPARAM ,
13031226 state : & mut WindowsWindowState ,
@@ -1323,10 +1246,7 @@ where
13231246 capslock : current_capslock ( ) ,
13241247 } ) )
13251248 }
1326- VK_PACKET => {
1327- translate_message ( handle, wparam, lparam) ;
1328- None
1329- }
1249+ VK_PACKET => None ,
13301250 VK_CAPITAL => {
13311251 let capslock = current_capslock ( ) ;
13321252 if state
@@ -1342,11 +1262,6 @@ where
13421262 } ) )
13431263 }
13441264 vkey => {
1345- let vkey = if vkey == VK_PROCESSKEY {
1346- VIRTUAL_KEY ( unsafe { ImmGetVirtualKey ( handle) } as u16 )
1347- } else {
1348- vkey
1349- } ;
13501265 let keystroke = parse_normal_key ( vkey, lparam, modifiers) ?;
13511266 Some ( f ( keystroke) )
13521267 }
@@ -1460,25 +1375,11 @@ fn is_virtual_key_pressed(vkey: VIRTUAL_KEY) -> bool {
14601375 unsafe { GetKeyState ( vkey. 0 as i32 ) < 0 }
14611376}
14621377
1463- fn keyboard_uses_altgr ( ) -> bool {
1464- use crate :: platform:: windows:: keyboard:: WindowsKeyboardLayout ;
1465- WindowsKeyboardLayout :: new ( )
1466- . map ( |layout| layout. uses_altgr ( ) )
1467- . unwrap_or ( false )
1468- }
1469-
14701378#[ inline]
14711379pub ( crate ) fn current_modifiers ( ) -> Modifiers {
1472- let lmenu_pressed = is_virtual_key_pressed ( VK_LMENU ) ;
1473- let rmenu_pressed = is_virtual_key_pressed ( VK_RMENU ) ;
1474- let lcontrol_pressed = is_virtual_key_pressed ( VK_LCONTROL ) ;
1475-
1476- // Only treat right Alt + left Ctrl as AltGr on keyboards that actually use it
1477- let altgr = keyboard_uses_altgr ( ) && rmenu_pressed && lcontrol_pressed;
1478-
14791380 Modifiers {
1480- control : is_virtual_key_pressed ( VK_CONTROL ) && !altgr ,
1481- alt : ( lmenu_pressed || rmenu_pressed ) && !altgr ,
1381+ control : is_virtual_key_pressed ( VK_CONTROL ) ,
1382+ alt : is_virtual_key_pressed ( VK_MENU ) ,
14821383 shift : is_virtual_key_pressed ( VK_SHIFT ) ,
14831384 platform : is_virtual_key_pressed ( VK_LWIN ) || is_virtual_key_pressed ( VK_RWIN ) ,
14841385 function : false ,
0 commit comments