From 1e7ab0cd259b1352d3a79342f6d77bab5830609f Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Fri, 17 Oct 2025 16:18:11 +0900 Subject: [PATCH] wayland: handle wl_seat v10 repeated state Fixes #4382. --- deny.toml | 4 ++++ winit-wayland/src/seat/keyboard/mod.rs | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/deny.toml b/deny.toml index ccb71e07..7347f973 100644 --- a/deny.toml +++ b/deny.toml @@ -59,6 +59,10 @@ crate = "android-activity" allow-globs = ["ci/*", "githooks/*"] crate = "zerocopy" +[[bans.build.bypass]] +allow-globs = ["cherry-pick-stable.sh"] +crate = "libc" + [[bans.build.bypass]] allow-globs = ["freetype2/*"] crate = "freetype-sys" diff --git a/winit-wayland/src/seat/keyboard/mod.rs b/winit-wayland/src/seat/keyboard/mod.rs index f3af9149..9b1d1cd6 100644 --- a/winit-wayland/src/seat/keyboard/mod.rs +++ b/winit-wayland/src/seat/keyboard/mod.rs @@ -129,20 +129,23 @@ impl Dispatch for WinitState { state.events_sink.push_window_event(WindowEvent::Focused(false), window_id); } }, - WlKeyboardEvent::Key { key, state: WEnum::Value(WlKeyState::Pressed), .. } => { + WlKeyboardEvent::Key { key, state: WEnum::Value(key_state), .. } + if matches!(key_state, WlKeyState::Repeated | WlKeyState::Pressed) => + { let key = key + 8; - key_input( keyboard_state, &mut state.events_sink, data, key, ElementState::Pressed, - false, + key_state == WlKeyState::Repeated, ); let delay = match keyboard_state.repeat_info { RepeatInfo::Repeat { delay, .. } => delay, + // When compositor handles repeat, and thus we have `repeat = true`, we have + // repeat on our side disabled, if it's not true, it's a compositor bug. RepeatInfo::Disable => return, };