summary refs log tree commit diff
path: root/src/x/color.rs
blob: 10ad6517ba4adda7296db95e43e282ad505f3b11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*   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::x::connection::*;
use crate::x::display::*;

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 connection = self.connection();

    let colormap = self.screen().default_colormap();

    let cookie = connection.send_request(&AllocColor {
      cmap: colormap,
      red, green, blue,
    });

    Ok(connection.wait_for_reply(cookie)?.pixel())
  }
}

impl<T: DisplayExt> DisplayColorExt for T { }