summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-11-12 21:38:14 -0700
committerIrene Knapp <ireneista@irenes.space>2026-11-12 21:38:14 -0700
commit9f61e842d01f910349458466c3749d92561f5cde (patch)
tree595153f4d77646dfe2f6841292a084b78a844d39
parent7138ace1c1f97f85509278e50b72eb62ed0fd315 (diff)
move XftDraw pointers into a new wrapper FontGraphicContext
impl Drop :)

Force-Push: yes
Change-Id: I2a2a488819c9f03205aade5dd5d119c02dd8a3c2
-rw-r--r--src/main.rs23
-rw-r--r--src/x.rs2
-rw-r--r--src/x/font.rs5
-rw-r--r--src/x/font_context.rs46
4 files changed, 54 insertions, 22 deletions
diff --git a/src/main.rs b/src/main.rs
index ddb58cd..f70a22d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,11 +4,7 @@ use crate::x::*;
 use std::sync::Arc;
 
 use x11::xrender::XRenderColor;
-use x11::xft::{
-  XftFontOpenName,
-  XftDrawCreate, XftDrawDestroy,
-  XftColor
-};
+use x11::xft::XftColor;
 use xcb::{ Xid };
 use xcb::x::{
   ClientMessageData,
@@ -315,27 +311,14 @@ impl Dock {
 
 
   fn draw_text(&self) -> xcb::Result<()> {
-    let xlib_display = self.connection().get_xlib_display();
-    let x_visual = unsafe {
-      x11::xlib::XDefaultVisual(xlib_display,
-                                self.display().screen_index())
-    };
-
-    let xft_context = unsafe {
-      XftDrawCreate(xlib_display,
-                    self.window().window_id().resource_id() as u64,
-                    x_visual,
-                    self.screen().default_colormap().resource_id() as u64)
-    };
+    let context = FontGraphicContext::new(self.window())?;
 
     let xft_color = XftColor {
       pixel: self.configuration.foreground_pixel as u64,
       color: self.configuration.foreground_render_color,
     };
     let text = "playful cool fic tech nonfic";
-    self.font.draw(xft_context, &xft_color, 12, 25, text)?;
-
-    unsafe { XftDrawDestroy(xft_context) };
+    self.font.draw(&context, &xft_color, 12, 25, text)?;
 
     Ok(())
   }
diff --git a/src/x.rs b/src/x.rs
index 231ccd3..8fd7b0c 100644
--- a/src/x.rs
+++ b/src/x.rs
@@ -3,6 +3,7 @@ pub use context::{ GraphicContext, HasGraphicContext, GraphicContextExt };
 pub use connection::{ Connection, HasConnection, ConnectionExt };
 pub use display::{ Display, HasDisplay, DisplayExt };
 pub use font::Font;
+pub use font_context::FontGraphicContext;
 pub use geometry::{ X_CLOCKWISE_RIGHT_ANGLE, SideExt, RectangleExt };
 pub use window::{ Window, HasWindow, WindowExt };
 
@@ -10,6 +11,7 @@ pub mod atoms;
 pub mod color;
 pub mod connection;
 pub mod context;
+pub mod font_context;
 pub mod display;
 pub mod font;
 pub mod geometry;
diff --git a/src/x/font.rs b/src/x/font.rs
index 20ae7e4..d12cbe8 100644
--- a/src/x/font.rs
+++ b/src/x/font.rs
@@ -30,13 +30,14 @@ impl Font {
     Ok(Font { display, font_state })
   }
 
-  pub fn draw(&self, xft_context: *mut XftDraw, xft_color: &XftColor,
+  pub fn draw(&self, context: &FontGraphicContext, xft_color: &XftColor,
 	      x: i32, y: i32, text: &str)
     -> xcb::Result<()>
   {
+    let xft_draw = context.get_xft_draw();
     let text = CString::new(text).unwrap();
     unsafe {
-      XftDrawStringUtf8(xft_context, xft_color, self.font_state, x, y,
+      XftDrawStringUtf8(xft_draw, xft_color, self.font_state, x, y,
                         text.as_ptr().cast(), text.count_bytes() as i32)
     };
 
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) };
+  }
+}
+