fix(wayland/core): surface role set properly

This commit is contained in:
Nova
2025-09-14 17:08:59 -07:00
parent 795f111ebc
commit 065214c873
3 changed files with 15 additions and 5 deletions

View File

@@ -80,7 +80,7 @@ impl SurfaceState {
} }
// if returning false, don't run this callback again... just remove it // if returning false, don't run this callback again... just remove it
pub type OnCommitCallback = Box<dyn Fn(&Surface, &SurfaceState) -> bool + Send + Sync>; pub type OnCommitCallback = Box<dyn FnMut(&Surface, &SurfaceState) -> bool + Send + Sync>;
#[derive(Dispatcher)] #[derive(Dispatcher)]
pub struct Surface { pub struct Surface {
pub id: ObjectId, pub id: ObjectId,
@@ -163,7 +163,7 @@ impl Surface {
} }
#[tracing::instrument(level = "debug", skip_all)] #[tracing::instrument(level = "debug", skip_all)]
pub fn add_commit_handler<F: Fn(&Surface, &SurfaceState) -> bool + Send + Sync + 'static>( pub fn add_commit_handler<F: FnMut(&Surface, &SurfaceState) -> bool + Send + Sync + 'static>(
&self, &self,
handler: F, handler: F,
) { ) {
@@ -420,7 +420,7 @@ impl WlSurface for Surface {
.lock() .lock()
.extend(current_state.frame_callbacks.iter().cloned()); .extend(current_state.frame_callbacks.iter().cloned());
let mut handlers = self.on_commit_handlers.lock(); let mut handlers = self.on_commit_handlers.lock();
handlers.retain(|f| (f)(self, &current_state)); handlers.retain_mut(|f| (f)(self, &current_state));
Ok(()) Ok(())
} }

View File

@@ -126,6 +126,7 @@ pub enum Message {
toplevel: Arc<Toplevel>, toplevel: Arc<Toplevel>,
size: Option<Vector2<u32>>, size: Option<Vector2<u32>>,
}, },
ReconfigureToplevel(Arc<Toplevel>),
SetToplevelVisualActive { SetToplevelVisualActive {
toplevel: Arc<Toplevel>, toplevel: Arc<Toplevel>,
active: bool, active: bool,
@@ -239,6 +240,9 @@ impl WaylandClient {
toplevel.set_size(size); toplevel.set_size(size);
toplevel.reconfigure(client).await?; toplevel.reconfigure(client).await?;
} }
Message::ReconfigureToplevel(toplevel) => {
toplevel.reconfigure(client).await?;
}
Message::SetToplevelVisualActive { toplevel, active } => { Message::SetToplevelVisualActive { toplevel, active } => {
toplevel.set_activated(active); toplevel.set_activated(active);
toplevel.reconfigure(client).await?; toplevel.reconfigure(client).await?;

View File

@@ -1,5 +1,6 @@
use super::{popup::Popup, positioner::Positioner, toplevel::MappedInner}; use super::{popup::Popup, positioner::Positioner, toplevel::MappedInner};
use crate::nodes::items::panel::{ChildInfo, SurfaceId}; use crate::nodes::items::panel::{ChildInfo, SurfaceId};
use crate::wayland::Message;
use crate::wayland::util::ClientExt; use crate::wayland::util::ClientExt;
use crate::wayland::{core::surface::SurfaceRole, display::Display, xdg::toplevel::Toplevel}; use crate::wayland::{core::surface::SurfaceRole, display::Display, xdg::toplevel::Toplevel};
use std::sync::Arc; use std::sync::Arc;
@@ -63,18 +64,23 @@ impl XdgSurface for Surface {
.try_set_role(client, SurfaceRole::XdgToplevel) .try_set_role(client, SurfaceRole::XdgToplevel)
.await?; .await?;
toplevel.reconfigure(client).await?;
let toplevel_weak = Arc::downgrade(&toplevel); let toplevel_weak = Arc::downgrade(&toplevel);
let display = client.get::<Display>(ObjectId::DISPLAY).unwrap(); let display = client.get::<Display>(ObjectId::DISPLAY).unwrap();
let seat = Arc::downgrade(display.seat.get().unwrap()); let seat = Arc::downgrade(display.seat.get().unwrap());
let pid = display.pid; let pid = display.pid;
let configured = self.configured.clone(); 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| { self.wl_surface.add_commit_handler(move |surface, state| {
let Some(toplevel) = toplevel_weak.upgrade() else { let Some(toplevel) = toplevel_weak.upgrade() else {
return true; return true;
}; };
if first_commit {
let _ = message_tx.send(Message::ReconfigureToplevel(toplevel.clone()));
first_commit = false;
}
let mut mapped_lock = toplevel.mapped.lock(); let mut mapped_lock = toplevel.mapped.lock();
if mapped_lock.is_none() if mapped_lock.is_none()
&& configured.load(std::sync::atomic::Ordering::SeqCst) && configured.load(std::sync::atomic::Ordering::SeqCst)