use crate::x::*; use std::sync::Arc; use std::ops::Deref; use xcb::x::{ self, Atom, ChangeProperty, CreateWindow, MapWindow, PropMode, }; pub struct Window { display: Arc, window_id: x::Window, } impl HasConnection for Window { fn connection(&self) -> &Connection { self.display.connection() } } impl HasDisplay for Window { fn display(&self) -> &Arc { &self.display } } impl Window { pub fn new(display: Arc, create_window: &mut CreateWindow) -> xcb::Result { let connection = display.connection(); let window_id: x::Window = connection.generate_id(); create_window.wid = window_id; let cookie = connection.send_request_checked(create_window); connection.check_request(cookie)?; Ok(Window { display, window_id }) } } pub trait HasWindow { fn window(&self) -> &Window; } impl HasWindow for Window { fn window(&self) -> &Window { self } } impl> HasWindow for T { fn window(&self) -> &Window { &*self } } pub trait WindowExt: HasWindow + HasDisplay + HasConnection { fn window_id(&self) -> x::Window { self.window().window_id } fn map_window(&self) -> xcb::Result<()> { let connection = self.connection(); let cookie = connection.send_request_checked(&MapWindow { window: self.window_id() }); connection.check_request(cookie)?; Ok(()) } fn set_string_property(&self, property: &Atom, value: &[u8]) -> xcb::Result<()> { let connection = self.connection(); let cookie = connection.send_request_checked(&ChangeProperty { mode: PropMode::Replace, window: self.window_id(), property: *property, r#type: x::ATOM_STRING, data: value, }); connection.check_request(cookie)?; Ok(()) } fn set_atom_property(&self, property: &Atom, values: &[Atom]) -> xcb::Result<()> { let connection = self.connection(); let cookie = connection.send_request_checked(&ChangeProperty { mode: PropMode::Replace, window: self.window_id(), property: *property, r#type: x::ATOM_ATOM, data: values, }); connection.check_request(cookie)?; Ok(()) } fn set_cardinal_property(&self, property: &Atom, values: &[u32]) -> xcb::Result<()> { let connection = self.connection(); let cookie = connection.send_request_checked(&ChangeProperty { mode: PropMode::Replace, window: self.window_id(), property: *property, r#type: x::ATOM_CARDINAL, data: values, }); connection.check_request(cookie)?; Ok(()) } } impl WindowExt for T { }