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_error::TestResult;
use crate::it::test_ifs::test_data_control_offer::TestDataControlOffer;
use crate::it::test_ifs::test_data_control_source::TestDataControlSource;
use crate::it::test_ifs::test_seat::TestSeat;
use crate::it::test_utils::test_expected_event::TEEH;
use crate::utils::copyhashmap::CopyHashMap;
use crate::wire::ZwlrDataControlDeviceV1Id;
use crate::wire::ZwlrDataControlOfferV1Id;
use crate::wire::zwlr_data_control_device_v1::*;
use std::rc::Rc;

pub struct TestDataControlDevice {
    pub id: ZwlrDataControlDeviceV1Id,
    pub client: Rc<Client>,
    pub pending_offer: CopyHashMap<ZwlrDataControlOfferV1Id, Rc<TestDataControlOffer>>,
    pub selection: TEEH<Option<Rc<TestDataControlOffer>>>,
    pub primary_selection: TEEH<Option<Rc<TestDataControlOffer>>>,
}

impl TestDataControlDevice {
    pub fn set_selection(&self, source: &TestDataControlSource) {
        self.client
            .send_zwlr_data_control_device_v1_set_selection(self.id, source.id);
    }

    #[expect(unused)]
    pub fn set_primary_selection(&self, source: &TestDataControlSource) {
        self.client
            .send_zwlr_data_control_device_v1_set_primary_selection(self.id, source.id);
    }

    fn take_offer(
        &self,
        id: ZwlrDataControlOfferV1Id,
    ) -> TestResult<Option<Rc<TestDataControlOffer>>> {
        if id.is_none() {
            Ok(None)
        } else {
            match self.pending_offer.remove(&id) {
                Some(o) => Ok(Some(o)),
                _ => bail!("Unknown offer {}", id),
            }
        }
    }
}

synthetic_event_handler!(TestDataControlDevice);

impl ZwlrDataControlDeviceV1EventHandler for TestDataControlDevice {
    type Error = TestErrorError;

    fn data_offer(&self, ev: DataOffer, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        let obj = Rc::new(TestDataControlOffer {
            id: ev.id,
            client: self.client.clone(),
            offers: Default::default(),
        });
        self.client.set_synthetic_event_handler(ev.id, &obj);
        self.pending_offer.set(obj.id, obj);
        Ok(())
    }

    fn selection(&self, ev: Selection, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.selection.push(self.take_offer(ev.id)?);
        Ok(())
    }

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

    fn primary_selection(&self, ev: PrimarySelection, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.primary_selection.push(self.take_offer(ev.id)?);
        Ok(())
    }
}

impl TestClient {
    pub fn get_data_control_device(&self, seat: &TestSeat) -> Rc<TestDataControlDevice> {
        let client = &self.client;
        let id = client.send_zwlr_data_control_manager_v1_get_data_device(seat.id);
        let dev = Rc::new(TestDataControlDevice {
            id,
            client: client.clone(),
            pending_offer: Default::default(),
            selection: Default::default(),
            primary_selection: Default::default(),
        });
        client.set_synthetic_event_handler(id, &dev);
        dev
    }
}