fix(wayland/core): surface role set properly
This commit is contained in:
@@ -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, ¤t_state));
|
handlers.retain_mut(|f| (f)(self, ¤t_state));
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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?;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user