fix(wayland): closing toplevels

This commit is contained in:
Nova
2023-09-03 11:02:42 -04:00
parent a4d3ec537f
commit 5360230ca7
3 changed files with 35 additions and 23 deletions

View File

@@ -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<Client>,
message: Message,
) -> Result<Message> {
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<Client>,
message: Message,
) -> Result<Message> {
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())
});
}

View File

@@ -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<WlSurface>,
cursor_sender: watch::Sender<Option<CursorInfo>>,

View File

@@ -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<XdgSurface, Mutex<XdgSurfaceData>, 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<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
#[derive(Debug, Clone)]
pub struct ToplevelData {
panel_item: OnceCell<Weak<PanelItem<XDGBackend>>>,
xdg_surface: WlWeak<XdgSurface>,
parent: Option<WlWeak<XdgToplevel>>,
title: Option<String>,
@@ -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<Arc<PanelItem<XDGBackend>>> {
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 {