jay-compositor 1.15.0

The Jay compositor
use crate::client::Client;
use crate::it::test_client::TestClient;
use crate::it::test_error::TestErrorError;
use crate::it::test_ifs::test_data_offer::TestDataOffer;
use crate::it::test_ifs::test_data_source::TestDataSource;
use crate::it::test_ifs::test_seat::TestSeat;
use crate::it::test_ifs::test_surface::TestSurface;
use crate::wire::WlDataDeviceId;
use crate::wire::WlSurfaceId;
use crate::wire::wl_data_device::*;
use std::rc::Rc;

pub struct TestDataDevice {
    pub id: WlDataDeviceId,
    pub client: Rc<Client>,
}

impl TestDataDevice {
    pub fn start_drag(
        &self,
        source: &TestDataSource,
        origin: &TestSurface,
        icon: Option<&TestSurface>,
        serial: u32,
    ) {
        self.client.send_wl_data_device_start_drag(
            self.id,
            source.id,
            origin.id,
            icon.map(|i| i.id).unwrap_or(WlSurfaceId::NONE),
            serial,
        );
    }

    pub fn set_selection(&self, source: &TestDataSource, serial: u32) {
        self.client
            .send_wl_data_device_set_selection(self.id, source.id, serial);
    }
}

synthetic_event_handler!(TestDataDevice);

impl WlDataDeviceEventHandler for TestDataDevice {
    type Error = TestErrorError;

    fn data_offer(&self, ev: DataOffer, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        let offer = Rc::new(TestDataOffer {
            id: ev.id,
            client: self.client.clone(),
        });
        self.client.set_synthetic_event_handler(ev.id, &offer);
        offer.destroy();
        Ok(())
    }

    fn enter(&self, _ev: Enter, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        Ok(())
    }

    fn leave(&self, _ev: Leave, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        Ok(())
    }

    fn motion(&self, _ev: Motion, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        Ok(())
    }

    fn drop_(&self, _ev: Drop, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        Ok(())
    }

    fn selection(&self, _ev: Selection, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        Ok(())
    }
}

impl TestClient {
    pub fn get_data_device(&self, seat: &TestSeat) -> Rc<TestDataDevice> {
        let client = &self.client;
        let id = client.send_wl_data_device_manager_get_data_device(seat.id);
        let dev = Rc::new(TestDataDevice {
            id,
            client: client.clone(),
        });
        client.set_synthetic_event_handler(id, &dev);
        dev
    }
}