fix(wayland): closing toplevels
This commit is contained in:
@@ -5,6 +5,7 @@ use super::{Alias, Message, Node};
|
|||||||
use crate::core::client::Client;
|
use crate::core::client::Client;
|
||||||
use crate::core::node_collections::LifeLinkedNodeMap;
|
use crate::core::node_collections::LifeLinkedNodeMap;
|
||||||
use crate::core::registry::Registry;
|
use crate::core::registry::Registry;
|
||||||
|
use crate::core::scenegraph::MethodResponseSender;
|
||||||
use crate::nodes::fields::{find_field, FIELD_ALIAS_INFO};
|
use crate::nodes::fields::{find_field, FIELD_ALIAS_INFO};
|
||||||
use crate::nodes::spatial::find_spatial_parent;
|
use crate::nodes::spatial::find_spatial_parent;
|
||||||
use color_eyre::eyre::{bail, ensure, eyre, Result};
|
use color_eyre::eyre::{bail, ensure, eyre, Result};
|
||||||
@@ -300,31 +301,37 @@ pub fn register_keymap_flex(
|
|||||||
_node: &Node,
|
_node: &Node,
|
||||||
_calling_client: Arc<Client>,
|
_calling_client: Arc<Client>,
|
||||||
message: Message,
|
message: Message,
|
||||||
) -> Result<Message> {
|
response: MethodResponseSender,
|
||||||
let keymap: String = deserialize(message.as_ref())?;
|
) {
|
||||||
let mut keymaps = KEYMAPS.lock();
|
response.wrap_sync(move || {
|
||||||
if let Some(found_keymap_id) = keymaps
|
let keymap: String = deserialize(message.as_ref())?;
|
||||||
.iter()
|
let mut keymaps = KEYMAPS.lock();
|
||||||
.filter(|(_k, v)| *v == &keymap)
|
if let Some(found_keymap_id) = keymaps
|
||||||
.map(|(k, _v)| k)
|
.iter()
|
||||||
.last()
|
.filter(|(_k, v)| *v == &keymap)
|
||||||
{
|
.map(|(k, _v)| k)
|
||||||
return Ok(serialize(found_keymap_id)?.into());
|
.last()
|
||||||
}
|
{
|
||||||
|
return Ok(serialize(found_keymap_id)?.into());
|
||||||
|
}
|
||||||
|
|
||||||
let generated_id = nanoid!();
|
let generated_id = nanoid!();
|
||||||
keymaps.insert(generated_id.clone(), keymap);
|
keymaps.insert(generated_id.clone(), keymap);
|
||||||
|
|
||||||
Ok(serialize(generated_id)?.into())
|
Ok(serialize(generated_id)?.into())
|
||||||
|
});
|
||||||
}
|
}
|
||||||
pub fn get_keymap_flex(
|
pub fn get_keymap_flex(
|
||||||
_node: &Node,
|
_node: &Node,
|
||||||
_calling_client: Arc<Client>,
|
_calling_client: Arc<Client>,
|
||||||
message: Message,
|
message: Message,
|
||||||
) -> Result<Message> {
|
response: MethodResponseSender,
|
||||||
let keymap_id: &str = deserialize(message.as_ref())?;
|
) {
|
||||||
let keymaps = KEYMAPS.lock();
|
response.wrap_sync(move || {
|
||||||
let Some(keymap) = keymaps.get(keymap_id) else {bail!("Could not find keymap. Try registering it")};
|
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())
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ pub enum KeyboardEvent {
|
|||||||
Key { key: u32, state: u32 },
|
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 {
|
struct SurfaceInfo {
|
||||||
wl_surface: WlWeak<WlSurface>,
|
wl_surface: WlWeak<WlSurface>,
|
||||||
cursor_sender: watch::Sender<Option<CursorInfo>>,
|
cursor_sender: watch::Sender<Option<CursorInfo>>,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ use crate::{
|
|||||||
use color_eyre::eyre::{bail, eyre, Result};
|
use color_eyre::eyre::{bail, eyre, Result};
|
||||||
use mint::Vector2;
|
use mint::Vector2;
|
||||||
use nanoid::nanoid;
|
use nanoid::nanoid;
|
||||||
|
use once_cell::sync::OnceCell;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use rustc_hash::FxHashMap;
|
use rustc_hash::FxHashMap;
|
||||||
use smithay::reexports::{
|
use smithay::reexports::{
|
||||||
@@ -383,6 +384,10 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
|
|||||||
client_credentials.map(|c| c.pid),
|
client_credentials.map(|c| c.pid),
|
||||||
);
|
);
|
||||||
xdg_surface_data.lock().panel_item = Arc::downgrade(&panel_item);
|
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());
|
handle_cursor(&panel_item, panel_item.backend.cursor.clone());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -508,6 +513,7 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ToplevelData {
|
pub struct ToplevelData {
|
||||||
|
panel_item: OnceCell<Weak<PanelItem<XDGBackend>>>,
|
||||||
xdg_surface: WlWeak<XdgSurface>,
|
xdg_surface: WlWeak<XdgSurface>,
|
||||||
parent: Option<WlWeak<XdgToplevel>>,
|
parent: Option<WlWeak<XdgToplevel>>,
|
||||||
title: Option<String>,
|
title: Option<String>,
|
||||||
@@ -518,6 +524,7 @@ pub struct ToplevelData {
|
|||||||
impl ToplevelData {
|
impl ToplevelData {
|
||||||
fn new(xdg_surface: &XdgSurface) -> Self {
|
fn new(xdg_surface: &XdgSurface) -> Self {
|
||||||
ToplevelData {
|
ToplevelData {
|
||||||
|
panel_item: OnceCell::new(),
|
||||||
xdg_surface: xdg_surface.downgrade(),
|
xdg_surface: xdg_surface.downgrade(),
|
||||||
parent: None,
|
parent: None,
|
||||||
title: None,
|
title: None,
|
||||||
@@ -535,9 +542,7 @@ impl ToplevelData {
|
|||||||
self.xdg_surface.upgrade().ok()
|
self.xdg_surface.upgrade().ok()
|
||||||
}
|
}
|
||||||
fn panel_item(&self) -> Option<Arc<PanelItem<XDGBackend>>> {
|
fn panel_item(&self) -> Option<Arc<PanelItem<XDGBackend>>> {
|
||||||
let xdg_surface = self.xdg_surface()?;
|
self.panel_item.get()?.upgrade()
|
||||||
let xdg_surface_data = XdgSurfaceData::get(&xdg_surface)?.lock();
|
|
||||||
xdg_surface_data.panel_item()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Drop for ToplevelData {
|
impl Drop for ToplevelData {
|
||||||
|
|||||||
Reference in New Issue
Block a user