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(())
}
}