Add by-index workspace commands and binds

This commit is contained in:
Ivan Molodetskikh
2023-09-16 12:14:02 +04:00
parent e5d7732880
commit 37ec524264
4 changed files with 95 additions and 0 deletions
+19
View File
@@ -79,6 +79,25 @@ binds {
Mod+Ctrl+U { move-window-to-workspace-down; }
Mod+Ctrl+I { move-window-to-workspace-up; }
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-window-to-workspace 1; }
Mod+Ctrl+2 { move-window-to-workspace 2; }
Mod+Ctrl+3 { move-window-to-workspace 3; }
Mod+Ctrl+4 { move-window-to-workspace 4; }
Mod+Ctrl+5 { move-window-to-workspace 5; }
Mod+Ctrl+6 { move-window-to-workspace 6; }
Mod+Ctrl+7 { move-window-to-workspace 7; }
Mod+Ctrl+8 { move-window-to-workspace 8; }
Mod+Ctrl+9 { move-window-to-workspace 9; }
Mod+Comma { consume-window-into-column; }
Mod+Period { expel-window-from-column; }
+10
View File
@@ -110,8 +110,10 @@ pub enum Action {
ExpelWindowFromColumn,
FocusWorkspaceDown,
FocusWorkspaceUp,
FocusWorkspace(#[knuffel(argument)] u8),
MoveWindowToWorkspaceDown,
MoveWindowToWorkspaceUp,
MoveWindowToWorkspace(#[knuffel(argument)] u8),
FocusMonitorLeft,
FocusMonitorRight,
FocusMonitorDown,
@@ -260,6 +262,7 @@ mod tests {
Mod+Shift+H { focus-monitor-left; }
Mod+Ctrl+Shift+L { move-window-to-monitor-right; }
Mod+Comma { consume-window-into-column; }
Mod+1 { focus-workspace 1;}
}
debug {
@@ -317,6 +320,13 @@ mod tests {
},
actions: vec![Action::ConsumeWindowIntoColumn],
},
Bind {
key: Key {
keysym: KEY_1,
modifiers: Modifiers::COMPOSITOR,
},
actions: vec![Action::FocusWorkspace(1)],
},
]),
debug: DebugConfig {
animation_slowdown: 2.,
+10
View File
@@ -217,6 +217,11 @@ impl State {
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::MoveWindowToWorkspace(idx) => {
self.niri.monitor_set.move_to_workspace(idx);
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::FocusWorkspaceDown => {
self.niri.monitor_set.switch_workspace_down();
// FIXME: granular
@@ -227,6 +232,11 @@ impl State {
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::FocusWorkspace(idx) => {
self.niri.monitor_set.switch_workspace(idx);
// FIXME: granular
self.niri.queue_redraw_all();
}
Action::ConsumeWindowIntoColumn => {
self.niri.monitor_set.consume_into_column();
// FIXME: granular
+56
View File
@@ -723,6 +723,13 @@ impl<W: LayoutElement> MonitorSet<W> {
monitor.move_to_workspace_down();
}
pub fn move_to_workspace(&mut self, idx: u8) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.move_to_workspace(idx);
}
pub fn switch_workspace_up(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
@@ -737,6 +744,13 @@ impl<W: LayoutElement> MonitorSet<W> {
monitor.switch_workspace_down();
}
pub fn switch_workspace(&mut self, idx: u8) {
let Some(monitor) = self.active_monitor() else {
return;
};
monitor.switch_workspace(idx);
}
pub fn consume_into_column(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
@@ -1128,6 +1142,29 @@ impl<W: LayoutElement> Monitor<W> {
self.add_window(new_idx, window, true);
}
pub fn move_to_workspace(&mut self, idx: u8) {
let source_workspace_idx = self.active_workspace_idx;
let new_idx = min(idx.saturating_sub(1) as usize, self.workspaces.len() - 1);
if new_idx == source_workspace_idx {
return;
}
let workspace = &mut self.workspaces[source_workspace_idx];
if workspace.columns.is_empty() {
return;
}
let column = &mut workspace.columns[workspace.active_column_idx];
let window = column.windows[column.active_window_idx].clone();
workspace.remove_window(&window);
self.add_window(new_idx, window, true);
// Don't animate this action.
self.workspace_idx_anim = None;
}
pub fn switch_workspace_up(&mut self) {
self.activate_workspace(self.active_workspace_idx.saturating_sub(1));
}
@@ -1139,6 +1176,15 @@ impl<W: LayoutElement> Monitor<W> {
));
}
pub fn switch_workspace(&mut self, idx: u8) {
self.activate_workspace(min(
idx.saturating_sub(1) as usize,
self.workspaces.len() - 1,
));
// Don't animate this action.
self.workspace_idx_anim = None;
}
pub fn consume_into_column(&mut self) {
self.active_workspace().consume_into_column();
}
@@ -2169,8 +2215,10 @@ mod tests {
ExpelWindowFromColumn,
FocusWorkspaceDown,
FocusWorkspaceUp,
FocusWorkspace(u8),
MoveWindowToWorkspaceDown,
MoveWindowToWorkspaceUp,
MoveWindowToWorkspace(u8),
}
impl Op {
@@ -2236,8 +2284,10 @@ mod tests {
Op::ExpelWindowFromColumn => monitor_set.expel_from_column(),
Op::FocusWorkspaceDown => monitor_set.switch_workspace_down(),
Op::FocusWorkspaceUp => monitor_set.switch_workspace_up(),
Op::FocusWorkspace(idx) => monitor_set.switch_workspace(idx),
Op::MoveWindowToWorkspaceDown => monitor_set.move_to_workspace_down(),
Op::MoveWindowToWorkspaceUp => monitor_set.move_to_workspace_up(),
Op::MoveWindowToWorkspace(idx) => monitor_set.move_to_workspace(idx),
}
}
}
@@ -2280,8 +2330,14 @@ mod tests {
Op::ExpelWindowFromColumn,
Op::FocusWorkspaceDown,
Op::FocusWorkspaceUp,
Op::FocusWorkspace(1),
Op::FocusWorkspace(2),
Op::FocusWorkspace(3),
Op::MoveWindowToWorkspaceDown,
Op::MoveWindowToWorkspaceUp,
Op::MoveWindowToWorkspace(1),
Op::MoveWindowToWorkspace(2),
Op::MoveWindowToWorkspace(3),
];
for third in every_op {