winit/platform_impl/linux/wayland/types/
wp_fractional_scaling.rs1use sctk::reexports::client::globals::{BindError, GlobalList};
4use sctk::reexports::client::protocol::wl_surface::WlSurface;
5use sctk::reexports::client::{delegate_dispatch, Connection, Dispatch, Proxy, QueueHandle};
6use sctk::reexports::protocols::wp::fractional_scale::v1::client::wp_fractional_scale_manager_v1::WpFractionalScaleManagerV1;
7use sctk::reexports::protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1::{
8 Event as FractionalScalingEvent, WpFractionalScaleV1,
9};
10
11use sctk::globals::GlobalData;
12
13use crate::platform_impl::wayland::state::WinitState;
14
15const SCALE_DENOMINATOR: f64 = 120.;
17
18#[derive(Debug)]
20pub struct FractionalScalingManager {
21 manager: WpFractionalScaleManagerV1,
22}
23
24pub struct FractionalScaling {
25 surface: WlSurface,
27}
28
29impl FractionalScalingManager {
30 pub fn new(
32 globals: &GlobalList,
33 queue_handle: &QueueHandle<WinitState>,
34 ) -> Result<Self, BindError> {
35 let manager = globals.bind(queue_handle, 1..=1, GlobalData)?;
36 Ok(Self { manager })
37 }
38
39 pub fn fractional_scaling(
40 &self,
41 surface: &WlSurface,
42 queue_handle: &QueueHandle<WinitState>,
43 ) -> WpFractionalScaleV1 {
44 let data = FractionalScaling { surface: surface.clone() };
45 self.manager.get_fractional_scale(surface, queue_handle, data)
46 }
47}
48
49impl Dispatch<WpFractionalScaleManagerV1, GlobalData, WinitState> for FractionalScalingManager {
50 fn event(
51 _: &mut WinitState,
52 _: &WpFractionalScaleManagerV1,
53 _: <WpFractionalScaleManagerV1 as Proxy>::Event,
54 _: &GlobalData,
55 _: &Connection,
56 _: &QueueHandle<WinitState>,
57 ) {
58 }
60}
61
62impl Dispatch<WpFractionalScaleV1, FractionalScaling, WinitState> for FractionalScalingManager {
63 fn event(
64 state: &mut WinitState,
65 _: &WpFractionalScaleV1,
66 event: <WpFractionalScaleV1 as Proxy>::Event,
67 data: &FractionalScaling,
68 _: &Connection,
69 _: &QueueHandle<WinitState>,
70 ) {
71 if let FractionalScalingEvent::PreferredScale { scale } = event {
72 state.scale_factor_changed(&data.surface, scale as f64 / SCALE_DENOMINATOR, false);
73 }
74 }
75}
76
77delegate_dispatch!(WinitState: [WpFractionalScaleManagerV1: GlobalData] => FractionalScalingManager);
78delegate_dispatch!(WinitState: [WpFractionalScaleV1: FractionalScaling] => FractionalScalingManager);