fix(wayland): window resize forces corner radius update
This commit is contained in:
parent
bc85d82426
commit
7993a572b0
3 changed files with 38 additions and 14 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ pub struct SctkCornerRadius(Arc<MyCosmicCornerRadiusToplevelV1>);
|
|||
pub struct SctkWindow {
|
||||
pub(crate) window: Arc<dyn winit::window::Window>,
|
||||
pub(crate) id: core::window::Id,
|
||||
pub(crate) corner_radius: Option<(SctkCornerRadius, CornerRadius)>,
|
||||
pub(crate) corner_radius: Option<(SctkCornerRadius, Option<CornerRadius>)>,
|
||||
}
|
||||
|
||||
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<f64> = w.window.surface_size().cast::<f64>().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{
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ pub(crate) enum Action {
|
|||
SetCursor(CursorIcon),
|
||||
RequestRedraw(ObjectId),
|
||||
TrackWindow(Arc<dyn winit::window::Window>, 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue