macro_rules! atoms_struct {
(
$(#[$outer:meta])*
$vis:vis struct $Atoms:ident {
$(
$(#[$fmeta:meta])* $fvis:vis $field:ident => $name:tt $( only_if_exists = $only_if_exists:expr)?,
)*
}
) => { ... };
}Expand description
An helper macro that generate a struct of atoms.
The struct provide a constructor intern_all that takes a Connection as parameter,
interns all the atoms and return xcb::Result<[struct name]>.
intern_all takes advantage of XCB asynchronous design by sending all the
x::InternAtom requests before starting to wait for the first reply.
Fields that refer to atoms not existing in the server are set to x::ATOM_NONE
(i.e. only_if_exists is always set to true).
Both the struct and each field can receive visibility attributes.
ยงExample
xcb::atoms_struct! {
#[derive(Copy, Clone, Debug)]
pub(crate) struct Atoms {
pub wm_protocols => b"WM_PROTOCOLS",
pub wm_del_window => b"WM_DELETE_WINDOW",
/// Supported EWMH hints
pub net_supported => b"_NET_SUPPORTED",
// You can also explicitly set the `only_if_exists` argument when interning
// each atom with the following syntax (the default is `true`):
pub custom_atom => b"MY_CUSTOM_ATOM" only_if_exists = false,
}
}
fn main() -> xcb::Result<()> {
// ...
let atoms = Atoms::intern_all(&conn)?;
conn.check_request(conn.send_request_checked(&x::ChangeProperty {
mode: x::PropMode::Replace,
window,
property: atoms.wm_protocols,
r#type: x::ATOM_ATOM,
data: &[atoms.wm_del_window],
}))?;
// ...
}