Macro x11rb::atom_manager [−][src]
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, } }