aboutsummaryrefslogtreecommitdiff
path: root/src/layout/mod.rs
diff options
context:
space:
mode:
authorFluxTape <fluxtape.contact@gmail.com>2024-03-19 14:27:52 +0000
committerGitHub <noreply@github.com>2024-03-19 07:27:52 -0700
commit23ac3d73232f307186212293713d6801d37cff2a (patch)
tree68d4e721a3c3e88cae2157a27cd28944d1eb3ea4 /src/layout/mod.rs
parentc3327d36da25f37e86eb8f89bd74f2a4bc1ea744 (diff)
downloadniri-23ac3d73232f307186212293713d6801d37cff2a.tar.gz
niri-23ac3d73232f307186212293713d6801d37cff2a.tar.bz2
niri-23ac3d73232f307186212293713d6801d37cff2a.zip
Workspace back and forth (#253)
* implement workspace back and forth * Make our own ID counter instead of SerialCounter, use a newtype * Rename FocusWorkspaceBackAndForth to FocusWorkspacePrevious * Add focus-workspace-previous to tests * Don't special case in switch_workspace_previous * Minor clean up * Add switch_workspace_auto_back_and_forth to tests * Skip animation on switch_workspace_previous * Preserve previous_workspace_id on workspace movement * Make Workspace::id private with a getter Reduce the chance it gets overwritten. * Add test for workspace ID uniqueness * Update previous workspace ID upon moving workspace across monitors --------- Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/layout/mod.rs')
-rw-r--r--src/layout/mod.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 7e3b9f59..55c1e45d 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -1165,6 +1165,20 @@ impl<W: LayoutElement> Layout<W> {
monitor.switch_workspace(idx);
}
+ pub fn switch_workspace_auto_back_and_forth(&mut self, idx: usize) {
+ let Some(monitor) = self.active_monitor() else {
+ return;
+ };
+ monitor.switch_workspace_auto_back_and_forth(idx);
+ }
+
+ pub fn switch_workspace_previous(&mut self) {
+ let Some(monitor) = self.active_monitor() else {
+ return;
+ };
+ monitor.switch_workspace_previous();
+ }
+
pub fn consume_into_column(&mut self) {
let Some(monitor) = self.active_monitor() else {
return;
@@ -1221,8 +1235,12 @@ impl<W: LayoutElement> Layout<W> {
#[cfg(test)]
fn verify_invariants(&self) {
+ use std::collections::HashSet;
+
use crate::layout::monitor::WorkspaceSwitch;
+ let mut seen_workspace_id = HashSet::new();
+
let (monitors, &primary_idx, &active_monitor_idx) = match &self.monitor_set {
MonitorSet::Normal {
monitors,
@@ -1241,6 +1259,11 @@ impl<W: LayoutElement> Layout<W> {
"workspace options must be synchronized with layout"
);
+ assert!(
+ seen_workspace_id.insert(workspace.id()),
+ "workspace id must be unique"
+ );
+
workspace.verify_invariants();
}
@@ -1325,6 +1348,11 @@ impl<W: LayoutElement> Layout<W> {
"workspace options must be synchronized with layout"
);
+ assert!(
+ seen_workspace_id.insert(workspace.id()),
+ "workspace id must be unique"
+ );
+
workspace.verify_invariants();
}
}
@@ -1529,6 +1557,8 @@ impl<W: LayoutElement> Layout<W> {
.unwrap();
let target = &mut monitors[target_idx];
+ target.previous_workspace_id = Some(target.workspaces[target.active_workspace_idx].id());
+
// Insert the workspace after the currently active one. Unless the currently active one is
// the last empty workspace, then insert before.
let target_ws_idx = min(target.active_workspace_idx + 1, target.workspaces.len() - 1);
@@ -2017,6 +2047,8 @@ mod tests {
FocusWorkspaceDown,
FocusWorkspaceUp,
FocusWorkspace(#[proptest(strategy = "0..=4usize")] usize),
+ FocusWorkspaceAutoBackAndForth(#[proptest(strategy = "0..=4usize")] usize),
+ FocusWorkspacePrevious,
MoveWindowToWorkspaceDown,
MoveWindowToWorkspaceUp,
MoveWindowToWorkspace(#[proptest(strategy = "0..=4usize")] usize),
@@ -2219,6 +2251,10 @@ mod tests {
Op::FocusWorkspaceDown => layout.switch_workspace_down(),
Op::FocusWorkspaceUp => layout.switch_workspace_up(),
Op::FocusWorkspace(idx) => layout.switch_workspace(idx),
+ Op::FocusWorkspaceAutoBackAndForth(idx) => {
+ layout.switch_workspace_auto_back_and_forth(idx)
+ }
+ Op::FocusWorkspacePrevious => layout.switch_workspace_previous(),
Op::MoveWindowToWorkspaceDown => layout.move_to_workspace_down(),
Op::MoveWindowToWorkspaceUp => layout.move_to_workspace_up(),
Op::MoveWindowToWorkspace(idx) => layout.move_to_workspace(idx),