summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/config.json51
-rwxr-xr-xmain.fish12
-rwxr-xr-xtoggles/communication.fish12
-rwxr-xr-xtoggles/music.fish8
-rwxr-xr-xtoggles/sysmon.fish7
-rwxr-xr-xtoggles/todo.fish7
-rw-r--r--toggles/util.fish31
-rw-r--r--util.fish19
8 files changed, 107 insertions, 40 deletions
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