feat(wayland): set toplevel capabilities

This commit is contained in:
Nova
2023-01-03 10:08:39 -05:00
parent a483cdbc7d
commit dd4b0097a1
2 changed files with 30 additions and 4 deletions

View File

@@ -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<Client>,
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 };

View File

@@ -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<XdgSurface, WaylandSurface, WaylandState> for WaylandState {
},
);
if toplevel.version() >= EVT_WM_CAPABILITIES_SINCE {
toplevel.wm_capabilities(vec![]);
}
toplevel.configure(0, 0, vec![]);
xdg_surface.configure(0);