use crate::x::*; use std::sync::Arc; use xcb::x::{ Drawable, CreateGc, FreeGc }; pub struct GraphicContext { display: Arc, context_id: xcb::x::Gcontext, } impl HasDisplay for GraphicContext { fn display(&self) -> &Arc { &self.display } } impl HasConnection for GraphicContext { fn connection(&self) -> &Connection { self.display.connection() } } impl GraphicContext { pub fn new(display: Arc, drawable: Drawable) -> xcb::Result { let context_id: xcb::x::Gcontext = display.generate_id(); let cookie = display.send_request_checked(&CreateGc { cid: context_id, drawable, value_list: &[], }); display.check_request(cookie)?; Ok(GraphicContext { display, context_id }) } } impl Drop for GraphicContext { fn drop(&mut self) { let cookie = self.send_request_checked(&FreeGc { gc: self.context_id }); let _ = self.check_request(cookie); // TODO } } pub trait HasGraphicContext { fn graphic_context(&self) -> &GraphicContext; } impl HasGraphicContext for GraphicContext { fn graphic_context(&self) -> &GraphicContext { self } } pub trait GraphicContextExt: HasGraphicContext + HasDisplay + HasConnection { fn graphic_context_id(&self) -> xcb::x::Gcontext { self.graphic_context().context_id } } impl GraphicContextExt for T { }