use crate::x::*; use std::ffi::CString; use std::sync::Arc; use x11::xft::{ XftColor, XftDraw, XftDrawStringUtf8, XftFontOpenName, }; pub struct Font { display: Arc, font_state: *mut x11::xft::XftFont, } impl Font { pub fn new(display: Arc, name: &str) -> xcb::Result { let xlib_display = display.connection().get_xlib_display(); let screen_index = display.screen_index(); let name = CString::new(name).unwrap(); let font_state = unsafe { XftFontOpenName(xlib_display, screen_index, name.as_ptr().cast()) }; Ok(Font { display, font_state }) } 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_draw, xft_color, self.font_state, x, y, text.as_ptr().cast(), text.count_bytes() as i32) }; Ok(()) } }