jay-compositor 1.13.0

The Jay compositor
use {
    crate::{
        client::{Client, ClientError},
        leaks::Tracker,
        object::{Object, Version},
        wire::{JayKeymapBuilderId, jay_keymap_builder::*},
    },
    std::{cell::Cell, rc::Rc},
    thiserror::Error,
    uapi::OwnedFd,
};

pub struct JayKeymapBuilder {
    pub id: JayKeymapBuilderId,
    pub client: Rc<Client>,
    pub tracker: Tracker<Self>,
    pub version: Version,
    pub kind: Cell<Option<MapKind>>,
    pub shortcuts_group: Cell<Option<u32>>,
}

pub enum MapKind {
    Map {
        fd: Rc<OwnedFd>,
        len: u32,
    },
    Names {
        rules: Option<String>,
        model: Option<String>,
        layout: Option<String>,
        variant: Option<String>,
        options: Option<String>,
    },
}

impl JayKeymapBuilderRequestHandler for JayKeymapBuilder {
    type Error = JayKeymapBuilderError;

    fn set_map(&self, req: SetMap, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.kind.set(Some(MapKind::Map {
            fd: req.keymap,
            len: req.keymap_len,
        }));
        Ok(())
    }

    fn set_names(&self, req: SetNames<'_>, _slf: &Rc<Self>) -> Result<(), Self::Error> {
        self.kind.set(Some(MapKind::Names {
            rules: req.rules.map(Into::into),
            model: req.model.map(Into::into),
            layout: req.layout.map(Into::into),
            variant: req.variant.map(Into::into),
            options: req.options.map(Into::into),
        }));
        Ok(())
    }

    fn set_shortcuts_group(
        &self,
        req: SetShortcutsGroup,
        _slf: &Rc<Self>,
    ) -> Result<(), Self::Error> {
        self.shortcuts_group.set(Some(req.group));
        Ok(())
    }

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

object_base! {
    self = JayKeymapBuilder;
    version = self.version;
}

impl Object for JayKeymapBuilder {}

dedicated_add_obj!(JayKeymapBuilder, JayKeymapBuilderId, jay_keymap_builders);

#[derive(Debug, Error)]
pub enum JayKeymapBuilderError {
    #[error(transparent)]
    ClientError(Box<ClientError>),
}
efrom!(JayKeymapBuilderError, ClientError);