From fc8a008b25bc6295eb82d2f075a2a87324be9248 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Tue, 5 Mar 2024 14:27:40 +0400 Subject: [PATCH] chore(wayland): don't reapply same cursor grab Some compositors break when re-taking the same grab. Closes: https://github.com/rust-windowing/winit/issues/3566 --- CHANGELOG.md | 1 + src/platform_impl/linux/wayland/window/state.rs | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ac0f45b..0f711b39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Unreleased` header. # Unreleased +- On Wayland, don't reapply cursor grab when unchanged. - Move `dpi` types to its own crate, and re-export it from the root crate. - Implement `Sync` for `EventLoopProxy`. - **Breaking:** Move `Window::new` to `ActiveEventLoop::create_window` and `EventLoop::create_window` (with the latter being deprecated). diff --git a/src/platform_impl/linux/wayland/window/state.rs b/src/platform_impl/linux/wayland/window/state.rs index a00ddb52..ef84f559 100644 --- a/src/platform_impl/linux/wayland/window/state.rs +++ b/src/platform_impl/linux/wayland/window/state.rs @@ -826,9 +826,14 @@ impl WindowState { /// Set the cursor grabbing state on the top-level. pub fn set_cursor_grab(&mut self, mode: CursorGrabMode) -> Result<(), ExternalError> { - // Replace the user grabbing mode. + if self.cursor_grab_mode.user_grab_mode == mode { + return Ok(()); + } + + self.set_cursor_grab_inner(mode)?; + // Update user grab on success. self.cursor_grab_mode.user_grab_mode = mode; - self.set_cursor_grab_inner(mode) + Ok(()) } /// Reload the hints for minimum and maximum sizes.