From c5f15297d53904ecfb1e2e6e2df915e380eff2e0 Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Wed, 11 Nov 2026 17:31:19 -0700 Subject: do proper color management well, sort of. we can't test indexed color, so there's no code specifically accounting for it. ah well. Change-Id: Ic12854c17fd7d433a7ee129ad5663d1bdb2ee541 Force-Push: yes --- src/xcolor.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/xcolor.rs (limited to 'src/xcolor.rs') diff --git a/src/xcolor.rs b/src/xcolor.rs new file mode 100644 index 0000000..0fab0c8 --- /dev/null +++ b/src/xcolor.rs @@ -0,0 +1,46 @@ +/* Color management in X has become an obscure topic because everyone prefers + * to assume they have 24-bit direct. In dealing with it, [1] has been an + * important resource. + * + * [1] https://xcb.freedesktop.org/xlibtoxcbtranslationguide/ + */ +use crate::xtypes::*; + +use xcb::x::{ AllocColor, Visualtype }; + + +pub trait DisplayColorExt: DisplayExt { + /* This is sufficiently obscure knowledge that it's worth keeping here + * even though it's unused. + */ + #[allow(dead_code)] + fn find_root_visual(&self) -> Option<&Visualtype> { + let visual_id = self.screen().root_visual(); + + for depth in self.screen().allowed_depths() { + for visual in depth.visuals() { + if visual_id == visual.visual_id() { + return Some(visual); + } + } + } + + None + } + + fn allocate_color(&self, red: u16, green: u16, blue: u16) + -> xcb::Result + { + let colormap = self.screen().default_colormap(); + + let cookie = self.send_request(&AllocColor { + cmap: colormap, + red, green, blue, + }); + + Ok(self.wait_for_reply(cookie)?.pixel()) + } +} + +impl DisplayColorExt for T { } + -- cgit 1.4.1