jay-compositor 1.15.0

The Jay compositor
use crate::client::Client;
use crate::client::ClientId;
use crate::ifs::ipc::DataOffer;
use crate::ifs::ipc::DataOfferId;
use crate::ifs::ipc::DynDataOffer;
use crate::ifs::ipc::OfferData;
use crate::ifs::ipc::OfferDestroyReason;
use crate::ifs::ipc::break_offer_loops;
use crate::ifs::ipc::cancel_offer;
use crate::ifs::ipc::destroy_data_offer_with_reason;
use crate::ifs::ipc::receive_data_offer;
use crate::ifs::ipc::zwp_primary_selection_device_v1::PrimarySelectionIpc;
use crate::ifs::ipc::zwp_primary_selection_device_v1::ZwpPrimarySelectionDeviceV1;
use crate::ifs::wl_seat::WlSeatGlobal;
use crate::leaks::Tracker;
use crate::object::BreakLoops;
use crate::object::Version;
use crate::wire::ZwpPrimarySelectionOfferV1Id;
use crate::wire::zwp_primary_selection_offer_v1::*;
use jay_proc::Object;
use std::convert::Infallible;
use std::rc::Rc;

#[derive(Object)]
#[break_loops]
pub struct ZwpPrimarySelectionOfferV1 {
    pub id: ZwpPrimarySelectionOfferV1Id,
    pub offer_id: DataOfferId,
    pub seat: Rc<WlSeatGlobal>,
    pub client: Rc<Client>,
    pub data: OfferData<ZwpPrimarySelectionDeviceV1>,
    pub tracker: Tracker<Self>,
    pub version: Version,
}

impl DataOffer for ZwpPrimarySelectionOfferV1 {
    type Device = ZwpPrimarySelectionDeviceV1;

    fn offer_data(&self) -> &OfferData<Self::Device> {
        &self.data
    }
}

impl DynDataOffer for ZwpPrimarySelectionOfferV1 {
    fn offer_id(&self) -> DataOfferId {
        self.offer_id
    }

    fn client_id(&self) -> ClientId {
        self.client.id
    }

    fn send_offer(&self, mime_type: &str) {
        ZwpPrimarySelectionOfferV1::send_offer(self, mime_type);
    }

    fn cancel(&self) {
        cancel_offer::<PrimarySelectionIpc>(self);
    }

    fn get_seat(&self) -> Rc<WlSeatGlobal> {
        self.seat.clone()
    }
}

impl ZwpPrimarySelectionOfferV1 {
    fn send_offer(&self, mime_type: &str) {
        self.client.event(Offer {
            self_id: self.id,
            mime_type,
        });
    }
}

impl ZwpPrimarySelectionOfferV1RequestHandler for ZwpPrimarySelectionOfferV1 {
    type Error = Infallible;

    fn receive(&self, req: Receive<'_>, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        receive_data_offer::<PrimarySelectionIpc>(self, req.mime_type, req.fd);
        Ok(())
    }

    fn destroy(&self, _req: Destroy, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        destroy_data_offer_with_reason::<PrimarySelectionIpc>(
            self,
            OfferDestroyReason::OfferClient,
        );
        self.client.remove_obj(self);
        Ok(())
    }
}

impl BreakLoops for ZwpPrimarySelectionOfferV1 {
    fn break_loops(self: Rc<Self>) {
        break_offer_loops::<PrimarySelectionIpc>(&*self);
    }
}