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) }; } }