jay-compositor 1.15.0

The Jay compositor
use crate::fixed::Fixed;
use crate::ifs::wl_seat::WlSeat;
use crate::leaks::Tracker;
use crate::object::Version;
use crate::wire::WlSurfaceId;
use crate::wire::WlTouchId;
use crate::wire::wl_touch::*;
use jay_proc::Object;
use std::convert::Infallible;
use std::rc::Rc;

#[expect(unused)]
pub const SHAPE_SINCE_VERSION: Version = Version(6);
#[expect(unused)]
pub const ORIENTATION_DIRECTION_SINCE_VERSION: Version = Version(6);

#[derive(Object)]
pub struct WlTouch {
    id: WlTouchId,
    version: Version,
    seat: Rc<WlSeat>,
    pub tracker: Tracker<Self>,
}

impl WlTouch {
    pub fn new(id: WlTouchId, seat: &Rc<WlSeat>) -> Self {
        Self {
            id,
            version: seat.version,
            seat: seat.clone(),
            tracker: Default::default(),
        }
    }

    pub fn send_down(
        &self,
        serial: u64,
        time: u32,
        surface: WlSurfaceId,
        id: i32,
        mut x: Fixed,
        mut y: Fixed,
    ) {
        logical_to_client_wire_scale!(self.seat.client, x, y);
        self.seat.client.event(Down {
            self_id: self.id,
            serial: serial as _,
            time,
            surface,
            id,
            x,
            y,
        });
    }

    pub fn send_up(&self, serial: u64, time: u32, id: i32) {
        self.seat.client.event(Up {
            self_id: self.id,
            serial: serial as _,
            time,
            id,
        });
    }

    pub fn send_motion(&self, time: u32, id: i32, mut x: Fixed, mut y: Fixed) {
        logical_to_client_wire_scale!(self.seat.client, x, y);
        self.seat.client.event(Motion {
            self_id: self.id,
            time,
            id,
            x,
            y,
        });
    }

    pub fn send_frame(&self) {
        self.seat.client.event(Frame { self_id: self.id });
    }

    pub fn send_cancel(&self) {
        self.seat.client.event(Cancel { self_id: self.id });
    }

    #[expect(unused)]
    pub fn send_shape(&self, id: i32, major: Fixed, minor: Fixed) {
        self.seat.client.event(Shape {
            self_id: self.id,
            id,
            major,
            minor,
        });
    }

    #[expect(unused)]
    pub fn send_orientation(&self, id: i32, orientation: Fixed) {
        self.seat.client.event(Orientation {
            self_id: self.id,
            id,
            orientation,
        });
    }
}

impl WlTouchRequestHandler for WlTouch {
    type Error = Infallible;

    fn release(&self, _req: Release, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.seat.touches.remove(&self.id);
        self.seat.client.remove_obj(self);
        Ok(())
    }
}