From cff04fa244c20fbdc2fe206f62c634f3e844b623 Mon Sep 17 00:00:00 2001 From: Michele De Pascalis Date: Sat, 29 Jun 2024 23:15:01 +0300 Subject: [PATCH] Added special workspace names to swap command --- src/main.rs | 3 +++ src/util.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/main.rs b/src/main.rs index ae2187b..7750083 100644 --- a/src/main.rs +++ b/src/main.rs @@ -284,6 +284,9 @@ fn cmd_swap(connection: &mut Connection, ws_l: String, ws_r: String) -> Result<( .find(|ws| ws.name == ws_r) .cloned(); + let ws_l = get_workspace_special(ws_l, connection)?; + let ws_r = get_workspace_special(ws_r, connection)?; + rename_workspace(connection, &ws_l, tmp)?; rename_workspace(connection, &ws_r, &ws_l)?; rename_workspace(connection, tmp, &ws_r)?; diff --git a/src/util.rs b/src/util.rs index 374ac21..134cd96 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,3 +1,4 @@ +use env_logger::filter; use snafu::prelude::*; use swayipc::Connection; use swayipc::Workspace; @@ -70,6 +71,62 @@ pub fn print_workspaces(connection: &mut Connection) -> Result<(), SwayWsError> Ok(()) } +pub fn get_workspace_current(connection: &mut Connection) -> Result { + let workspaces: Vec = connection.get_workspaces().context(SwayIpcCtx)?; + Ok(workspaces + .into_iter() + .find(|w| w.focused) + .expect("No focused workspace??")) +} + +pub fn get_workspace_prev(connection: &mut Connection) -> Result { + let current_out = get_workspace_current(connection)?.output; + let out_workspaces: Vec = connection + .get_workspaces() + .context(SwayIpcCtx)? + .into_iter() + .filter(|w| w.output == current_out) + .collect(); + let mut out_ws_prev = out_workspaces.clone(); + let last = out_ws_prev.pop().expect("No workspace in output??"); + out_ws_prev.insert(0, last); + let mut zipped = out_workspaces.iter().zip(out_ws_prev); + Ok(zipped + .find(|(w, _)| w.focused) + .expect("No focused workspace??") + .1) +} + +pub fn get_workspace_next(connection: &mut Connection) -> Result { + let current_out = get_workspace_current(connection)?.output; + let out_workspaces: Vec = connection + .get_workspaces() + .context(SwayIpcCtx)? + .into_iter() + .filter(|w| w.output == current_out) + .collect(); + let mut out_ws_next = out_workspaces.clone(); + let first = out_ws_next.remove(0); + out_ws_next.push(first); + let mut zipped = out_workspaces.iter().zip(out_ws_next); + Ok(zipped + .find(|(w, _)| w.focused) + .expect("No focused workspace??") + .1) +} + +pub fn get_workspace_special( + name: String, + connection: &mut Connection, +) -> Result { + match name.as_str() { + "current" => Ok(get_workspace_current(connection)?.name), + "prev" => Ok(get_workspace_prev(connection)?.name), + "next" => Ok(get_workspace_next(connection)?.name), + _ => Ok(name), + } +} + pub fn get_second_output( connection: &mut Connection, output_names: &[String],