Skip to content

Commit 613e995

Browse files
bolphennot-fl3
authored andcommitted
native/linux_wayland: Fix keymods for key repeat
1 parent 75c5673 commit 613e995

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

src/native/linux_wayland.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl WaylandPayload {
111111
for _ in 0..count[0] {
112112
self.keyboard_context.generate_key_repeat_events(
113113
&mut self.xkb,
114-
self.keymap.xkb_keymap,
114+
&self.keymap,
115115
self.xkb_state,
116116
&mut self.events,
117117
);
@@ -225,7 +225,6 @@ struct KeyboardContext {
225225
/// This is the actual key being sent by Wayland, not `keysym` or Miniquad `Keycode`
226226
repeated_key: Option<core::ffi::c_uint>,
227227
timerfd: core::ffi::c_int,
228-
keymods: KeyMods,
229228
}
230229

231230
fn new_itimerspec() -> libc::itimerspec {
@@ -248,7 +247,6 @@ impl KeyboardContext {
248247
repeat_info: Default::default(),
249248
repeated_key: None,
250249
timerfd: unsafe { libc::timerfd_create(libc::CLOCK_MONOTONIC, libc::TFD_CLOEXEC) },
251-
keymods: Default::default(),
252250
}
253251
}
254252
fn track_key_down(&mut self, key: core::ffi::c_uint) {
@@ -278,34 +276,36 @@ impl KeyboardContext {
278276
unsafe fn generate_key_repeat_events(
279277
&self,
280278
libxkb: &mut LibXkbCommon,
281-
xkb_keymap: *mut xkb_keymap,
279+
keymap: &XkbKeymap,
282280
xkb_state: *mut xkb_state,
283281
events: &mut Vec<WaylandEvent>,
284282
) {
285283
if let Some(key) = self.repeated_key {
286-
self.generate_key_events(libxkb, xkb_keymap, xkb_state, key, true, events)
284+
self.generate_key_events(libxkb, keymap, xkb_state, key, true, events)
287285
}
288286
}
289287
unsafe fn generate_key_events(
290288
&self,
291289
libxkb: &mut LibXkbCommon,
292-
xkb_keymap: *mut xkb_keymap,
290+
keymap: &XkbKeymap,
293291
xkb_state: *mut xkb_state,
294292
key: core::ffi::c_uint,
295293
repeat: bool,
296294
events: &mut Vec<WaylandEvent>,
297295
) {
296+
let keymods = keymap.get_keymods(libxkb, xkb_state);
297+
298298
// The keycodes in Miniquad are obtained without modifiers
299-
let keysym = libxkb.keymap_key_get_sym_without_mod(xkb_keymap, key + 8);
299+
let keysym = libxkb.keymap_key_get_sym_without_mod(keymap.xkb_keymap, key + 8);
300300
let keycode = keycodes::translate_keysym(keysym);
301-
events.push(WaylandEvent::KeyDown(keycode, self.keymods, repeat));
301+
events.push(WaylandEvent::KeyDown(keycode, keymods, repeat));
302302

303303
// To obtain the underlying character, we do need to provide the modifiers
304304
let keysym = (libxkb.xkb_state_key_get_one_sym)(xkb_state, key + 8);
305305
let chr = (libxkb.xkb_keysym_to_utf32)(keysym);
306306
if chr > 0 {
307307
if let Some(chr) = char::from_u32(chr) {
308-
events.push(WaylandEvent::Char(chr, self.keymods, repeat));
308+
events.push(WaylandEvent::Char(chr, keymods, repeat));
309309
}
310310
}
311311
}
@@ -595,7 +595,6 @@ unsafe extern "C" fn keyboard_handle_leave(
595595
// Clear modifiers
596596
let display: &mut WaylandPayload = &mut *(data as *mut _);
597597
(display.xkb.xkb_state_update_mask)(display.xkb_state, 0, 0, 0, 0, 0, 0);
598-
display.keyboard_context.keymods = KeyMods::default();
599598
display.keyboard_context.repeated_key = None;
600599
display.keyboard_context.enter_serial = None;
601600
display.events.push(WaylandEvent::WindowMinimized);
@@ -617,7 +616,6 @@ unsafe extern "C" fn keyboard_handle_key(
617616
let keysym = libxkb.keymap_key_get_sym_without_mod(xkb_keymap, key + 8);
618617
let keycode = keycodes::translate_keysym(keysym);
619618
let keymods = display.keymap.get_keymods(libxkb, xkb_state);
620-
display.keyboard_context.keymods = keymods;
621619
match state {
622620
0 => {
623621
display.keyboard_context.track_key_up(key);
@@ -631,7 +629,7 @@ unsafe extern "C" fn keyboard_handle_key(
631629
}
632630
display.keyboard_context.generate_key_events(
633631
libxkb,
634-
xkb_keymap,
632+
&display.keymap,
635633
xkb_state,
636634
key,
637635
repeat,

0 commit comments

Comments
 (0)