|
@@ -1,77 +1,81 @@
|
|
-use std::collections::HashMap;
|
|
|
|
use std::collections::HashSet;
|
|
use std::collections::HashSet;
|
|
|
|
|
|
|
|
+use clap::Parser;
|
|
|
|
+
|
|
mod sway;
|
|
mod sway;
|
|
mod act;
|
|
mod act;
|
|
|
|
|
|
-fn main() {
|
|
|
|
- let mut cmd = std::env::args().skip(1);
|
|
|
|
-
|
|
|
|
- let verb = cmd.next();
|
|
|
|
- let noun = cmd.next();
|
|
|
|
-
|
|
|
|
- let si = sway::SwayInterface::new();
|
|
|
|
-
|
|
|
|
- let act = act::Activity::current(&si);
|
|
|
|
-
|
|
|
|
- let mut cmds : HashMap<&'static str, Box<dyn Fn(Option<String>) -> ()>> = HashMap::new();
|
|
|
|
-
|
|
|
|
- cmds.insert("ws_left", Box::new(|_| {
|
|
|
|
- act.shift_ws(-1)
|
|
|
|
- }));
|
|
|
|
-
|
|
|
|
- cmds.insert("ws_right", Box::new(|_| {
|
|
|
|
- act.shift_ws(1)
|
|
|
|
- }));
|
|
|
|
-
|
|
|
|
- cmds.insert("ws_set", Box::new(|index| {
|
|
|
|
- let ind : Option<i32> = index.unwrap().parse().ok();
|
|
|
|
- if ind.is_some() {
|
|
|
|
- act.set_ws(ind.unwrap())
|
|
|
|
- }
|
|
|
|
- }));
|
|
|
|
|
|
+#[derive(clap::Parser)]
|
|
|
|
+struct Swaynav {
|
|
|
|
+ #[arg(env = "SWAYSOCK")]
|
|
|
|
+ swaysock: String,
|
|
|
|
|
|
- cmds.insert("move_to_ws", Box::new(|index| {
|
|
|
|
- let ind : Option<i32> = index.unwrap().parse().ok();
|
|
|
|
- if ind.is_some() {
|
|
|
|
- act.move_to_ws(ind.unwrap())
|
|
|
|
- }
|
|
|
|
- }));
|
|
|
|
-
|
|
|
|
- cmds.insert("act_list", Box::new(|_| {
|
|
|
|
- let uniques : HashSet<Option<String>> = si.get_workspaces().unwrap().iter().map(|ws| act::ActivityWorkspace::from_string(&ws.name).group).collect();
|
|
|
|
- for u in uniques {
|
|
|
|
- println!("{}", if u.is_some() { u.unwrap() } else { "default".to_string() });
|
|
|
|
- }
|
|
|
|
- }));
|
|
|
|
-
|
|
|
|
- cmds.insert("act_change", Box::new(|to| {
|
|
|
|
- let nact = act::Activity::by_name(&si, &to.unwrap());
|
|
|
|
- nact.shift_ws(0);
|
|
|
|
- }));
|
|
|
|
-
|
|
|
|
- cmds.insert("act_restore", Box::new(|_| {
|
|
|
|
- let mut store = act::SwayKeyStore::load();
|
|
|
|
- let lact = store.last_act.as_deref().unwrap_or_else(|| "default");
|
|
|
|
|
|
+ #[command(subcommand)]
|
|
|
|
+ cmd: SwaynavCommands
|
|
|
|
+}
|
|
|
|
|
|
- let nact = act::Activity::by_name(&si, lact);
|
|
|
|
- nact.shift_ws(0);
|
|
|
|
|
|
+#[derive(clap::Subcommand)]
|
|
|
|
+enum SwaynavCommands {
|
|
|
|
+ /// Move one workspace left
|
|
|
|
+ WsLeft,
|
|
|
|
+ /// Move one workspace right
|
|
|
|
+ WsRight,
|
|
|
|
+ /// Set active workspace
|
|
|
|
+ WsSet { new_ws: usize },
|
|
|
|
+ /// Move active container to workspace
|
|
|
|
+ MoveToWs { ws: usize },
|
|
|
|
+ /// List current activities
|
|
|
|
+ ActList,
|
|
|
|
+ /// Change active activity
|
|
|
|
+ ActChange { new_act: String },
|
|
|
|
+ /// Restore to last active activity
|
|
|
|
+ ActRestore,
|
|
|
|
+}
|
|
|
|
|
|
- store.last_act = act.group();
|
|
|
|
- store.save();
|
|
|
|
- }));
|
|
|
|
|
|
+fn main() {
|
|
|
|
+ let args = Swaynav::parse();
|
|
|
|
|
|
- if verb == None {
|
|
|
|
- println!("Need a verb!");
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
|
|
+ let si = sway::SwayInterface::new(&args.swaysock);
|
|
|
|
|
|
- let cmd = cmds.get(verb.as_ref().unwrap().as_str());
|
|
|
|
|
|
+ let act = act::Activity::current(&si);
|
|
|
|
|
|
- if cmd.is_none() {
|
|
|
|
- println!("Unknown verb {}", verb.unwrap());
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- (cmd.unwrap())(noun)
|
|
|
|
|
|
+ match args.cmd {
|
|
|
|
+ SwaynavCommands::WsLeft => {
|
|
|
|
+ act.shift_ws(-1)
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::WsRight => {
|
|
|
|
+ act.shift_ws(1)
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::WsSet { new_ws } => {
|
|
|
|
+ act.set_ws(new_ws)
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::MoveToWs { ws } => {
|
|
|
|
+ act.move_to_ws(ws)
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::ActList => {
|
|
|
|
+ let uniques : HashSet<Option<String>> = si.get_workspaces().unwrap_or(vec![]).iter().map(|ws| act::ActivityWorkspace::from_string(&ws.name).group).collect();
|
|
|
|
+ for u in uniques {
|
|
|
|
+ println!("{}", if u.is_some() { u.unwrap() } else { "default".to_string() });
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::ActChange { new_act } => {
|
|
|
|
+ let mut store = act::SwayKeyStore::load();
|
|
|
|
+
|
|
|
|
+ let nact = act::Activity::by_name(&si, &new_act);
|
|
|
|
+ nact.shift_ws(0);
|
|
|
|
+
|
|
|
|
+ store.last_act = act.group();
|
|
|
|
+ store.save();
|
|
|
|
+ },
|
|
|
|
+ SwaynavCommands::ActRestore => {
|
|
|
|
+ let mut store = act::SwayKeyStore::load();
|
|
|
|
+ let lact = store.last_act.as_deref().unwrap_or_else(|| "default");
|
|
|
|
+
|
|
|
|
+ let nact = act::Activity::by_name(&si, lact);
|
|
|
|
+ nact.shift_ws(0);
|
|
|
|
+
|
|
|
|
+ store.last_act = act.group();
|
|
|
|
+ store.save();
|
|
|
|
+ },
|
|
}
|
|
}
|
|
}
|
|
}
|