From 065214c87313b43b2f081091174d70b694800eef Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 14 Sep 2025 17:08:59 -0700 Subject: [PATCH] fix(wayland/core): surface role set properly --- src/wayland/core/surface.rs | 6 +++--- src/wayland/mod.rs | 4 ++++ src/wayland/xdg/surface.rs | 10 ++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/wayland/core/surface.rs b/src/wayland/core/surface.rs index b5b503e..83ab610 100644 --- a/src/wayland/core/surface.rs +++ b/src/wayland/core/surface.rs @@ -80,7 +80,7 @@ impl SurfaceState { } // if returning false, don't run this callback again... just remove it -pub type OnCommitCallback = Box bool + Send + Sync>; +pub type OnCommitCallback = Box bool + Send + Sync>; #[derive(Dispatcher)] pub struct Surface { pub id: ObjectId, @@ -163,7 +163,7 @@ impl Surface { } #[tracing::instrument(level = "debug", skip_all)] - pub fn add_commit_handler bool + Send + Sync + 'static>( + pub fn add_commit_handler bool + Send + Sync + 'static>( &self, handler: F, ) { @@ -420,7 +420,7 @@ impl WlSurface for Surface { .lock() .extend(current_state.frame_callbacks.iter().cloned()); let mut handlers = self.on_commit_handlers.lock(); - handlers.retain(|f| (f)(self, ¤t_state)); + handlers.retain_mut(|f| (f)(self, ¤t_state)); Ok(()) } diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index a612aff..6fd3fee 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -126,6 +126,7 @@ pub enum Message { toplevel: Arc, size: Option>, }, + ReconfigureToplevel(Arc), SetToplevelVisualActive { toplevel: Arc, active: bool, @@ -239,6 +240,9 @@ impl WaylandClient { toplevel.set_size(size); toplevel.reconfigure(client).await?; } + Message::ReconfigureToplevel(toplevel) => { + toplevel.reconfigure(client).await?; + } Message::SetToplevelVisualActive { toplevel, active } => { toplevel.set_activated(active); toplevel.reconfigure(client).await?; diff --git a/src/wayland/xdg/surface.rs b/src/wayland/xdg/surface.rs index ffa38c0..4e04cd7 100644 --- a/src/wayland/xdg/surface.rs +++ b/src/wayland/xdg/surface.rs @@ -1,5 +1,6 @@ use super::{popup::Popup, positioner::Positioner, toplevel::MappedInner}; use crate::nodes::items::panel::{ChildInfo, SurfaceId}; +use crate::wayland::Message; use crate::wayland::util::ClientExt; use crate::wayland::{core::surface::SurfaceRole, display::Display, xdg::toplevel::Toplevel}; use std::sync::Arc; @@ -63,18 +64,23 @@ impl XdgSurface for Surface { .try_set_role(client, SurfaceRole::XdgToplevel) .await?; - toplevel.reconfigure(client).await?; - let toplevel_weak = Arc::downgrade(&toplevel); let display = client.get::(ObjectId::DISPLAY).unwrap(); let seat = Arc::downgrade(display.seat.get().unwrap()); let pid = display.pid; let configured = self.configured.clone(); + let mut first_commit = true; + let message_tx = client.message_sink().clone(); self.wl_surface.add_commit_handler(move |surface, state| { let Some(toplevel) = toplevel_weak.upgrade() else { return true; }; + if first_commit { + let _ = message_tx.send(Message::ReconfigureToplevel(toplevel.clone())); + first_commit = false; + } + let mut mapped_lock = toplevel.mapped.lock(); if mapped_lock.is_none() && configured.load(std::sync::atomic::Ordering::SeqCst)