From 8e7b7e586fb0e11e03fc78c0938d372f7b670086 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Mon, 25 Aug 2025 00:16:31 -0400 Subject: [PATCH] feat: subsurface reposition --- runtime/src/platform_specific/wayland/subsurface.rs | 12 ++++++++++++ .../platform_specific/wayland/commands/subsurface.rs | 12 ++++++++++++ .../platform_specific/wayland/event_loop/state.rs | 11 ++++++++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/runtime/src/platform_specific/wayland/subsurface.rs b/runtime/src/platform_specific/wayland/subsurface.rs index 0356d28d..5d9edbdd 100644 --- a/runtime/src/platform_specific/wayland/subsurface.rs +++ b/runtime/src/platform_specific/wayland/subsurface.rs @@ -57,6 +57,13 @@ pub enum Action { /// id of the subsurface id: Id, }, + /// reposition the subsurface + Reposition { + /// id of the subsurface + id: Id, + x: i32, + y: i32, + }, } impl fmt::Debug for Action { @@ -72,6 +79,11 @@ impl fmt::Debug for Action { "Action::SubsurfaceAction::Destroy {{ id: {:?} }}", id ), + Action::Reposition { id, x, y } => write!( + f, + "Action::SubsurfaceAction::Reposition {{ id: {:?}, x: {:?}, y: {:?} }}", + id, x, y + ), } } } diff --git a/winit/src/platform_specific/wayland/commands/subsurface.rs b/winit/src/platform_specific/wayland/commands/subsurface.rs index d8ce8259..a76e3b4e 100644 --- a/winit/src/platform_specific/wayland/commands/subsurface.rs +++ b/winit/src/platform_specific/wayland/commands/subsurface.rs @@ -26,3 +26,15 @@ pub fn destroy_subsurface(id: SurfaceId) -> Task { )), )) } + +pub fn reposition_subsurface( + id: SurfaceId, + x: i32, + y: i32, +) -> Task { + task::effect(Action::PlatformSpecific( + platform_specific::Action::Wayland(wayland::Action::Subsurface( + wayland::subsurface::Action::Reposition { id, x, y }, + )), + )) +} diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index 9e9c09e1..a73d174c 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -784,7 +784,6 @@ impl SctkState { } } - _ = wl_surface.frame(&self.queue_handle, wl_surface.clone()); wl_surface.commit(); @@ -1417,7 +1416,7 @@ impl SctkState { } }, Action::Subsurface(action) => match action { - platform_specific::wayland::subsurface::Action::Subsurface { subsurface: subsurface_settings } => { + subsurface::Action::Subsurface { subsurface: subsurface_settings } => { let parent_id = subsurface_settings.parent; if let Ok((_, parent, subsurface, common_surface, common)) = self.get_subsurface(subsurface_settings.clone()) { // TODO Ashley: all surfaces should probably have an optional title for a11y if nothing else @@ -1437,7 +1436,7 @@ impl SctkState { ); } }, - platform_specific::wayland::subsurface::Action::Destroy { id } => { + subsurface::Action::Destroy { id } => { let mut destroyed = vec![]; if let Some(subsurface) = self.subsurfaces.iter().position(|s| s.id == id) { let subsurface = self.subsurfaces.remove(subsurface); @@ -1457,6 +1456,12 @@ impl SctkState { } } }, + subsurface::Action::Reposition { id, x, y } => { + if let Some(subsurface) = self.subsurfaces.iter().find(|s| s.id == id) { + subsurface.instance.wl_subsurface.set_position(x, y); + subsurface.instance.wl_surface.commit(); + } + }, }, }; Ok(())