Macro x11rb::atom_manager[][src]

macro_rules! atom_manager {
    {
        $vis:vis $struct_name:ident: $cookie_name:ident {
            $($field_name:ident$(: $atom_value:expr)?,)*
        }
    } => { ... };
}

A helper macro for managing atoms

If we need to use multiple atoms, one would normally write code such as

#[allow(non_snake_case)]
pub struct AtomCollection {
    pub _NET_WM_NAME: Atom,
    pub _NET_WM_ICON: Atom,
    pub ATOM_WITH_SPACES: Atom,
    pub WHATEVER: Atom,
}

#[allow(non_snake_case)]
struct AtomCollectionCookie<'c, C: ConnectionExt> {
    _NET_WM_NAME: Cookie<'c, C, InternAtomReply>,
    _NET_WM_ICON: Cookie<'c, C, InternAtomReply>,
    ATOM_WITH_SPACES: Cookie<'c, C, InternAtomReply>,
    WHATEVER: Cookie<'c, C, InternAtomReply>,
}

impl AtomCollection {
    pub fn new<C: ConnectionExt>(
        conn: &C,
    ) -> Result<AtomCollectionCookie<'_, C>, ConnectionError> {
        Ok(AtomCollectionCookie {
            _NET_WM_NAME: conn.intern_atom(false, b"_NET_WM_NAME")?,
            _NET_WM_ICON: conn.intern_atom(false, b"_NET_WM_ICON")?,
            ATOM_WITH_SPACES: conn.intern_atom(false, b"ATOM WITH SPACES")?,
            WHATEVER: conn.intern_atom(false, b"WHATEVER")?,
        })
    }
}

impl<'c, C> AtomCollectionCookie<'c, C>
where
    C: ConnectionExt,
{
    pub fn reply(self) -> Result<AtomCollection, ReplyError> {
        Ok(AtomCollection {
            _NET_WM_NAME: self._NET_WM_NAME.reply()?.atom,
            _NET_WM_ICON: self._NET_WM_ICON.reply()?.atom,
            ATOM_WITH_SPACES: self.ATOM_WITH_SPACES.reply()?.atom,
            WHATEVER: self.WHATEVER.reply()?.atom,
        })
    }
}

This macro automatically produces this code with

atom_manager! {
    pub AtomCollection: AtomCollectionCookie {
        _NET_WM_NAME,
        _NET_WM_ICON,
        ATOM_WITH_SPACES: b"ATOM WITH SPACES",
        WHATEVER,
    }
}