@@ -20,13 +20,13 @@ use super::app_state::ApplicationDelegate;
20
20
use super :: cursor:: { default_cursor, invisible_cursor} ;
21
21
use super :: event:: {
22
22
code_to_key, code_to_location, create_key_event, event_mods, lalt_pressed, ralt_pressed,
23
- scancode_to_physicalkey,
23
+ scancode_to_physicalkey, KeyEventExtra ,
24
24
} ;
25
25
use super :: window:: WinitWindow ;
26
26
use super :: DEVICE_ID ;
27
27
use crate :: dpi:: { LogicalPosition , LogicalSize } ;
28
28
use crate :: event:: {
29
- DeviceEvent , ElementState , Ime , Modifiers , MouseButton , MouseScrollDelta , TouchPhase ,
29
+ DeviceEvent , ElementState , Ime , KeyEvent , Modifiers , MouseButton , MouseScrollDelta , TouchPhase ,
30
30
WindowEvent ,
31
31
} ;
32
32
use crate :: keyboard:: { Key , KeyCode , KeyLocation , ModifiersState , NamedKey } ;
@@ -482,7 +482,7 @@ declare_class!(
482
482
} ;
483
483
484
484
if !had_ime_input || self . ivars( ) . forward_key_to_app. get( ) {
485
- let key_event = create_key_event( & event, true , unsafe { event. isARepeat( ) } , None ) ;
485
+ let key_event = create_key_event( & event, true , unsafe { event. isARepeat( ) } ) ;
486
486
self . queue_event( WindowEvent :: KeyboardInput {
487
487
device_id: DEVICE_ID ,
488
488
event: key_event,
@@ -505,7 +505,7 @@ declare_class!(
505
505
) {
506
506
self . queue_event( WindowEvent :: KeyboardInput {
507
507
device_id: DEVICE_ID ,
508
- event: create_key_event( & event, false , false , None ) ,
508
+ event: create_key_event( & event, false , false ) ,
509
509
is_synthetic: false ,
510
510
} ) ;
511
511
}
@@ -552,7 +552,7 @@ declare_class!(
552
552
. expect( "could not find current event" ) ;
553
553
554
554
self . update_modifiers( & event, false ) ;
555
- let event = create_key_event( & event, true , unsafe { event. isARepeat( ) } , None ) ;
555
+ let event = create_key_event( & event, true , unsafe { event. isARepeat( ) } ) ;
556
556
557
557
self . queue_event( WindowEvent :: KeyboardInput {
558
558
device_id: DEVICE_ID ,
@@ -933,22 +933,36 @@ impl WinitView {
933
933
let scancode = unsafe { ns_event. keyCode ( ) } ;
934
934
let physical_key = scancode_to_physicalkey ( scancode as u32 ) ;
935
935
936
- // We'll correct the `is_press` later.
937
- let mut event = create_key_event ( ns_event, false , false , Some ( physical_key) ) ;
938
-
939
- let key = code_to_key ( physical_key, scancode) ;
936
+ let logical_key = code_to_key ( physical_key, scancode) ;
940
937
// Ignore processing of unknown modifiers because we can't determine whether
941
938
// it was pressed or release reliably.
942
- let Some ( event_modifier) = key_to_modifier ( & key) else {
939
+ //
940
+ // Furthermore, sometimes normal keys are reported inside flagsChanged:, such as
941
+ // when holding Caps Lock while pressing another key, see:
942
+ // https://github.com/alacritty/alacritty/issues/8268
943
+ let Some ( event_modifier) = key_to_modifier ( & logical_key) else {
943
944
break ' send_event;
944
945
} ;
945
- event. physical_key = physical_key;
946
- event. logical_key = key. clone ( ) ;
947
- event. location = code_to_location ( physical_key) ;
946
+
947
+ let mut event = KeyEvent {
948
+ location : code_to_location ( physical_key) ,
949
+ logical_key : logical_key. clone ( ) ,
950
+ physical_key,
951
+ repeat : false ,
952
+ // We'll correct this later.
953
+ state : Pressed ,
954
+ text : None ,
955
+ platform_specific : KeyEventExtra {
956
+ text_with_all_modifiers : None ,
957
+ key_without_modifiers : logical_key. clone ( ) ,
958
+ } ,
959
+ } ;
960
+
948
961
let location_mask = ModLocationMask :: from_location ( event. location ) ;
949
962
950
963
let mut phys_mod_state = self . ivars ( ) . phys_modifiers . borrow_mut ( ) ;
951
- let phys_mod = phys_mod_state. entry ( key) . or_insert ( ModLocationMask :: empty ( ) ) ;
964
+ let phys_mod =
965
+ phys_mod_state. entry ( logical_key) . or_insert ( ModLocationMask :: empty ( ) ) ;
952
966
953
967
let is_active = current_modifiers. state ( ) . contains ( event_modifier) ;
954
968
let mut events = VecDeque :: with_capacity ( 2 ) ;
0 commit comments