summary refs log tree commit diff
path: root/src/x/font_context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/x/font_context.rs')
-rw-r--r--src/x/font_context.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/x/font_context.rs b/src/x/font_context.rs
new file mode 100644
index 0000000..30e5165
--- /dev/null
+++ b/src/x/font_context.rs
@@ -0,0 +1,46 @@
+use crate::x::*;
+
+use std::sync::Arc;
+
+use x11::xft::{ XftDraw, XftDrawCreate, XftDrawDestroy };
+use xcb::{ Xid };
+
+
+pub struct FontGraphicContext {
+  display: Arc<Display>,
+  context_state: *mut XftDraw,
+}
+
+
+impl FontGraphicContext {
+  pub fn new(window: &Window) -> xcb::Result<FontGraphicContext> {
+    let display = Arc::clone(window.display());
+    let xlib_display = display.connection().get_xlib_display();
+
+    let x_visual = unsafe {
+      x11::xlib::XDefaultVisual(xlib_display, display.screen_index())
+    };
+
+    let colormap = window.screen().default_colormap();
+
+    let context_state = unsafe {
+      XftDrawCreate(xlib_display,
+                    window.window_id().resource_id() as u64,
+                    x_visual,
+                    colormap.resource_id() as u64)
+    };
+
+    Ok(FontGraphicContext { display, context_state })
+  }
+
+  pub fn get_xft_draw(&self) -> *mut XftDraw {
+    self.context_state
+  }
+}
+
+impl Drop for FontGraphicContext {
+  fn drop(&mut self) {
+    unsafe { XftDrawDestroy(self.context_state) };
+  }
+}
+