From 4db71cb0e671868b28f3b15e39d3c476f2218fc0 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 18 Mar 2025 16:56:27 -0400 Subject: [PATCH] fix: create fractional scale for sctk subsurfaces --- .../wayland/event_loop/state.rs | 21 +++++++++++++------ .../wayland/subsurface_widget.rs | 3 +++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/winit/src/platform_specific/wayland/event_loop/state.rs b/winit/src/platform_specific/wayland/event_loop/state.rs index 2ed33e71..ad199c4f 100644 --- a/winit/src/platform_specific/wayland/event_loop/state.rs +++ b/winit/src/platform_specific/wayland/event_loop/state.rs @@ -518,15 +518,19 @@ impl SctkState { let mut id = None; for subsurface in &self.subsurfaces { - if subsurface.instance.parent != surface.id() { + if subsurface.instance.wl_surface != *surface { continue; } + id = Some(subsurface.id); + if legacy && subsurface.instance.wp_fractional_scale.is_some() { + return; + } + let mut common = subsurface.common.lock().unwrap(); + common.fractional_scale = Some(scale_factor); + if legacy { + subsurface.instance.wl_surface.set_buffer_scale(scale_factor as _); + } - self.sctk_events.push(SctkEvent::SurfaceScaleFactorChanged( - scale_factor, - surface.clone(), - subsurface.id, - )); } if let Some(popup) = self @@ -1575,6 +1579,10 @@ impl SctkState { &self.queue_handle, cctk::sctk::globals::GlobalData, ); + let wp_fractional_scale = + self.fractional_scaling_manager.as_ref().map(|fsm| { + fsm.fractional_scaling(&wl_surface, &self.queue_handle) + }); let wp_alpha_modifier_surface = subsurface_state .wp_alpha_modifier @@ -1595,6 +1603,7 @@ impl SctkState { wl_subsurface: wl_subsurface.clone(), wp_viewport: wp_viewport.clone(), wp_alpha_modifier_surface: wp_alpha_modifier_surface, + wp_fractional_scale, wl_buffer: None, bounds: Some(bounds), diff --git a/winit/src/platform_specific/wayland/subsurface_widget.rs b/winit/src/platform_specific/wayland/subsurface_widget.rs index 69d0b203..7c9b919b 100644 --- a/winit/src/platform_specific/wayland/subsurface_widget.rs +++ b/winit/src/platform_specific/wayland/subsurface_widget.rs @@ -48,6 +48,7 @@ use wayland_protocols::wp::{ wp_alpha_modifier_surface_v1::WpAlphaModifierSurfaceV1, wp_alpha_modifier_v1::WpAlphaModifierV1, }, + fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1, linux_dmabuf::zv1::client::{ zwp_linux_buffer_params_v1::{self, ZwpLinuxBufferParamsV1}, zwp_linux_dmabuf_v1::{self, ZwpLinuxDmabufV1}, @@ -455,6 +456,7 @@ impl SubsurfaceState { wp_alpha_modifier_surface, wl_buffer: None, bounds: None, + wp_fractional_scale: None, transform: wl_output::Transform::Normal, z: 0, parent: parent.id(), @@ -612,6 +614,7 @@ pub(crate) struct SubsurfaceInstance { pub(crate) wl_surface: WlSurface, pub(crate) wl_subsurface: WlSubsurface, pub(crate) wp_viewport: WpViewport, + pub(crate) wp_fractional_scale: Option, pub(crate) wp_alpha_modifier_surface: Option, pub(crate) wl_buffer: Option, pub(crate) bounds: Option>,