From 9f61e842d01f910349458466c3749d92561f5cde Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Thu, 12 Nov 2026 21:38:14 -0700 Subject: move XftDraw pointers into a new wrapper FontGraphicContext impl Drop :) Force-Push: yes Change-Id: I2a2a488819c9f03205aade5dd5d119c02dd8a3c2 --- src/main.rs | 23 +++-------------------- src/x.rs | 2 ++ src/x/font.rs | 5 +++-- src/x/font_context.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 src/x/font_context.rs 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, + context_state: *mut XftDraw, +} + + +impl FontGraphicContext { + pub fn new(window: &Window) -> xcb::Result { + 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) }; + } +} + -- cgit 1.4.1