diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-16 12:14:02 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-16 12:14:02 +0400 |
| commit | 37ec5242640b432c57a3f8a97ae3ebcc46b9e3f3 (patch) | |
| tree | f63522e7a4905165c97f96e3564568c6f89ad00f | |
| parent | e5d7732880f2ef5db90173a7c79afee77d362f81 (diff) | |
| download | niri-37ec5242640b432c57a3f8a97ae3ebcc46b9e3f3.tar.gz niri-37ec5242640b432c57a3f8a97ae3ebcc46b9e3f3.tar.bz2 niri-37ec5242640b432c57a3f8a97ae3ebcc46b9e3f3.zip | |
Add by-index workspace commands and binds
| -rw-r--r-- | resources/default-config.kdl | 19 | ||||
| -rw-r--r-- | src/config.rs | 10 | ||||
| -rw-r--r-- | src/input.rs | 10 | ||||
| -rw-r--r-- | src/layout.rs | 56 |
4 files changed, 95 insertions, 0 deletions
diff --git a/resources/default-config.kdl b/resources/default-config.kdl index c6d5e7e2..9fc4712e 100644 --- a/resources/default-config.kdl +++ b/resources/default-config.kdl @@ -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; } diff --git a/src/config.rs b/src/config.rs index cfa1b991..a5030ea4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -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., diff --git a/src/input.rs b/src/input.rs index 72cf9f77..310b4f82 100644 --- a/src/input.rs +++ b/src/input.rs @@ -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 diff --git a/src/layout.rs b/src/layout.rs index 68feb2b8..f4a0e54d 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -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 { |
