From e536bb6f3718741153e63f1e49f0c4df114267fd Mon Sep 17 00:00:00 2001 From: NoOneBtw Date: Fri, 7 May 2021 08:49:53 +0200 Subject: [PATCH] removed unused client tests and added keybinds to change stack widths --- src/clients.rs | 130 +++++++++++++++++------------------------------ src/state.rs | 134 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 161 insertions(+), 103 deletions(-) diff --git a/src/clients.rs b/src/clients.rs index 25493a7..240c64f 100644 --- a/src/clients.rs +++ b/src/clients.rs @@ -117,66 +117,7 @@ mod client { pub use client::*; -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn client_lists_test() { - let mut clients = ClientState::with_virtualscreens(3); - - clients.insert(Client { - window: 1, - size: (1, 1), - position: (1, 1), - transient_for: None, - }); - - clients.insert(Client { - window: 2, - size: (1, 1), - position: (1, 1), - transient_for: None, - }); - - clients.arrange_virtual_screen(600, 400, None); - - println!("{:#?}", clients); - - clients - .iter_current_screen() - .for_each(|c| println!("{:?}", c)); - - clients.remove(&1u64); - - clients.arrange_virtual_screen(600, 400, None); - - println!("{:#?}", clients); - - clients.rotate_right(); - - clients.insert(Client { - window: 3, - size: (1, 1), - position: (1, 1), - transient_for: None, - }); - - clients.arrange_virtual_screen(600, 400, None); - - println!("{:#?}", clients); - - clients.toggle_floating(&2u64); - - clients.rotate_left(); - - clients.arrange_virtual_screen(600, 400, None); - - println!("{:#?}", clients); - } -} - -use std::{collections::VecDeque, iter::repeat}; +use std::collections::VecDeque; type Clients = IndexMap; type ClientRef = u64; @@ -200,8 +141,9 @@ pub struct ClientState { focused: Option, pub(self) virtual_screens: VecDeque, - gap: i32, - screen_size: (i32, i32), + pub(self) gap: i32, + pub(self) screen_size: (i32, i32), + pub(self) master_size: f32, } #[derive(Debug, Clone)] @@ -222,6 +164,7 @@ impl Default for ClientState { virtual_screens: vss, gap: 0, screen_size: (1, 1), + master_size: 1.0, } } } @@ -666,7 +609,22 @@ impl ClientState { // should be fine to unwrap since we will always have at least 1 virtual screen if let Some(vs) = self.virtual_screens.front_mut() { // if aux is empty -> width : width / 2 - let width = (width - gap * 2) / (1 + i32::from(!vs.aux.is_empty())); + + let (master_width, aux_width) = { + let effective_width = width - gap * 2; + + let master_size = if vs.aux.is_empty() { + 1.0 + } else { + self.master_size / 2.0 + }; + + let master_width = + (effective_width as f32 * master_size) as i32; + let aux_width = effective_width - master_width; + + (master_width, aux_width) + }; // make sure we dont devide by 0 // height is max height / number of clients in the stack @@ -683,24 +641,25 @@ impl ClientState { None => 1, }; - // chaining master and aux together with `Zip`s for height and x - // reduces duplicate code - for ((i, key), (height, x)) in vs - .master - .iter() - .enumerate() - // add repeating height for each window and x pos for each window - .zip(repeat(master_height).zip(repeat(0i32))) - .chain( - // same things for aux stack - vs.aux - .iter() - .enumerate() - .zip(repeat(aux_height).zip(repeat(width))), - ) - { - let size = (width - gap * 2, height - gap * 2); - let position = (x + gap * 2, height * i as i32 + gap * 2); + // Master + for (i, key) in vs.master.iter().enumerate() { + let size = (master_width - gap * 2, master_height - gap * 2); + let position = (gap * 2, master_height * i as i32 + gap * 2); + + if let Some(client) = self.clients.get_mut(key) { + *client = Client { + size, + position, + ..*client + }; + } + } + + // Aux + for (i, key) in vs.aux.iter().enumerate() { + let size = (aux_width - gap * 2, aux_height - gap * 2); + let position = + (master_width + gap * 2, aux_height * i as i32 + gap * 2); if let Some(client) = self.clients.get_mut(key) { *client = Client { @@ -712,10 +671,15 @@ impl ClientState { } } - //info!("{:#?}", self); + // Should have xlib send those changes back to the x server after this function } - // Should have xlib send those changes back to the x server after this function + pub fn change_master_size(&mut self, delta: f32) { + let tmp = self.master_size + delta; + self.master_size = f32::min(1.8, f32::max(0.2, tmp)); + + self.arrange_virtual_screen(); + } } impl Default for VirtualScreen { diff --git a/src/state.rs b/src/state.rs index 7a24a81..1787652 100644 --- a/src/state.rs +++ b/src/state.rs @@ -156,21 +156,6 @@ impl WindowManager { |wm, _| wm.spawn("alacritty", &[]), )); - self.add_keybind(KeyBinding::new( - self.xlib.make_key("Left", self.config.mod_key), - |wm, _| wm.rotate_virtual_screen(Direction::west()), - )); - - self.add_keybind(KeyBinding::new( - self.xlib.make_key("Right", self.config.mod_key), - |wm, _| wm.rotate_virtual_screen(Direction::east()), - )); - - self.add_keybind(KeyBinding::new( - self.xlib.make_key("Tab", self.config.mod_key), - |wm, _| wm.rotate_virtual_screen_back(), - )); - self.add_keybind(KeyBinding::new( self.xlib.make_key("J", self.config.mod_key), |wm, _| wm.move_focus(Direction::south()), @@ -191,16 +176,26 @@ impl WindowManager { |wm, _| wm.move_focus(Direction::east()), )); - self.add_keybind(KeyBinding::new( - self.xlib.make_key("J", self.config.mod_key | ShiftMask), - |wm, _| wm.rotate_virtual_screen(Direction::west()), - )); + // resize master stack self.add_keybind(KeyBinding::new( self.xlib.make_key("K", self.config.mod_key | ShiftMask), - |wm, _| wm.rotate_virtual_screen(Direction::east()), + |wm, _| { + wm.clients.change_master_size(0.1); + wm.arrange_clients(); + }, )); + self.add_keybind(KeyBinding::new( + self.xlib.make_key("J", self.config.mod_key | ShiftMask), + |wm, _| { + wm.clients.change_master_size(-0.1); + wm.arrange_clients(); + }, + )); + + self.add_vs_switch_keybinds(); + self.xlib.init(); self @@ -211,6 +206,105 @@ impl WindowManager { self.keybinds.push(keybind); } + fn add_vs_switch_keybinds(&mut self) { + fn rotate_west(wm: &mut WindowManager, _: &XKeyEvent) { + wm.rotate_virtual_screen(Direction::West(N)); + } + + fn rotate_east(wm: &mut WindowManager, _: &XKeyEvent) { + wm.rotate_virtual_screen(Direction::East(N)); + } + + // Old keybinds + + self.add_keybind(KeyBinding::new( + self.xlib.make_key("Left", self.config.mod_key), + rotate_west::<1>, + )); + + self.add_keybind(KeyBinding::new( + self.xlib.make_key("H", self.config.mod_key | ShiftMask), + rotate_west::<1>, + )); + + self.add_keybind(KeyBinding::new( + self.xlib.make_key("Right", self.config.mod_key), + rotate_east::<1>, + )); + + self.add_keybind(KeyBinding::new( + self.xlib.make_key("L", self.config.mod_key | ShiftMask), + rotate_east::<1>, + )); + + self.add_keybind(KeyBinding::new( + self.xlib.make_key("Tab", self.config.mod_key), + |wm, _| wm.rotate_virtual_screen_back(), + )); + + // Mod + (Shift) + Num + + // Press Mod + `1` to move `1` virtual screen to the right + self.add_keybind(KeyBinding::new( + self.xlib.make_key("1", self.config.mod_key), + rotate_east::<1>, + )); + + // Press Mod + Shift + `1` to move `1` virtual screen to the left + self.add_keybind(KeyBinding::new( + self.xlib.make_key("1", self.config.mod_key | ShiftMask), + rotate_west::<1>, + )); + + // Press Mod + `2` to move `2` virtual screen to the right + self.add_keybind(KeyBinding::new( + self.xlib.make_key("2", self.config.mod_key), + rotate_east::<2>, + )); + + // Press Mod + Shift + `2` to move `2` virtual screen to the left + self.add_keybind(KeyBinding::new( + self.xlib.make_key("2", self.config.mod_key | ShiftMask), + rotate_west::<2>, + )); + + // Press Mod + `3` to move `3` virtual screen to the right + self.add_keybind(KeyBinding::new( + self.xlib.make_key("3", self.config.mod_key), + rotate_east::<3>, + )); + + // Press Mod + Shift + `3` to move `3` virtual screen to the left + self.add_keybind(KeyBinding::new( + self.xlib.make_key("3", self.config.mod_key | ShiftMask), + rotate_west::<3>, + )); + + // Press Mod + `4` to move `4` virtual screen to the right + self.add_keybind(KeyBinding::new( + self.xlib.make_key("4", self.config.mod_key), + rotate_east::<4>, + )); + + // Press Mod + Shift + `4` to move `4` virtual screen to the left + self.add_keybind(KeyBinding::new( + self.xlib.make_key("4", self.config.mod_key | ShiftMask), + rotate_west::<4>, + )); + + // Press Mod + `5` to move `5` virtual screen to the right + self.add_keybind(KeyBinding::new( + self.xlib.make_key("5", self.config.mod_key), + rotate_east::<5>, + )); + + // Press Mod + Shift + `5` to move `5` virtual screen to the left + self.add_keybind(KeyBinding::new( + self.xlib.make_key("5", self.config.mod_key | ShiftMask), + rotate_west::<5>, + )); + } + pub fn run(mut self) -> ! { loop { let event = self.xlib.next_event();