diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-11-12 21:38:14 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-11-12 21:38:14 -0700 |
| commit | 9f61e842d01f910349458466c3749d92561f5cde (patch) | |
| tree | 595153f4d77646dfe2f6841292a084b78a844d39 /src/x/font_context.rs | |
| parent | 7138ace1c1f97f85509278e50b72eb62ed0fd315 (diff) | |
move XftDraw pointers into a new wrapper FontGraphicContext
impl Drop :) Force-Push: yes Change-Id: I2a2a488819c9f03205aade5dd5d119c02dd8a3c2
Diffstat (limited to 'src/x/font_context.rs')
| -rw-r--r-- | src/x/font_context.rs | 46 |
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) }; + } +} + |