diff --git a/src/nodes/items/panel.rs b/src/nodes/items/panel.rs index f378a29..be0ae91 100644 --- a/src/nodes/items/panel.rs +++ b/src/nodes/items/panel.rs @@ -1,3 +1,4 @@ +use super::{create_item_acceptor_flex, register_item_ui_flex, ItemAcceptor, ItemInterface}; use crate::nodes::items::ITEM_ACCEPTOR_ASPECT_ALIAS_INFO; use crate::nodes::items::ITEM_ASPECT_ALIAS_INFO; use crate::{ @@ -20,8 +21,6 @@ use mint::Vector2; use std::sync::{Arc, Weak}; use tracing::{debug, info}; -use super::{create_item_acceptor_flex, register_item_ui_flex, ItemAcceptor, ItemInterface}; - stardust_xr_server_codegen::codegen_item_panel_protocol!(); lazy_static! { pub static ref ITEM_TYPE_INFO_PANEL: TypeInfo = TypeInfo { @@ -39,7 +38,6 @@ lazy_static! { pub trait Backend: Send + Sync + 'static { fn start_data(&self) -> Result; - fn surface_alive(&self, surface: &SurfaceId) -> bool; fn apply_cursor_material(&self, model_part: &Arc); fn apply_surface_material(&self, surface: SurfaceId, model_part: &Arc); @@ -73,16 +71,17 @@ pub fn panel_item_from_node(node: &Node) -> Option> { Some(panel_item.clone()) } -pub trait PanelItemTrait: Backend + Send + Sync + 'static { +pub trait PanelItemTrait: Send + Sync + 'static { + fn backend(&self) -> &dyn Backend; fn send_ui_item_created(&self, node: &Node, item: &Arc); fn send_acceptor_item_created(&self, node: &Node, item: &Arc); } -pub struct PanelItem { +pub struct PanelItem { pub node: Weak, pub backend: Box, } -impl PanelItem { +impl PanelItem { pub fn create(backend: Box, pid: Option) -> (Arc, Arc>) { debug!(?pid, "Create panel item"); @@ -121,7 +120,7 @@ impl PanelItem { // Remote signals #[allow(unused)] -impl PanelItem { +impl PanelItem { pub fn toplevel_parent_changed(&self, parent: u64) { let Some(node) = self.node.upgrade() else { return; @@ -199,7 +198,7 @@ impl PanelItem { // make these stupid vectors u32 in the protocol somehow!!!!!!!1 #[allow(unused)] -impl PanelItemAspect for PanelItem { +impl PanelItemAspect for PanelItem { #[doc = "Apply the cursor as a material to a model."] fn apply_cursor_material( node: Arc, @@ -211,7 +210,7 @@ impl PanelItemAspect for PanelItem { }; let model_part = model_part.get_aspect::()?; - panel_item.apply_cursor_material(&model_part); + panel_item.backend().apply_cursor_material(&model_part); Ok(()) } @@ -227,7 +226,9 @@ impl PanelItemAspect for PanelItem { }; let model_part = model_part.get_aspect::()?; - panel_item.apply_surface_material(surface, &model_part); + panel_item + .backend() + .apply_surface_material(surface, &model_part); Ok(()) } @@ -236,7 +237,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.close_toplevel(); + panel_item.backend().close_toplevel(); Ok(()) } @@ -245,7 +246,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.auto_size_toplevel(); + panel_item.backend().auto_size_toplevel(); Ok(()) } @@ -258,7 +259,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.set_toplevel_size(size); + panel_item.backend().set_toplevel_size(size); Ok(()) } @@ -271,7 +272,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.set_toplevel_focused_visuals(focused); + panel_item.backend().set_toplevel_focused_visuals(focused); Ok(()) } @@ -285,7 +286,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.pointer_motion(&surface, position); + panel_item.backend().pointer_motion(&surface, position); Ok(()) } @@ -300,7 +301,9 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.pointer_button(&surface, button, pressed); + panel_item + .backend() + .pointer_button(&surface, button, pressed); Ok(()) } @@ -315,7 +318,9 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.pointer_scroll(&surface, Some(scroll_distance), Some(scroll_steps)); + panel_item + .backend() + .pointer_scroll(&surface, Some(scroll_distance), Some(scroll_steps)); Ok(()) } @@ -328,7 +333,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.pointer_scroll(&surface, None, None); + panel_item.backend().pointer_scroll(&surface, None, None); Ok(()) } @@ -343,7 +348,9 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.keyboard_keys(&surface, keymap_id, keys); + panel_item + .backend() + .keyboard_keys(&surface, keymap_id, keys); Ok(()) } @@ -358,7 +365,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.touch_down(&surface, uid, position); + panel_item.backend().touch_down(&surface, uid, position); Ok(()) } @@ -372,7 +379,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.touch_move(uid, position); + panel_item.backend().touch_move(uid, position); Ok(()) } @@ -381,7 +388,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.touch_up(uid); + panel_item.backend().touch_up(uid); Ok(()) } @@ -390,7 +397,7 @@ impl PanelItemAspect for PanelItem { let Some(panel_item) = panel_item_from_node(&node) else { return Ok(()); }; - panel_item.reset_input(); + panel_item.backend().reset_input(); Ok(()) } } @@ -401,7 +408,10 @@ impl PanelItemAcceptorAspect for ItemAcceptor { } } -impl PanelItemTrait for PanelItem { +impl PanelItemTrait for PanelItem { + fn backend(&self) -> &dyn Backend { + self.backend.as_ref() + } fn send_ui_item_created(&self, node: &Node, item: &Arc) { let Ok(init_data) = self.backend.start_data() else { return; @@ -415,68 +425,7 @@ impl PanelItemTrait for PanelItem { let _ = panel_item_acceptor_client::capture_item(node, item, init_data); } } -impl Backend for PanelItem { - fn start_data(&self) -> Result { - self.backend.start_data() - } - fn surface_alive(&self, surface: &SurfaceId) -> bool { - self.backend.surface_alive(surface) - } - - fn apply_cursor_material(&self, model_part: &Arc) { - self.backend.apply_cursor_material(model_part) - } - fn apply_surface_material(&self, surface: SurfaceId, model_part: &Arc) { - self.backend.apply_surface_material(surface, model_part) - } - - fn close_toplevel(&self) { - self.backend.close_toplevel() - } - fn auto_size_toplevel(&self) { - self.backend.auto_size_toplevel() - } - fn set_toplevel_size(&self, size: Vector2) { - self.backend.set_toplevel_size(size) - } - fn set_toplevel_focused_visuals(&self, focused: bool) { - self.backend.set_toplevel_focused_visuals(focused) - } - - fn pointer_motion(&self, surface: &SurfaceId, position: Vector2) { - self.backend.pointer_motion(surface, position) - } - fn pointer_button(&self, surface: &SurfaceId, button: u32, pressed: bool) { - self.backend.pointer_button(surface, button, pressed) - } - fn pointer_scroll( - &self, - surface: &SurfaceId, - scroll_distance: Option>, - scroll_steps: Option>, - ) { - self.backend - .pointer_scroll(surface, scroll_distance, scroll_steps) - } - - fn keyboard_keys(&self, surface: &SurfaceId, keymap_id: u64, keys: Vec) { - self.backend.keyboard_keys(surface, keymap_id, keys) - } - - fn touch_down(&self, surface: &SurfaceId, id: u32, position: Vector2) { - self.backend.touch_down(surface, id, position) - } - fn touch_move(&self, id: u32, position: Vector2) { - self.backend.touch_move(id, position) - } - fn touch_up(&self, id: u32) { - self.backend.touch_up(id) - } - fn reset_input(&self) { - self.backend.reset_input() - } -} -impl Drop for PanelItem { +impl Drop for PanelItem { fn drop(&mut self) { // Dropped panel item, basically just a debug breakpoint place info!("Dropped panel item"); diff --git a/src/wayland/xdg_shell.rs b/src/wayland/xdg_shell.rs index 65fefb2..9d0984d 100644 --- a/src/wayland/xdg_shell.rs +++ b/src/wayland/xdg_shell.rs @@ -501,14 +501,6 @@ impl Backend for XdgBackend { keyboard_grab: None, }) } - - fn surface_alive(&self, surface: &SurfaceId) -> bool { - let Some(surface) = self.wl_surface_from_id(surface) else { - return false; - }; - surface.is_alive() - } - fn apply_cursor_material(&self, model_part: &Arc) { let Some(surface) = self .seat