From 7993a572b02acf3ac074fb6e4b1734ab12ff3fb3 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 26 Sep 2025 15:38:59 -0400 Subject: [PATCH] fix(wayland): window resize forces corner radius update --- .../wayland/event_loop/mod.rs | 8 ++++ .../wayland/event_loop/state.rs | 40 ++++++++++++------- winit/src/platform_specific/wayland/mod.rs | 4 ++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/winit/src/platform_specific/wayland/event_loop/mod.rs b/winit/src/platform_specific/wayland/event_loop/mod.rs index f1420989..c49ca43e 100644 --- a/winit/src/platform_specific/wayland/event_loop/mod.rs +++ b/winit/src/platform_specific/wayland/event_loop/mod.rs @@ -123,6 +123,14 @@ impl SctkEventLoop { log::warn!("{err:?}"); } } + crate::platform_specific::Action::ResizeWindow(id) => { + if let Some((_, v)) = state.windows.iter() + .find(|w| w.id == id) + .map(|w| w.corner_radius.as_ref()) + .unwrap_or_default() { + _ = state.handle_action(iced_runtime::platform_specific::wayland::Action::RoundedCorners(id, *v)); + } + } crate::platform_specific::Action::TrackWindow( window, id, diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index 549d1b77..9ab934ed 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -345,7 +345,7 @@ pub struct SctkCornerRadius(Arc); pub struct SctkWindow { pub(crate) window: Arc, pub(crate) id: core::window::Id, - pub(crate) corner_radius: Option<(SctkCornerRadius, CornerRadius)>, + pub(crate) corner_radius: Option<(SctkCornerRadius, Option)>, } impl SctkWindow { @@ -1528,32 +1528,44 @@ impl SctkState { Action::RoundedCorners(id, v) => { if let Some(manager) = self.corner_radius_manager.as_ref() { if let Some(w) = self.windows.iter_mut().find(|w| w.id == id) { + let geo_size: LogicalSize = w.window.surface_size().cast::().to_logical(w.window.scale_factor()); + let half_min_dim = ((geo_size.width as u32).min(geo_size.height as u32) / 2); + if let Some(radii) = v { + let adjusted_radii = CornerRadius { + top_left: radii.top_left.min(half_min_dim), + top_right: radii.top_right.min(half_min_dim), + bottom_right: radii.bottom_right.min(half_min_dim), + bottom_left: radii.bottom_left.min(half_min_dim), + }; if let Some((protocol_object, corner_radii)) = w.corner_radius.as_mut() { - if *corner_radii != radii { - protocol_object.0.0.set_radius(radii.top_left, - radii.top_right, - radii.bottom_right, - radii.bottom_left,); - *corner_radii = radii.clone(); + if *corner_radii != Some(adjusted_radii) { + protocol_object.0.0.set_radius( + adjusted_radii.top_left, + adjusted_radii.top_right, + adjusted_radii.bottom_right, + adjusted_radii.bottom_left, + ); + *corner_radii = Some(adjusted_radii.clone()); } } else { let toplevel = w.xdg_toplevel(&self.connection); let protocol_object = manager.get_corner_radius(&toplevel, &self.queue_handle, ()); + protocol_object.set_radius( - radii.top_left, - radii.top_right, - radii.bottom_right, - radii.bottom_left, + adjusted_radii.top_left, + adjusted_radii.top_right, + adjusted_radii.bottom_right, + adjusted_radii.bottom_left, ); - w.corner_radius = Some((SctkCornerRadius(Arc::new(MyCosmicCornerRadiusToplevelV1( protocol_object))), radii.clone())); + w.corner_radius = Some((SctkCornerRadius(Arc::new(MyCosmicCornerRadiusToplevelV1( protocol_object))), Some(adjusted_radii.clone()))); } } else { - if let Some(old) = w.corner_radius.take() { + if let Some(old) = w.corner_radius.as_mut() { old.0.0.as_ref().0.unset_radius(); + old.1 = None; } - w.corner_radius = None; } } else { if let Some(v) = v{ diff --git a/winit/src/platform_specific/wayland/mod.rs b/winit/src/platform_specific/wayland/mod.rs index b9bd8bdb..ddac9c30 100644 --- a/winit/src/platform_specific/wayland/mod.rs +++ b/winit/src/platform_specific/wayland/mod.rs @@ -33,6 +33,7 @@ pub(crate) enum Action { SetCursor(CursorIcon), RequestRedraw(ObjectId), TrackWindow(Arc, window::Id), + ResizeWindow(window::Id), RemoveWindow(window::Id), Dropped(SurfaceIdWrapper), SubsurfaceResize(window::Id, Size), @@ -60,6 +61,9 @@ impl std::fmt::Debug for Action { .field(id) .field(size) .finish(), + Self::ResizeWindow(arg0) => { + f.debug_tuple("ResizeWindow").field(arg0).finish() + } } } }