From ec30b8004f18ca0a2352172fa47ca90bad2f2ad6 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 25 Sep 2025 15:38:16 -0400 Subject: [PATCH] fix: window state events --- winit-core/src/event.rs | 5 +++++ winit-wayland/src/event_loop/mod.rs | 5 +++++ winit-wayland/src/state.rs | 10 ++++++++++ winit-wayland/src/window/mod.rs | 5 +++++ winit/examples/application.rs | 4 +++- 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/winit-core/src/event.rs b/winit-core/src/event.rs index 9e0540cf..ade39acf 100644 --- a/winit-core/src/event.rs +++ b/winit-core/src/event.rs @@ -375,6 +375,11 @@ pub enum WindowEvent { /// - **iOS / Android / Web / Orbital / Windows:** Unsupported. SuggestedBounds(Option>), + /// The window state has changed. + /// + /// - **iOS / Android / Web / Orbital / Windows:** Unsupported. + WindowStateChanged, + /// The system window theme has changed. /// /// Applications might wish to react to this to change the theme of the content of the window diff --git a/winit-wayland/src/event_loop/mod.rs b/winit-wayland/src/event_loop/mod.rs index 155d2db6..555ab7d1 100644 --- a/winit-wayland/src/event_loop/mod.rs +++ b/winit-wayland/src/event_loop/mod.rs @@ -395,6 +395,11 @@ impl EventLoop { app.window_event(&self.active_event_loop, window_id, event); } + if compositor_update.xdg_window_state.is_some() { + let event = WindowEvent::WindowStateChanged; + app.window_event(&self.active_event_loop, window_id, event); + } + // NOTE: Rescale changed the physical size which winit operates in, thus we should // resize. if compositor_update.resized || compositor_update.scale_changed { diff --git a/winit-wayland/src/state.rs b/winit-wayland/src/state.rs index 68d911d3..8ff513cc 100644 --- a/winit-wayland/src/state.rs +++ b/winit-wayland/src/state.rs @@ -313,6 +313,12 @@ impl WindowHandler for WinitState { self.window_compositor_updates[pos].suggested_bounds |= configure.suggested_bounds != winit_window.last_configure.as_ref().and_then(|last| last.suggested_bounds); + self.window_compositor_updates[pos].xdg_window_state = winit_window + .last_configure + .as_ref() + .is_none_or(|last| last.state != configure.state) + .then_some(configure.state); + self.window_compositor_updates[pos].resized |= winit_window.configure(configure, &self.shm, &self.subcompositor_state); @@ -445,6 +451,9 @@ pub struct WindowCompositorUpdate { /// New suggested bounds. pub suggested_bounds: bool, + + /// New xdg window state. + pub xdg_window_state: Option, } impl WindowCompositorUpdate { @@ -455,6 +464,7 @@ impl WindowCompositorUpdate { scale_changed: false, close_window: false, suggested_bounds: false, + xdg_window_state: None, } } } diff --git a/winit-wayland/src/window/mod.rs b/winit-wayland/src/window/mod.rs index 44d93011..a2f5ca30 100644 --- a/winit-wayland/src/window/mod.rs +++ b/winit-wayland/src/window/mod.rs @@ -252,6 +252,11 @@ impl Window { pub fn surface(&self) -> &WlSurface { self.window.wl_surface() } + + #[inline] + pub fn xdg_window_state(&self) -> Option { + self.window_state.lock().unwrap().last_configure.as_ref().map(|c| c.state) + } } impl Drop for Window { diff --git a/winit/examples/application.rs b/winit/examples/application.rs index dc432bb0..573f228e 100644 --- a/winit/examples/application.rs +++ b/winit/examples/application.rs @@ -557,7 +557,9 @@ impl ApplicationHandler for Application { | WindowEvent::DragDropped { .. } | WindowEvent::Destroyed | WindowEvent::Ime(_) - | WindowEvent::Moved(_) => (), + | WindowEvent::Moved(_) + | WindowEvent::SuggestedBounds(_) + | WindowEvent::WindowStateChanged => (), } }