diff --git a/src/clients.rs b/src/clients.rs index 6660248..02c45d0 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -142,6 +142,7 @@ pub struct ClientState { pub(self) gap: i32, pub(self) screen_size: (i32, i32), pub(self) master_size: f32, + border_size: i32, } #[derive(Debug, Clone)] @@ -166,6 +167,7 @@ impl Default for ClientState { gap: 0, screen_size: (1, 1), master_size: 1.0, + border_size: 0, } } } @@ -179,6 +181,13 @@ impl ClientState { Self { gap, ..self } } + pub fn with_border(self, border: i32) -> Self { + Self { + border_size: border, + ..self + } + } + pub fn with_screen_size(self, screen_size: (i32, i32)) -> Self { Self { screen_size, @@ -193,6 +202,14 @@ impl ClientState { } } + pub fn get_border(&self) -> i32 { + self.border_size + } + + pub fn set_border_mut(&mut self, new: i32) { + self.border_size = new; + } + pub fn insert(&mut self, mut client: Client) -> Option<&Client> { let key = client.key(); @@ -634,7 +651,11 @@ impl ClientState { // Master for (i, key) in vs.master.iter().enumerate() { - let size = (master_width - gap * 2, master_height - gap * 2); + let size = ( + master_width - gap * 2 - self.border_size * 2, + master_height - gap * 2 - self.border_size * 2, + ); + let position = (gap * 2, master_height * i as i32 + gap * 2); if let Some(client) = self.clients.get_mut(key) { @@ -648,7 +669,11 @@ impl ClientState { // Aux for (i, key) in vs.aux.iter().enumerate() { - let size = (aux_width - gap * 2, aux_height - gap * 2); + let size = ( + aux_width - gap * 2 - self.border_size * 2, + aux_height - gap * 2 - self.border_size * 2, + ); + let position = (master_width + gap * 2, aux_height * i as i32 + gap * 2); diff --git a/src/main.rs b/src/main.rs index bb9b3da..424de3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,6 +64,7 @@ fn log_prologue() { #[test] fn test_logger() { init_logger(); + // asdf log_prologue(); } diff --git a/src/state.rs b/src/state.rs index 1787652..d6f6332 100644 --- a/src/state.rs +++ b/src/state.rs @@ -77,6 +77,7 @@ impl WindowManager { let clients = ClientState::new() .with_virtualscreens(config.num_virtualscreens) .with_gap(config.gap.unwrap_or(1)) + .with_border(1) .with_screen_size(xlib.dimensions()); Self { @@ -549,6 +550,8 @@ impl WindowManager { Client::new_default(window) }; + self.xlib + .configure_client(&client, self.clients.get_border()); self.clients.insert(client).unwrap(); self.arrange_clients(); @@ -585,7 +588,9 @@ impl WindowManager { let event: &XConfigureRequestEvent = event.as_ref(); match self.clients.get(&event.window).into_option() { - Some(client) => self.xlib.configure_client(client), + Some(client) => self + .xlib + .configure_client(client, self.clients.get_border()), None => self.xlib.configure_window(event), } } diff --git a/src/xlib.rs b/src/xlib.rs index 65c3928..d7633fc 100644 --- a/src/xlib.rs +++ b/src/xlib.rs @@ -212,6 +212,16 @@ impl XLib { xlib::CurrentTime, ); + let screen = xlib::XDefaultScreenOfDisplay(self.dpy()).as_ref(); + + if let Some(screen) = screen { + xlib::XSetWindowBorder( + self.dpy(), + client.window, + screen.white_pixel, + ); + } + xlib::XChangeProperty( self.dpy(), self.root, @@ -227,7 +237,7 @@ impl XLib { self.send_event(client, self.atoms.take_focus); } - pub fn unfocus_client(&self, _client: &Client) { + pub fn unfocus_client(&self, client: &Client) { //info!("unfocusing client: {:?}", client); unsafe { @@ -238,6 +248,16 @@ impl XLib { xlib::CurrentTime, ); + let screen = xlib::XDefaultScreenOfDisplay(self.dpy()).as_ref(); + + if let Some(screen) = screen { + xlib::XSetWindowBorder( + self.dpy(), + client.window, + screen.black_pixel, + ); + } + // xlib::XDeleteProperty( // self.dpy(), // self.root, @@ -404,7 +424,7 @@ impl XLib { } } - pub fn configure_client(&self, client: &Client) { + pub fn configure_client(&self, client: &Client, border: i32) { let mut event = xlib::XConfigureEvent { type_: xlib::ConfigureNotify, display: self.dpy(), @@ -414,7 +434,7 @@ impl XLib { y: client.position.1, width: client.size.0, height: client.size.1, - border_width: 0, + border_width: border, override_redirect: 0, send_event: 0, serial: 0, @@ -422,6 +442,12 @@ impl XLib { }; unsafe { + xlib::XSetWindowBorderWidth( + self.dpy(), + event.window, + event.border_width as u32, + ); + xlib::XSendEvent( self.dpy(), event.window, diff --git a/xinitrc b/xinitrc index d002ad4..6ddc8da 100644 --- a/xinitrc +++ b/xinitrc @@ -3,5 +3,6 @@ /usr/bin/xset b off /usr/bin/xsetroot -solid darkslategrey /usr/bin/feh --bg-fill "/mnt/storage/rust/wm/starship.jpg" +xset r rate 250 30 export RUST_BACKTRACE=1 exec /mnt/storage/rust/wm/target/release/wm >& /home/user/.local/portlights.log