From f8a6e84aa9b9229a1b527dcd1c662c1068759dd8 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:41:26 +1100 Subject: toggles: refactor to have config Config is in $XDG_CONFIG_HOME/caelestia/scripts.json Selector is a jq selector using hyprland client data Spawn is a command passed to uwsm app Action is either spawn, move, or both Extra cond is an extra shell command to check whether to do action (for easy disabling just put false or empty action) --- data/config.json | 51 ++++++++++++++++++++++++++++++++++++++++++++++ main.fish | 12 ++++++++++- toggles/communication.fish | 12 ----------- toggles/music.fish | 8 -------- toggles/sysmon.fish | 7 ------- toggles/todo.fish | 7 ------- toggles/util.fish | 31 +++++++++++++++++++++++----- util.fish | 19 +++++++++++++++++ 8 files changed, 107 insertions(+), 40 deletions(-) create mode 100644 data/config.json delete mode 100755 toggles/communication.fish delete mode 100755 toggles/music.fish delete mode 100755 toggles/sysmon.fish delete mode 100755 toggles/todo.fish diff --git a/data/config.json b/data/config.json new file mode 100644 index 0000000..1efe9e4 --- /dev/null +++ b/data/config.json @@ -0,0 +1,51 @@ +{ + "toggles": { + "communication": { + "apps": [ + { + "selector": ".class == \"equibop\"", + "spawn": "equibop", + "action": "spawn move" + }, + { + "selector": ".class == \"whatsapp\"", + "spawn": "firefox --name whatsapp -P whatsapp 'https://web.whatsapp.com'", + "action": "move", + "extraCond": "grep -q 'Name=whatsapp' ~/.mozilla/firefox/profiles.ini" + } + ] + }, + "music": { + "apps": [ + { + "selector": ".class == \"Spotify\" or .initialTitle == \"Spotify\" or .initialTitle == \"Spotify Free\"", + "spawn": "spotify-adblock.desktop", + "action": "spawn move" + }, + { + "selector": ".class == \"feishin\"", + "spawn": "feishin", + "action": "move" + } + ] + }, + "sysmon": { + "apps": [ + { + "selector": ".class == \"btop\" and .title == \"btop\" and .workspace.name == \"special:sysmon\"", + "spawn": "foot -a 'btop' -T 'btop' -- btop", + "action": "spawn" + } + ] + }, + "todo": { + "apps": [ + { + "selector": ".class == \"Todoist\"", + "spawn": "todoist", + "action": "spawn move" + } + ] + } + } +} diff --git a/main.fish b/main.fish index c787258..0780977 100755 --- a/main.fish +++ b/main.fish @@ -20,7 +20,17 @@ end if test "$argv[1]" = toggle set -l valid_toggles communication music sysmon specialws todo - contains -- "$argv[2]" $valid_toggles && $src/toggles/$argv[2].fish || error "Invalid toggle: $argv[2]" + if contains -- "$argv[2]" $valid_toggles + if $argv[2] = specialws + $src/toggles/specialws.fish + else + . $src/toggles/util.fish + toggle-workspace $argv[2] + end + else + error "Invalid toggle: $argv[2]" + end + exit end diff --git a/toggles/communication.fish b/toggles/communication.fish deleted file mode 100755 index 7237d4b..0000000 --- a/toggles/communication.fish +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/fish - -. (dirname (status filename))/util.fish - -spawn-or-move '.class == "equibop"' communication equibop - -# Has whatsapp firefox profile -if grep -q 'Name=whatsapp' ~/.mozilla/firefox/profiles.ini - spawn-or-move '.class == "whatsapp"' communication firefox --name whatsapp -P whatsapp 'https://web.whatsapp.com' -end - -hyprctl dispatch togglespecialworkspace communication diff --git a/toggles/music.fish b/toggles/music.fish deleted file mode 100755 index 95f2c0d..0000000 --- a/toggles/music.fish +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/fish - -. (dirname (status filename))/util.fish - -move-client '.class == "feishin"' music -move-client '.class == "Spotify" or .initialTitle == "Spotify" or .initialTitle == "Spotify Free"' music - -hyprctl dispatch togglespecialworkspace music diff --git a/toggles/sysmon.fish b/toggles/sysmon.fish deleted file mode 100755 index d30e278..0000000 --- a/toggles/sysmon.fish +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/fish - -. (dirname (status filename))/util.fish - -spawn-client '.class == "btop" and .title == "btop" and .workspace.name == "special:sysmon"' foot -a 'btop' -T 'btop' -- btop - -hyprctl dispatch togglespecialworkspace sysmon diff --git a/toggles/todo.fish b/toggles/todo.fish deleted file mode 100755 index db189bb..0000000 --- a/toggles/todo.fish +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/fish - -. (dirname (status filename))/util.fish - -spawn-or-move '.class == "Todoist"' todo todoist - -hyprctl dispatch togglespecialworkspace todo diff --git a/toggles/util.fish b/toggles/util.fish index 4d7df2c..f02dc73 100644 --- a/toggles/util.fish +++ b/toggles/util.fish @@ -1,4 +1,6 @@ -function move-client -a selector -a workspace +. (dirname (status filename))/../util.fish + +function move-client -a selector workspace if hyprctl -j clients | jq -e 'first(.[] | select('$selector')).workspace.name != "special:'$workspace'"' > /dev/null # Window not in correct workspace set -l window_addr (hyprctl -j clients | jq -r 'first(.[] | select('$selector')).address') @@ -6,16 +8,35 @@ function move-client -a selector -a workspace end end -function spawn-client -a selector +function spawn-client -a selector spawn # Spawn if doesn't exist hyprctl -j clients | jq -e "first(.[] | select($selector))" > /dev/null set -l stat $status if test $stat != 0 - uwsm app -- $argv[2..] & disown + eval "uwsm app -- $spawn & disown" end test $stat != 0 # Exit 1 if already exists end -function spawn-or-move -a selector -a workspace - spawn-client $selector $argv[3..] || move-client $selector $workspace +function jq-var -a op json + jq -rn --argjson json "$json" "\$json | $op" +end + +function toggle-workspace -a workspace + set -l apps (get-config "toggles.$workspace.apps") + + for i in (seq 0 (math (jq-var 'length' "$apps") - 1)) + set -l app (jq-var ".[$i]" "$apps") + set -l action (jq-var '.action' "$app") + set -l selector (jq-var '.selector' "$app") + set -l extra_cond (jq-var '.extraCond' "$app") + + test $extra_cond = null && set -l extra_cond true + if eval $extra_cond + string match -qe -- 'spawn' $action && spawn-client $selector (jq-var '.spawn' "$app") + string match -qe -- 'move' $action && move-client $selector $workspace + end + end + + hyprctl dispatch togglespecialworkspace $workspace end diff --git a/util.fish b/util.fish index b706f0d..5718628 100644 --- a/util.fish +++ b/util.fish @@ -22,11 +22,30 @@ function input -a text _out blue INPUT $text $argv[2..] end +function get-config -a key + test -f $C_CONFIG_FILE && set -l value (jq -r ".$key" $C_CONFIG_FILE) + test -n "$value" -a "$value" != null && echo $value || jq -r ".$key" (dirname (status filename))/data/config.json +end + +function set-config -a key value + if test -f $C_CONFIG_FILE + set -l tmp (mktemp) + cp $C_CONFIG_FILE $tmp + jq -e ".$key = $value" $tmp > $C_CONFIG_FILE || cp $tmp $C_CONFIG_FILE + rm $tmp + else + jq -en ".$key = $value" > $C_CONFIG_FILE || rm $C_CONFIG_FILE + end +end + set -q XDG_DATA_HOME && set C_DATA $XDG_DATA_HOME/caelestia || set C_DATA $HOME/.local/share/caelestia set -q XDG_STATE_HOME && set C_STATE $XDG_STATE_HOME/caelestia || set C_STATE $HOME/.local/state/caelestia set -q XDG_CACHE_HOME && set C_CACHE $XDG_CACHE_HOME/caelestia || set C_CACHE $HOME/.cache/caelestia set -q XDG_CONFIG_HOME && set CONFIG $XDG_CONFIG_HOME || set CONFIG $HOME/.config +set C_CONFIG $CONFIG/caelestia +set C_CONFIG_FILE $C_CONFIG/scripts.json mkdir -p $C_DATA mkdir -p $C_STATE mkdir -p $C_CACHE +mkdir -p $C_CONFIG -- cgit v1.2.3-freya