@@ -606,6 +606,7 @@ pub trait KeyboardGrab<D: SeatHandler>: Downcast {
606606 modifiers : Option < ModifiersState > ,
607607 serial : Serial ,
608608 time : u32 ,
609+ ignore_keymap : bool ,
609610 ) ;
610611
611612 /// A focus change was requested.
@@ -934,7 +935,8 @@ impl<D: SeatHandler + 'static> KeyboardHandle<D> {
934935 /// Handle a keystroke
935936 ///
936937 /// All keystrokes from the input backend should be fed _in order_ to this method of the
937- /// keyboard handler. It will internally track the state of the keymap.
938+ /// keyboard handler. It will internally track the state of the keymap. But you could ignore
939+ /// it by setting ignore_keymap true.
938940 ///
939941 /// The `filter` argument is expected to be a closure which will peek at the generated input
940942 /// as interpreted by the keymap before it is forwarded to the focused client. If this closure
@@ -953,6 +955,7 @@ impl<D: SeatHandler + 'static> KeyboardHandle<D> {
953955 serial : Serial ,
954956 time : u32 ,
955957 filter : F ,
958+ ignore_keymap : bool ,
956959 ) -> Option < T >
957960 where
958961 F : FnOnce ( & mut D , & ModifiersState , KeysymHandle < ' _ > ) -> FilterResult < T > ,
@@ -964,7 +967,7 @@ impl<D: SeatHandler + 'static> KeyboardHandle<D> {
964967 return Some ( val) ;
965968 }
966969
967- self . input_forward ( data, keycode, state, serial, time, mods_changed) ;
970+ self . input_forward ( data, keycode, state, serial, time, mods_changed, ignore_keymap ) ;
968971 None
969972 }
970973
@@ -1018,6 +1021,7 @@ impl<D: SeatHandler + 'static> KeyboardHandle<D> {
10181021 serial : Serial ,
10191022 time : u32 ,
10201023 mods_changed : bool ,
1024+ ignore_keymap : bool ,
10211025 ) {
10221026 let mut guard = self . arc . internal . lock ( ) . unwrap ( ) ;
10231027 match state {
@@ -1033,7 +1037,16 @@ impl<D: SeatHandler + 'static> KeyboardHandle<D> {
10331037 let seat = self . get_seat ( data) ;
10341038 let modifiers = mods_changed. then_some ( guard. mods_state ) ;
10351039 guard. with_grab ( data, & seat, |data, handle, grab| {
1036- grab. input ( data, handle, keycode, state, modifiers, serial, time) ;
1040+ grab. input (
1041+ data,
1042+ handle,
1043+ keycode,
1044+ state,
1045+ modifiers,
1046+ serial,
1047+ time,
1048+ ignore_keymap,
1049+ ) ;
10371050 } ) ;
10381051 if guard. focus . is_some ( ) {
10391052 trace ! ( "Input forwarded to client" ) ;
@@ -1270,6 +1283,7 @@ impl<D: SeatHandler + 'static> KeyboardInnerHandle<'_, D> {
12701283 modifiers : Option < ModifiersState > ,
12711284 serial : Serial ,
12721285 time : u32 ,
1286+ ignore_keymap : bool ,
12731287 ) {
12741288 let ( focus, _) = match self . inner . focus . as_mut ( ) {
12751289 Some ( focus) => focus,
@@ -1278,10 +1292,12 @@ impl<D: SeatHandler + 'static> KeyboardInnerHandle<'_, D> {
12781292
12791293 // Ensure keymap is up to date.
12801294 #[ cfg( feature = "wayland_frontend" ) ]
1281- if let Some ( keyboard_handle) = self . seat . get_keyboard ( ) {
1282- let keymap_file = keyboard_handle. arc . keymap . lock ( ) . unwrap ( ) ;
1283- let mods = self . inner . mods_state ;
1284- keyboard_handle. send_keymap ( data, & Some ( focus) , & keymap_file, mods) ;
1295+ if !ignore_keymap {
1296+ if let Some ( keyboard_handle) = self . seat . get_keyboard ( ) {
1297+ let keymap_file = keyboard_handle. arc . keymap . lock ( ) . unwrap ( ) ;
1298+ let mods = self . inner . mods_state ;
1299+ keyboard_handle. send_keymap ( data, & Some ( focus) , & keymap_file, mods) ;
1300+ }
12851301 }
12861302
12871303 // key event must be sent before modifiers event for libxkbcommon
@@ -1381,8 +1397,9 @@ impl<D: SeatHandler + 'static> KeyboardGrab<D> for DefaultGrab {
13811397 modifiers : Option < ModifiersState > ,
13821398 serial : Serial ,
13831399 time : u32 ,
1400+ ignore_keymap : bool ,
13841401 ) {
1385- handle. input ( data, keycode, state, modifiers, serial, time)
1402+ handle. input ( data, keycode, state, modifiers, serial, time, ignore_keymap )
13861403 }
13871404
13881405 fn set_focus (
0 commit comments