Skip to main content

winit/platform_impl/linux/wayland/types/
wp_fractional_scaling.rs

1//! Handling of the fractional scaling.
2
3use 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
15/// The scaling factor denominator.
16const SCALE_DENOMINATOR: f64 = 120.;
17
18/// Fractional scaling manager.
19#[derive(Debug)]
20pub struct FractionalScalingManager {
21    manager: WpFractionalScaleManagerV1,
22}
23
24pub struct FractionalScaling {
25    /// The surface used for scaling.
26    surface: WlSurface,
27}
28
29impl FractionalScalingManager {
30    /// Create new viewporter.
31    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        // No events.
59    }
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);