diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-11-11 21:03:30 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-11-11 21:32:53 -0700 |
| commit | 960663d476d8a1391b8bcc4424f3f716147068ab (patch) | |
| tree | 3bf7e3372295f67c4afcad07c0b74e23624ab60f /src/x/window.rs | |
| parent | 89a6a257f89bba997e778160c53938be371ec6ac (diff) | |
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
Diffstat (limited to 'src/x/window.rs')
| -rw-r--r-- | src/x/window.rs | 134 |
1 files changed, 134 insertions, 0 deletions
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<Display>, + window_id: x::Window, +} + + + +impl Window { + pub fn new(display: Arc<Display>, create_window: &mut CreateWindow) + -> xcb::Result<Window> + { + 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<T: Deref<Target=Window>> 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<Display> { &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<T: HasWindow + HasDisplay + HasConnection> WindowExt for T { } + |