From 7c6b2f5949fa92629b9d0854929052c7b63617cd Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 3 Sep 2023 11:02:42 -0400 Subject: [PATCH] fix(wayland): closing toplevels --- src/nodes/data.rs | 45 +++++++++++++++++++++++----------------- src/wayland/seat.rs | 2 +- src/wayland/xdg_shell.rs | 11 +++++++--- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/nodes/data.rs b/src/nodes/data.rs index eb5a490..dafbcd5 100644 --- a/src/nodes/data.rs +++ b/src/nodes/data.rs @@ -5,6 +5,7 @@ use super::{Alias, Message, Node}; use crate::core::client::Client; use crate::core::node_collections::LifeLinkedNodeMap; use crate::core::registry::Registry; +use crate::core::scenegraph::MethodResponseSender; use crate::nodes::fields::{find_field, FIELD_ALIAS_INFO}; use crate::nodes::spatial::find_spatial_parent; use color_eyre::eyre::{bail, ensure, eyre, Result}; @@ -300,31 +301,37 @@ pub fn register_keymap_flex( _node: &Node, _calling_client: Arc, message: Message, -) -> Result { - let keymap: String = deserialize(message.as_ref())?; - let mut keymaps = KEYMAPS.lock(); - if let Some(found_keymap_id) = keymaps - .iter() - .filter(|(_k, v)| *v == &keymap) - .map(|(k, _v)| k) - .last() - { - return Ok(serialize(found_keymap_id)?.into()); - } + response: MethodResponseSender, +) { + response.wrap_sync(move || { + let keymap: String = deserialize(message.as_ref())?; + let mut keymaps = KEYMAPS.lock(); + if let Some(found_keymap_id) = keymaps + .iter() + .filter(|(_k, v)| *v == &keymap) + .map(|(k, _v)| k) + .last() + { + return Ok(serialize(found_keymap_id)?.into()); + } - let generated_id = nanoid!(); - keymaps.insert(generated_id.clone(), keymap); + let generated_id = nanoid!(); + keymaps.insert(generated_id.clone(), keymap); - Ok(serialize(generated_id)?.into()) + Ok(serialize(generated_id)?.into()) + }); } pub fn get_keymap_flex( _node: &Node, _calling_client: Arc, message: Message, -) -> Result { - let keymap_id: &str = deserialize(message.as_ref())?; - let keymaps = KEYMAPS.lock(); - let Some(keymap) = keymaps.get(keymap_id) else {bail!("Could not find keymap. Try registering it")}; + response: MethodResponseSender, +) { + response.wrap_sync(move || { + let keymap_id: &str = deserialize(message.as_ref())?; + let keymaps = KEYMAPS.lock(); + let Some(keymap) = keymaps.get(keymap_id) else {bail!("Could not find keymap. Try registering it")}; - Ok(serialize(keymap)?.into()) + Ok(serialize(keymap)?.into()) + }); } diff --git a/src/wayland/seat.rs b/src/wayland/seat.rs index 9554d2b..d5421cb 100644 --- a/src/wayland/seat.rs +++ b/src/wayland/seat.rs @@ -124,7 +124,7 @@ pub enum KeyboardEvent { Key { key: u32, state: u32 }, } -const POINTER_EVENT_TIMEOUT: Duration = Duration::from_secs(1); +const POINTER_EVENT_TIMEOUT: Duration = Duration::from_millis(50); struct SurfaceInfo { wl_surface: WlWeak, cursor_sender: watch::Sender>, diff --git a/src/wayland/xdg_shell.rs b/src/wayland/xdg_shell.rs index 2e785ae..15515a5 100644 --- a/src/wayland/xdg_shell.rs +++ b/src/wayland/xdg_shell.rs @@ -17,6 +17,7 @@ use crate::{ use color_eyre::eyre::{bail, eyre, Result}; use mint::Vector2; use nanoid::nanoid; +use once_cell::sync::OnceCell; use parking_lot::Mutex; use rustc_hash::FxHashMap; use smithay::reexports::{ @@ -383,6 +384,10 @@ impl Dispatch, WaylandState> for WaylandState client_credentials.map(|c| c.pid), ); xdg_surface_data.lock().panel_item = Arc::downgrade(&panel_item); + let _ = toplevel_data + .lock() + .panel_item + .set(Arc::downgrade(&panel_item)); handle_cursor(&panel_item, panel_item.backend.cursor.clone()); } }, @@ -508,6 +513,7 @@ impl Dispatch, WaylandState> for WaylandState #[derive(Debug, Clone)] pub struct ToplevelData { + panel_item: OnceCell>>, xdg_surface: WlWeak, parent: Option>, title: Option, @@ -518,6 +524,7 @@ pub struct ToplevelData { impl ToplevelData { fn new(xdg_surface: &XdgSurface) -> Self { ToplevelData { + panel_item: OnceCell::new(), xdg_surface: xdg_surface.downgrade(), parent: None, title: None, @@ -535,9 +542,7 @@ impl ToplevelData { self.xdg_surface.upgrade().ok() } fn panel_item(&self) -> Option>> { - let xdg_surface = self.xdg_surface()?; - let xdg_surface_data = XdgSurfaceData::get(&xdg_surface)?.lock(); - xdg_surface_data.panel_item() + self.panel_item.get()?.upgrade() } } impl Drop for ToplevelData {