summary refs log tree commit diff
path: root/src/xcolor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/xcolor.rs')
-rw-r--r--src/xcolor.rs46
1 files changed, 46 insertions, 0 deletions
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<u32>
+  {
+    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<T: DisplayExt> DisplayColorExt for T { }
+