refactor: keep pointer and output alive

This commit is contained in:
drendog 2025-10-25 19:33:16 +02:00
parent 98c506dfd2
commit 18d1827415
Signed by: dwenya
GPG key ID: 8DD77074645332D0
3 changed files with 24 additions and 3 deletions

View file

@ -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)

View file

@ -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<PhysicalSize>,
pub output_size: Option<PhysicalSize>,
pub pointer: Option<Rc<WlPointer>>,
pub output: Option<Rc<WlOutput>>,
pub window: Option<Rc<FemtoVGWindow>>,
pub scale_factor: f32,
pub height: u32,
@ -60,6 +61,12 @@ impl WindowStateBuilder {
self
}
#[must_use]
pub fn with_output(mut self, output: Rc<WlOutput>) -> Self {
self.output = Some(output);
self
}
#[must_use]
pub fn with_window(mut self, window: Rc<FemtoVGWindow>) -> 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,

View file

@ -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<ZwlrLayerSurfaceV1>,
fractional_scale: Option<Rc<WpFractionalScaleV1>>,
viewport: Option<Rc<WpViewport>>,
#[allow(dead_code)]
pointer: Rc<WlPointer>,
#[allow(dead_code)]
output: Rc<WlOutput>,
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(),