NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1133 most downloaded on crates.io
Rust bindings to X11
Last release 2 months ago
16 Jul 2026
Ships fairly regularly
a new release about every 5 months
Nearly every release is documented
notes for 8 of 8 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
8 releases · first in 2022
One column per quarter.
Allow building with libloading 0.9.
New features:
Fixes:
CUT_BUFFER0 to CUT_BUFFER7 atom names. The generated code previously
used CUT_BUFFE_R0.Breaking changes:
Minor changes:
Update cursor icon file search path to follow a change in libxcb-cursor which in turn was changed to follow libXcursor.
New features:
$XCURSOR_THEME if set.XCBConnection::from_existing_connection to allow wrapping anything
that implements AsRawXcbConection. Without this function, unsafe code was
required from the user.raw-window-handle feature which makes XCBConnection implement
HasRawDisplayHandle and WindowWrapper implement HasRawWindowHandle.hints.mostly-unused Cargo feature. This might improve compilation
speed with nightly compilers.Fixes:
cargo test --no-default-features works. This is now also tested in CI.present feature depends on dri3 to actually work, but this was not
specified in Cargo.toml.Breaking changes:
Minor changes:
Add an xkbcommon-example to showcase use of x11rb together with the xkbcommon crate.
New features:
xkbcommon-example to showcase use of x11rb together with the
xkbcommon crate.Fixes:
atom_manager! macro now uses::std when referring to std
items.Breaking changes:
atom_manager! implementation. This changes the contents of the
generated Cookie struct, but there should be no reasons to access these
directly.StreamAdaptor.Minor changes:
A bitmask enum in the generates code has new methods bits() for conversion to integer and remove() for removing certain bits.
New features:
bits() for conversion
to integer and remove() for removing certain bits.$DISPLAY parsing to match new behaviour in libxcb 1.16.x11rb_protocol::parse_display is now also available in
no_std mode.$DISPLAY parsing fails.Image::into_owned() to get an Image instance with 'static.Image::put() to convert the image to the X11 server's native
representation before uploading.RequestConnection for &C, &mut C, Box<C>, Arc<C>,
Rc<C> and Cow<'_, C> where C: RequestConnection.Fixes:
dl-libxcb feature on OpenBSD. There is no libxcb.so.2 on this
system and we can simply ask for libxcb.so to be loaded.Breaking changes:
WmClass, WmSizeHints, and
WmHints helpers by introducing an Option in their return value.
Previously, missing properties were reported as a parsing error.Vec in some places in x11rb-protocol by using arrays instead. This
affects the return value of a request's serialize() function, but also some
internal code.read_exact() method in x11rb's Stream trait.PartialEq due to rustix's behaviour. FD
passing now uses std::os::unix::io::OwnedFd.x11rb::rust_connection::stream::DefaultStream to
also return the address that a connection was established to.WindowWrapper not to require a reference to a
connection, but to accept any connection type directly. Due to the new feature
mentioned above, this allows to use these wrappers e.g. with Arc<C>.PartialEq, Eq, PartialOrd, Ord, and Hash only if the new
extra-traits feature is enabled. The Debug impl only produces the name of
the type and not its contents in this case. This change improves compile times
of the crate.R::try_parse_request function is now gated
behind the new request-parsing feature. This change improves compile times.Minor changes:
unix by using rustix instead.There is a new crate x11rb-async that brings x11rb to the async ecosystem.
New features:
as-raw-xcb-connection crate.x11rb_protocol::connection::Connection.tracing crate.Fixes:
Image::get() for big-endian servers.XCBConnection on architectures without AtomicU64.Breaking changes:
x11rb_protocol::protocol::xinput::EventForSend now return
ParseError instead of unwrapping errors internally.x11rb_protocol::protocol::xkb are
now better. For example, SelectEventsAuxBitcase1 is now called
SelectEventsAuxNewKeyboardNotify, which at least hints towards its meaning.Image::get() now also returns the visual ID from the GetImageReply.Minor changes:
unwrap()s in generated code by moving this to a
hand-written helper function.unwrap()s in examples.Fix connection breakage after sending 2^16 requests without a reply.
Fixes:
All extensions are available in no-std mode.
New features:
Serialize.x11rb::image::Image now implements Clone.Fixes:
Breaking changes:
xproto::ConfigWindow fit into u8, so previously this was the type used for
representing this enumeration. However, it is used as a mask for the
value_mask field of ConfigureRequestEvent, which has 16 bits. Thus,
ConfigWindow is now represented as u16 and the value_mask field of
ConfigureRequestEvent now has type ConfigWindow.once_cell switched to the 2021 edition.Minor changes:
discard_reply() implementation in Rust for cases with many pending
replies via a binary search.x11rb was split into two crates: x11rb-protocol contains code for working with the X11 protocol, but does not do any X11 I/O. The x11rb crate uses x11
New features:
Default,
PartialOrd, Ord, and Hash.x11rb-protocol can be used in no_std mode.serde::Serialize and
serde::Deserialize.Breaking changes:
CreateWindowRequest::send() was previously an associated function
and was removed, because a similar feature is available via the new request
traits. Also, the API for constructing a resource manager database was changed
to remove the need for network I/O from its constructor. A convenience
function for the old default behaviour is provided in x11rb.Minor changes:
#[must_use] to setter methods on *Aux structs.CLOEXEC flag applied.Your coding agent can read these notes before it upgrades. Set up the MCP server →