aboutsummaryrefslogtreecommitdiff
path: root/src/utils/id.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/utils/id.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/utils/id.rs')
-rw-r--r--src/utils/id.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/utils/id.rs b/src/utils/id.rs
new file mode 100644
index 00000000..3f8a2a7d
--- /dev/null
+++ b/src/utils/id.rs
@@ -0,0 +1,27 @@
+use std::sync::atomic::{AtomicU32, Ordering};
+
+/// Counter that returns unique IDs.
+///
+/// Under the hood it uses a `u32` that will eventually wrap around. When incrementing it once a
+/// second, it will wrap around after about 136 years.
+pub struct IdCounter {
+ value: AtomicU32,
+}
+
+impl IdCounter {
+ pub const fn new() -> Self {
+ Self {
+ value: AtomicU32::new(0),
+ }
+ }
+
+ pub fn next(&self) -> u32 {
+ self.value.fetch_add(1, Ordering::SeqCst)
+ }
+}
+
+impl Default for IdCounter {
+ fn default() -> Self {
+ Self::new()
+ }
+}