jay-compositor 1.15.0

The Jay compositor
use crate::client::Client;
use crate::ifs::wl_surface::WlSurface;
use crate::leaks::Tracker;
use crate::object::Version;
use crate::scale::Scale;
use crate::tree::TreeTimeline::LiveTL;
use crate::utils::cell_ext::CellExt;
use crate::wire::WpFractionalScaleV1Id;
use crate::wire::wp_fractional_scale_v1::*;
use jay_proc::Object;
use std::rc::Rc;
use thiserror::Error;

#[derive(Object)]
pub struct WpFractionalScaleV1 {
    id: WpFractionalScaleV1Id,
    client: Rc<Client>,
    surface: Rc<WlSurface>,
    pub tracker: Tracker<Self>,
    version: Version,
}

impl WpFractionalScaleV1 {
    pub fn new(id: WpFractionalScaleV1Id, surface: &Rc<WlSurface>, version: Version) -> Self {
        Self {
            id,
            client: surface.client.clone(),
            surface: surface.clone(),
            tracker: Default::default(),
            version,
        }
    }

    pub fn install(self: &Rc<Self>) -> Result<(), WpFractionalScaleError> {
        if self.surface.fractional_scale.is_some() {
            return Err(WpFractionalScaleError::Exists);
        }
        self.surface.fractional_scale.set(Some(self.clone()));
        Ok(())
    }

    pub fn send_preferred_scale(&self) {
        let scale = match self.client.wire_scale.is_some() {
            true => Scale::from_int(1),
            false => self.surface.output.get().node_state[LiveTL].scale.get(),
        };
        self.client.event(PreferredScale {
            self_id: self.id,
            scale: scale.to_wl(),
        });
    }
}

impl WpFractionalScaleV1RequestHandler for WpFractionalScaleV1 {
    type Error = WpFractionalScaleError;

    fn destroy(&self, _req: Destroy, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.surface.fractional_scale.take();
        self.client.remove_obj(self);
        Ok(())
    }
}

#[derive(Debug, Error)]
pub enum WpFractionalScaleError {
    #[error("The surface already has a fractional scale extension attached")]
    Exists,
}