From 18d1827415ea00b577b10564dc10617b6ef10548 Mon Sep 17 00:00:00 2001 From: drendog Date: Sat, 25 Oct 2025 19:33:16 +0200 Subject: [PATCH] refactor: keep pointer and output alive --- src/windowing/mod.rs | 5 ++++- src/windowing/state/builder.rs | 10 +++++++++- src/windowing/state/mod.rs | 12 +++++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/windowing/mod.rs b/src/windowing/mod.rs index 976ca3a..3231852 100644 --- a/src/windowing/mod.rs +++ b/src/windowing/mod.rs @@ -73,9 +73,10 @@ impl WindowingSystem { let global_ctx = Self::initialize_globals(&connection, &event_queue.handle()) .map_err(|e| LayerShikaError::GlobalInitialization(e.to_string()))?; + let output_ref = &global_ctx.output; let surface_ctx = Self::setup_surface( &global_ctx.compositor, - &global_ctx.output, + output_ref, &global_ctx.layer_shell, global_ctx.fractional_scale_manager.as_ref(), global_ctx.viewporter.as_ref(), @@ -84,6 +85,7 @@ impl WindowingSystem { ); let pointer = Rc::new(global_ctx.seat.get_pointer(&event_queue.handle(), ())); + let output = Rc::new(global_ctx.output); let window = Self::initialize_renderer(&surface_ctx.surface, &connection.display(), &config) .map_err(|e| LayerShikaError::EGLContextCreation(e.to_string()))?; @@ -93,6 +95,7 @@ impl WindowingSystem { .with_surface(Rc::clone(&surface_ctx.surface)) .with_layer_surface(Rc::clone(&surface_ctx.layer_surface)) .with_pointer(Rc::clone(&pointer)) + .with_output(Rc::clone(&output)) .with_scale_factor(config.scale_factor) .with_height(config.height) .with_exclusive_zone(config.exclusive_zone) diff --git a/src/windowing/state/builder.rs b/src/windowing/state/builder.rs index a99f356..3519c99 100644 --- a/src/windowing/state/builder.rs +++ b/src/windowing/state/builder.rs @@ -2,7 +2,7 @@ use std::rc::Rc; use slint::{platform::set_platform, PhysicalSize}; use slint_interpreter::ComponentDefinition; use smithay_client_toolkit::reexports::protocols_wlr::layer_shell::v1::client::zwlr_layer_surface_v1::ZwlrLayerSurfaceV1; -use wayland_client::protocol::{wl_pointer::WlPointer, wl_surface::WlSurface}; +use wayland_client::protocol::{wl_output::WlOutput, wl_pointer::WlPointer, wl_surface::WlSurface}; use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1; use wayland_protocols::wp::viewporter::client::wp_viewport::WpViewport; use crate::{errors::{LayerShikaError, Result}, rendering::{femtovg_window::FemtoVGWindow, slint_platform::CustomSlintPlatform}}; @@ -18,6 +18,7 @@ pub struct WindowStateBuilder { pub size: Option, pub output_size: Option, pub pointer: Option>, + pub output: Option>, pub window: Option>, pub scale_factor: f32, pub height: u32, @@ -60,6 +61,12 @@ impl WindowStateBuilder { self } + #[must_use] + pub fn with_output(mut self, output: Rc) -> Self { + self.output = Some(output); + self + } + #[must_use] pub fn with_window(mut self, window: Rc) -> Self { self.window = Some(window); @@ -127,6 +134,7 @@ impl Default for WindowStateBuilder { size: None, output_size: None, pointer: None, + output: None, window: None, scale_factor: 1.0, height: 30, diff --git a/src/windowing/state/mod.rs b/src/windowing/state/mod.rs index fafb83c..ecaf337 100644 --- a/src/windowing/state/mod.rs +++ b/src/windowing/state/mod.rs @@ -4,7 +4,7 @@ use log::info; use slint::{LogicalPosition, PhysicalSize, ComponentHandle}; use slint_interpreter::ComponentInstance; use smithay_client_toolkit::reexports::protocols_wlr::layer_shell::v1::client::zwlr_layer_surface_v1::ZwlrLayerSurfaceV1; -use wayland_client::protocol::wl_surface::WlSurface; +use wayland_client::protocol::{wl_output::WlOutput, wl_pointer::WlPointer, wl_surface::WlSurface}; use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1; use wayland_protocols::wp::viewporter::client::wp_viewport::WpViewport; use crate::rendering::femtovg_window::FemtoVGWindow; @@ -19,6 +19,10 @@ pub struct WindowState { layer_surface: Rc, fractional_scale: Option>, viewport: Option>, + #[allow(dead_code)] + pointer: Rc, + #[allow(dead_code)] + output: Rc, size: PhysicalSize, logical_size: PhysicalSize, output_size: PhysicalSize, @@ -56,6 +60,12 @@ impl WindowState { .ok_or_else(|| LayerShikaError::InvalidInput("Layer surface is required".into()))?, fractional_scale: builder.fractional_scale, viewport: builder.viewport, + pointer: builder + .pointer + .ok_or_else(|| LayerShikaError::InvalidInput("Pointer is required".into()))?, + output: builder + .output + .ok_or_else(|| LayerShikaError::InvalidInput("Output is required".into()))?, size: builder.size.unwrap_or_default(), logical_size: PhysicalSize::default(), output_size: builder.output_size.unwrap_or_default(),