diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs index 2c07e95..57eabf0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use crate::xtypes::*; use crate::xcolor::DisplayColorExt; +use crate::xcontext::GraphicContext; use std::sync::Arc; @@ -8,12 +9,16 @@ use xcb::x::{ self, ClientMessageData, Cw, CreateWindow, + CreateGc, FreeGc, + Drawable, EventMask, + PolyFillRectangle, Screen, WindowClass }; mod xcolor; +mod xcontext; mod xtypes; @@ -29,6 +34,7 @@ struct DockConfiguration { struct Dock { configuration: DockConfiguration, window: Window, + bounds: Arc<Rectangle<u16>>, } impl HasWindow for Dock { @@ -52,7 +58,7 @@ fn main() -> xcb::Result<()> { // #d4ffcc let background_pixel = display.allocate_color(54484, 65535, 52428)?; - let _dock = Dock::new(Arc::clone(&display), DockConfiguration { + let dock = Dock::new(Arc::clone(&display), DockConfiguration { thickness: 50, side: ScreenSide::Bottom, background_pixel, @@ -60,6 +66,10 @@ fn main() -> xcb::Result<()> { loop { match display.wait_for_event()? { + xcb::Event::X(x::Event::Expose(_event)) => { + let _ = dock.redraw(); // TODO + } + xcb::Event::X(x::Event::ButtonPress(event)) => { println!("click {:?}", event); } @@ -88,7 +98,6 @@ impl Dock { let dock_bounds = Dock::compute_bounds(&screen, &configuration); - println!("back pixel {:?}", configuration.background_pixel); let window = Window::new(Arc::clone(&display), &mut CreateWindow { depth: x::COPY_FROM_PARENT as u8, wid: x::Window::none(), @@ -105,15 +114,15 @@ impl Dock { Cw::EventMask(EventMask::EXPOSURE | EventMask::BUTTON_PRESS), ], })?; - let dock = Dock { window, configuration }; + let dock = Dock { window, configuration, bounds: Arc::new(dock_bounds) }; - dock.set_string_property(&x::ATOM_WM_NAME, b"grass bar")?; + dock.set_string_property(&x::ATOM_WM_NAME, b"sandbar")?; - dock.set_atom_property(&display.atoms().wm_protocols, - &[display.atoms().wm_delete_window])?; + dock.set_atom_property(&dock.atoms().wm_protocols, + &[dock.atoms().wm_delete_window])?; - dock.set_atom_property(&display.atoms().wm_type, - &[display.atoms().wm_type_dock])?; + dock.set_atom_property(&dock.atoms().wm_type, + &[dock.atoms().wm_type_dock])?; dock.set_strut_properties(&screen)?; @@ -197,5 +206,37 @@ impl Dock { Rectangle { left, top, width, height } } } + + + fn redraw(&self) -> xcb::Result<()> { + println!("redraw"); + + let drawable = Drawable::Window(self.window_id()); + let _context = GraphicContext::new(Arc::clone(self.display()), + drawable); + + /* + let black = self.screen().black_pixel(); + + let cookie = connection.send_request_checked(&PolyFillRectangle { + drawable: Drawable::Window(self.window_id()), + property: *property, + r#type: x::ATOM_CARDINAL, + data: values, + }); + connection.check_request(cookie)?; + */ + + Ok(()) + } +} + +impl HasDisplay for Dock { + fn display(&self) -> &Arc<Display> { self.window.display() } } +impl HasConnection for Dock { + fn connection(&self) -> &Connection { self.window.connection() } +} + + |