Virtual Screens work ( alt+Right, alt+Left ) pretty well!

This commit is contained in:
noonebtw 2021-01-21 07:14:43 +01:00
parent b011629e45
commit 52833bed5c

View file

@ -377,7 +377,8 @@ impl WMStateMut {
self.clients
.iter()
.filter(|(w, c)| {
!c.borrow().floating && self.virtual_screens.iter().any(|vs| !vs.contains_window(w))
!c.borrow().floating
&& !self.is_client_stacked(w)
})
.map(|(w, c)| (w.clone(), Rc::downgrade(c)))
.collect::<Vec<(u64, Weak<RefCell<Client>>)>>()
@ -472,9 +473,7 @@ impl WMStateMut {
self.virtual_screens[current_vscreen]
.master_stack
.insert(w, c);
self.virtual_screens[current_vscreen]
.aux_stack
.remove(&w)
self.virtual_screens[current_vscreen].aux_stack.remove(&w)
});
}
}
@ -524,6 +523,12 @@ impl WMState {
println!("spawning terminal");
let _ = state.spawn("xterm", &[]);
})
.add_key_handler("Left", Mod1Mask, |state, _| {
state.handle_change_virtual_screen(-1);
})
.add_key_handler("Right", Mod1Mask, |state, _| {
state.handle_change_virtual_screen(1);
})
.add_key_handler("M", Mod1Mask, Self::handle_switch_stack)
.add_key_handler("Q", Mod1Mask, |state, event| unsafe {
if event.key.subwindow != 0 {
@ -888,7 +893,6 @@ impl WMState {
if !state.clients.is_empty() {
info!("[arrange_clients] refreshing screen");
state.refresh_screen();
info!("[arrange_clients] refreshing screen");
let window_w = {
if state.virtual_screens[state.current_vscreen]
@ -1020,6 +1024,53 @@ impl WMState {
}
}
fn handle_change_virtual_screen(&self, direction: i32) {
assert!(direction == 1 || direction == -1);
Some(self.mut_state.borrow_mut()).and_then(|mut state| {
// hide all windows from current virtual screen
state.virtual_screens[state.current_vscreen]
.master_stack
.iter()
.chain(
state.virtual_screens[state.current_vscreen]
.aux_stack
.iter(),
)
.for_each(|(_, c)| {
if let Some(c) = c.upgrade() {
let c = c.borrow();
unsafe {
xlib::XMoveWindow(self.dpy(), c.window, c.size.0 * -2, c.position.1);
}
}
});
// change current_vscreen variable
let mut new_vscreen = state.current_vscreen as isize + direction as isize;
if new_vscreen >= state.virtual_screens.len() as isize {
state.virtual_screens.push(VirtualScreen::new());
} else if new_vscreen < 0 {
new_vscreen = state.virtual_screens.len() as isize - 1;
}
state.current_vscreen = new_vscreen as usize;
Some(())
});
self.arrange_clients();
// focus the focused cliend of the new virtual screen
let client = self.mut_state.borrow().virtual_screens
[self.mut_state.borrow().current_vscreen]
.focused_client
.to_owned();
client.upgrade().and_then(|c| Some(self.focus_client(c)));
}
fn handle_switch_stack(&self, event: &XEvent) {
self.mut_state
.borrow_mut()