diff --git a/src/wayland/panel_item.rs b/src/wayland/panel_item.rs index b10a658..a1d05e7 100644 --- a/src/wayland/panel_item.rs +++ b/src/wayland/panel_item.rs @@ -24,8 +24,9 @@ use serde::{Deserialize, Serialize}; use smithay::{ reexports::{ wayland_protocols::xdg::shell::server::xdg_toplevel::{ - XdgToplevel, EVT_CONFIGURE_BOUNDS_SINCE, + XdgToplevel, EVT_CONFIGURE_BOUNDS_SINCE, EVT_WM_CAPABILITIES_SINCE, }, + wayland_protocols_wlr::foreign_toplevel::v1::server::zwlr_foreign_toplevel_handle_v1::State, wayland_server::{ backend::Credentials, protocol::{ @@ -46,6 +47,8 @@ lazy_static! { type_name: "panel", aliased_local_signals: vec![ "apply_toplevel_material", + "configure_toplevel", + "set_toplevel_capabilities", "apply_cursor_material", "pointer_deactivate", "pointer_scroll", @@ -54,7 +57,6 @@ lazy_static! { "keyboard_set_active", "keyboard_set_keyState", "keyboard_set_modifiers", - "configure_toplevel", "close", ], aliased_local_methods: vec![], @@ -154,6 +156,13 @@ impl PanelItem { "apply_toplevel_material", PanelItem::apply_toplevel_material_flex, ); + node.add_local_signal("configure_toplevel", PanelItem::configure_toplevel_flex); + if toplevel.version() >= EVT_WM_CAPABILITIES_SINCE { + node.add_local_signal( + "set_toplevel_capabilities", + PanelItem::set_toplevel_capabilities_flex, + ); + } node.add_local_signal( "apply_cursor_material", PanelItem::apply_cursor_material_flex, @@ -172,7 +181,6 @@ impl PanelItem { ); node.add_local_signal("keyboard_deactivate", PanelItem::keyboard_deactivate_flex); node.add_local_signal("keyboard_key_state", PanelItem::keyboard_key_state_flex); - node.add_local_signal("configure_toplevel", PanelItem::configure_toplevel_flex); if let Some(startup_settings) = panel_item .client_credentials @@ -531,6 +539,21 @@ impl PanelItem { Ok(()) } + fn set_toplevel_capabilities_flex( + node: &Node, + _calling_client: Arc, + data: &[u8], + ) -> Result<()> { + let Some(panel_item) = PanelItem::from_node(node) else { return Ok(()) }; + let Ok(xdg_toplevel) = panel_item.toplevel.upgrade() else { return Ok(()) }; + let Some(xdg_surface) = panel_item.toplevel_surface_data().and_then(|d| d.xdg_surface.upgrade().ok()) else { return Ok(()) }; + + xdg_toplevel.wm_capabilities(deserialize(data)?); + xdg_surface.configure(0); + + Ok(()) + } + pub fn commit_toplevel(&self) { let mapped = self.core_surface().map(|c| c.mapped()).unwrap_or(false); let Some(state) = self.toplevel_state() else { return }; diff --git a/src/wayland/xdg_shell.rs b/src/wayland/xdg_shell.rs index 2f7e688..73ee135 100644 --- a/src/wayland/xdg_shell.rs +++ b/src/wayland/xdg_shell.rs @@ -13,7 +13,7 @@ use smithay::{ xdg_popup::{self, XdgPopup}, xdg_positioner::{self, Anchor, ConstraintAdjustment, Gravity, XdgPositioner}, xdg_surface::{self, XdgSurface}, - xdg_toplevel::{self, XdgToplevel}, + xdg_toplevel::{self, XdgToplevel, EVT_WM_CAPABILITIES_SINCE}, xdg_wm_base::{self, XdgWmBase}, }, wayland_server::{ @@ -240,6 +240,9 @@ impl Dispatch for WaylandState { }, ); + if toplevel.version() >= EVT_WM_CAPABILITIES_SINCE { + toplevel.wm_capabilities(vec![]); + } toplevel.configure(0, 0, vec![]); xdg_surface.configure(0);