summary refs log tree commit diff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs57
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() }
+}
+
+