From 960663d476d8a1391b8bcc4424f3f716147068ab Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Wed, 11 Nov 2026 21:03:30 -0700 Subject: all the xcb wrapper types are in individual files now the trait inheritance structure isn't THAT convoluted, but having more than one of these in a file was obscuring things. Change-Id: I5132a6304796654d778d731be1ecb1c7b4e77120 Force-Push: yes --- src/x/window.rs | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/x/window.rs (limited to 'src/x/window.rs') diff --git a/src/x/window.rs b/src/x/window.rs new file mode 100644 index 0000000..d264eb9 --- /dev/null +++ b/src/x/window.rs @@ -0,0 +1,134 @@ +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 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; + + fn window_id(&self) -> x::Window { self.window().window_id } +} + +impl HasWindow for Window { + fn window(&self) -> &Window { self } +} + +impl> HasWindow for T { + fn window(&self) -> &Window { &*self } +} + + +impl HasConnection for Window { + fn connection(&self) -> &Connection { self.display.connection() } +} + + +impl HasDisplay for Window { + fn display(&self) -> &Arc { &self.display } +} + + + + +pub trait WindowExt: HasWindow + HasDisplay + HasConnection { + 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 { } + -- cgit 1.4.1