jay-compositor 1.15.0

The Jay compositor
use crate::client::Client;
use crate::it::test_error::TestErrorError;
use crate::it::test_ifs::test_keyboard::TestKeyboard;
use crate::it::test_ifs::test_pointer::TestPointer;
use crate::utils::clonecell::CloneCell;
use crate::wire::WlSeatId;
use crate::wire::wl_seat::*;
use std::cell::Cell;
use std::rc::Rc;

pub struct TestSeat {
    pub id: WlSeatId,
    pub client: Rc<Client>,
    pub caps: Cell<u32>,
    pub name: CloneCell<Option<Rc<String>>>,
}

impl TestSeat {
    pub fn get_keyboard(&self) -> Rc<TestKeyboard> {
        let id = self.client.send_wl_seat_get_keyboard(self.id);
        let kb = Rc::new(TestKeyboard {
            keymap: Default::default(),
            key: Default::default(),
            modifiers: Default::default(),
            enter: Default::default(),
            leave: Default::default(),
            event_id: Default::default(),
        });
        self.client.set_synthetic_event_handler(id, &kb);
        kb
    }

    pub fn get_pointer(&self) -> Rc<TestPointer> {
        let id = self.client.send_wl_seat_get_pointer(self.id);
        let pointer = Rc::new(TestPointer {
            id,
            client: self.client.clone(),
            leave: Default::default(),
            enter: Default::default(),
            motion: Default::default(),
            button: Default::default(),
            axis_relative_direction: Default::default(),
        });
        self.client.set_synthetic_event_handler(id, &pointer);
        pointer
    }
}

synthetic_event_handler!(TestSeat);

impl WlSeatEventHandler for TestSeat {
    type Error = TestErrorError;

    fn capabilities(&self, ev: Capabilities, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.caps.set(ev.capabilities);
        Ok(())
    }

    fn name(&self, ev: Name<'_>, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.name.set(Some(Rc::new(ev.name.to_string())));
        Ok(())
    }
}