srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/crates/config/src/engine/workspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/config/src/engine/workspace.rs')
-rw-r--r--crates/config/src/engine/workspace.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/crates/config/src/engine/workspace.rs b/crates/config/src/engine/workspace.rs
new file mode 100644
index 0000000..a51e108
--- /dev/null
+++ b/crates/config/src/engine/workspace.rs
@@ -0,0 +1,42 @@
+use super::*;
+
+impl Engine {
+ // ---- srd.workspace.* ---------------------------------------------------
+
+ pub(super) fn fn_workspace_cycle(&self, forward: bool) -> Result<mlua::Function<'_>> {
+ let state = self.state.clone();
+ Ok(self.lua.create_function(move |_, ()| {
+ let wm = state.borrow().wm.clone();
+ let mut wm = wm.borrow_mut();
+ let ids: Vec<_> = wm.workspaces().iter().map(|w| w.id).collect();
+ if ids.is_empty() {
+ return Ok(());
+ }
+ let cur = wm.current_workspace();
+ let pos = ids.iter().position(|&id| id == cur).unwrap_or(0);
+ let next = if forward { (pos + 1) % ids.len() } else { (pos + ids.len() - 1) % ids.len() };
+ wm.switch_workspace(ids[next]);
+ Ok(())
+ })?)
+ }
+
+ pub(super) fn fn_workspace_switch(&self) -> Result<mlua::Function<'_>> {
+ let state = self.state.clone();
+ Ok(self.lua.create_function(move |_, id: usize| {
+ state.borrow().wm.borrow_mut().switch_workspace(id);
+ Ok(())
+ })?)
+ }
+
+ pub(super) fn fn_workspace_move_window(&self) -> Result<mlua::Function<'_>> {
+ let state = self.state.clone();
+ Ok(self.lua.create_function(move |_, id: usize| {
+ let wm = state.borrow().wm.clone();
+ let mut wm = wm.borrow_mut();
+ if let Some(focused) = wm.focused_id() {
+ wm.move_window_to_workspace(focused, id);
+ }
+ Ok(())
+ })?)
+ }
+}