diff --git a/mango/decoration.conf b/mango/decoration.conf index 7c8b0a3..a15b37e 100644 --- a/mango/decoration.conf +++ b/mango/decoration.conf @@ -4,6 +4,8 @@ animations=1 layer_animations=1 animation_type_open=zoom animation_type_close=zoom +#layer_animation_type_open=slide +#layer_animation_type_close=slide animation_fade_in=1 animation_fade_out=1 tag_animation_direction=1 diff --git a/mango/windowrules.conf b/mango/windowrules.conf index 999cc15..068bead 100644 --- a/mango/windowrules.conf +++ b/mango/windowrules.conf @@ -5,4 +5,7 @@ windowrule=appid:firefox,focused_opacity:0.95,unfocused_opacity:0.85 windowrule=appid:virt-manager,focused_opacity:1,unfocused_opacity:1 # fix some issues with warframe not capturing mouse. -windowrule=appid:broken,focused_opacity:1,unfocused_opacity:1,isfullscreen:1,monitor:HDMI-A-1 \ No newline at end of file +windowrule=appid:broken,focused_opacity:1,unfocused_opacity:1,isfullscreen:1,monitor:HDMI-A-1 + +layerrule=layer_name:^dms.*,animation_type_open:fade,animation_type_close:fade +layerrule=layer_name:^waybar.*,animation_type_open:slide,animation_type_close:fade \ No newline at end of file diff --git a/matugen/config.toml b/matugen/config.toml index aff7eb8..6e3138c 100755 --- a/matugen/config.toml +++ b/matugen/config.toml @@ -85,4 +85,9 @@ output_path = '~/.config/caffyne-shell/style/colors.css' [templates.wayshell] input_path = '~/.config/matugen/templates/InioX/colors.css' -output_path = '~/.config/sdgos/wayshell/colors.css' \ No newline at end of file +output_path = '~/.config/sdgos/wayshell/colors.css' + + +[templates.wayshellbars] +input_path = '~/.config/matugen/templates/InioX/colors.css' +output_path = '~/.config/sdgos/wayshell/configs/colors.css' \ No newline at end of file diff --git a/sdgos/monocle/config-dp1 b/sdgos/monocle/config-dp1 new file mode 100644 index 0000000..a1590e8 --- /dev/null +++ b/sdgos/monocle/config-dp1 @@ -0,0 +1,35 @@ +{ + "layer": "top", + "position": "bottom", + "fixed-center": "true", + "output": "DP-1", + "margin-top": 0, + "margin-bottom": 0, + "margin-left": 0, + "margin-right": 0, + "spacing": 3, + + // Load Modules + "include": [ + "~/.config/sdgos/monocle/modules-dp1.json" + ], + "modules-left": [ + "custom/daemon", + "custom/window1", + "custom/window2", + "custom/window3", + "custom/window4", + "custom/window5", + "custom/window6", + "custom/window7", + "custom/window8", + "custom/window9", + "custom/window10", + + + ], + "modules-center": [ + ], + "modules-right": [ + ] +} \ No newline at end of file diff --git a/sdgos/monocle/config-dp3 b/sdgos/monocle/config-dp3 new file mode 100644 index 0000000..503f8ad --- /dev/null +++ b/sdgos/monocle/config-dp3 @@ -0,0 +1,35 @@ +{ + "layer": "top", + "position": "bottom", + "fixed-center": "true", + "output": "DP-3", + "margin-top": 0, + "margin-bottom": 0, + "margin-left": 0, + "margin-right": 0, + "spacing": 3, + + // Load Modules + "include": [ + "~/.config/sdgos/monocle/modules-dp3.json" + ], + "modules-left": [ + "custom/daemon", + "custom/window1", + "custom/window2", + "custom/window3", + "custom/window4", + "custom/window5", + "custom/window6", + "custom/window7", + "custom/window8", + "custom/window9", + "custom/window10", + + + ], + "modules-center": [ + ], + "modules-right": [ + ] +} \ No newline at end of file diff --git a/sdgos/monocle/config b/sdgos/monocle/config-hdmi similarity index 92% rename from sdgos/monocle/config rename to sdgos/monocle/config-hdmi index a2698e0..b82609a 100644 --- a/sdgos/monocle/config +++ b/sdgos/monocle/config-hdmi @@ -11,7 +11,7 @@ // Load Modules "include": [ - "~/.config/sdgos/monocle/modules.json" + "~/.config/sdgos/monocle/modules-hdmi.json" ], "modules-left": [ "custom/daemon", diff --git a/sdgos/monocle/fetchwindow.sh b/sdgos/monocle/fetchwindow.sh index 19e421b..2093d7d 100755 --- a/sdgos/monocle/fetchwindow.sh +++ b/sdgos/monocle/fetchwindow.sh @@ -2,12 +2,13 @@ INDEX="$1" +MONITOR=$2 -while [ -e ~/.config/monocle.lock ]; do +while [ -e ~/.config/monocle-$MONITOR.lock ]; do sleep 0.01 done -WINDOWTITLE=$(cat ~/.config/monocle.state | grep -e "index:$INDEX" | cut -d'\' -f2) +WINDOWTITLE=$(cat ~/.config/monocle-$MONITOR.state | grep -e "index:$INDEX" | cut -d'\' -f2) diff --git a/sdgos/monocle/focuswindow.sh b/sdgos/monocle/focuswindow.sh index 92d4c5a..32e22af 100755 --- a/sdgos/monocle/focuswindow.sh +++ b/sdgos/monocle/focuswindow.sh @@ -1,21 +1,22 @@ #!/bin/bash +ACTIVEMON=$2 INDEX="$1" -while [ -e ~/.config/monocle.lock ]; do +while [ -e ~/.config/monocle-$ACTIVEMON.lock ]; do sleep 0.01 echo "sleeping" done -ACTIVEMON=$(mmsg get all-monitors | jq '.monitors[] | select(.active == true) | .name' -r) + echo "activemon is $ACTIVEMON" ACTIVETAG=$(mmsg get tags $ACTIVEMON | jq '.tags[] | select(.is_active == true) | .index' -r) echo "activetag is $ACTIVETAG" -WINDOWID=$(cat ~/.config/monocle.state | grep -e "index:$INDEX" | cut -d'\' -f3) -WINDOWtitle=$(cat ~/.config/monocle.state | grep -e "index:$INDEX" | cut -d'\' -f2) +WINDOWID=$(cat ~/.config/monocle-$ACTIVEMON.state | grep -e "index:$INDEX" | cut -d'\' -f3) +WINDOWtitle=$(cat ~/.config/monocle-$ACTIVEMON.state | grep -e "index:$INDEX" | cut -d'\' -f2) echo "moving window $WINDOWID" -mmsg dispatch zoom client,$WINDOWID +mmsg dispatch focusid client,$WINDOWID diff --git a/sdgos/monocle/indexer.sh b/sdgos/monocle/indexer.sh index dcba162..5151f84 100755 --- a/sdgos/monocle/indexer.sh +++ b/sdgos/monocle/indexer.sh @@ -1,6 +1,6 @@ #!/bin/bash -MONITOR=HDMI-A-1 +MONITOR=$1 # get all clients on that monitor: mmsg get all-clients | jq '.clients[] | select( .monitor == "HDMI-A-1") | .id' -r @@ -10,26 +10,26 @@ ACTIVEMON=$(mmsg get all-monitors | jq '.monitors[] | select(.active == true) | #echo "activemon is $ACTIVEMON" ACTIVETAG=$(mmsg get tags $MONITOR | jq '.tags[] | select(.is_active == true) | .index' -r) #echo "activetag is $ACTIVETAG" -ACTIVEWINDOWS=$(mmsg get all-clients | jq -r --arg ACTIVETAG "$ACTIVETAG" --arg ACTIVEMON "$MONOCLEMON" '.clients[] | select(.tags[] == ($ACTIVETAG | tonumber) and .monitor == $ACTIVEMON) | .id' | sort) +ACTIVEWINDOWS=$(mmsg get all-clients | jq -r --arg ACTIVETAG "$ACTIVETAG" --arg ACTIVEMON "$MONITOR" '.clients[] | select(.tags[] == ($ACTIVETAG | tonumber) and .monitor == $ACTIVEMON) | .id' | sort) #echo "active windows are:" #echo "----------------------------------------" #echo "$ACTIVEWINDOWS" #echo "----------------------------------------" -echo "lock" > ~/.config/monocle.lock +echo "lock" > ~/.config/monocle-$MONITOR.lock sleep 0.05 INDEX=0 -echo "" > ~/.config/monocle.state +echo "" > ~/.config/monocle-$MONITOR.state while read LINE; do ID=$LINE TITLE=$(mmsg get all-clients | jq -r --arg ID "$LINE" '.clients[] | select(.id == ($ID | tonumber)) | .title' ) INDEX=$((INDEX+1)) - echo "index:$INDEX \ $TITLE \ $ID" >> ~/.config/monocle.state + echo "index:$INDEX \ $TITLE \ $ID" >> ~/.config/monocle-$MONITOR.state done <<< "$ACTIVEWINDOWS" sleep 0.05 -rm ~/.config/monocle.lock +rm ~/.config/monocle-$MONITOR.lock echo "(running)" \ No newline at end of file diff --git a/sdgos/monocle/modules.json b/sdgos/monocle/modules-dp1.json similarity index 83% rename from sdgos/monocle/modules.json rename to sdgos/monocle/modules-dp1.json index ce2b496..79875d1 100644 --- a/sdgos/monocle/modules.json +++ b/sdgos/monocle/modules-dp1.json @@ -7,8 +7,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "daemon is running, click to refresh", - "on-click": "~/.config/sdgos/monocle/indexer.sh", - "exec": "~/.config/sdgos/monocle/indexer.sh", + "on-click": "~/.config/sdgos/monocle/indexer.sh DP-1", + "exec": "~/.config/sdgos/monocle/indexer.sh DP-1", "max-length": 20, "interval": 1 @@ -18,8 +18,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 1: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 1", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 1", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 1 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 1 DP-1", "max-length": 20, "interval": 1.5 @@ -28,8 +28,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 2: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 2", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 2", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 2 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 2 DP-1", "max-length": 20, "interval": 1.5 @@ -39,8 +39,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 3: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 3", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 3", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 3 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 3 DP-1", "max-length": 20, "interval": 1.5 @@ -50,8 +50,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 4: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 4", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 4", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 4 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 4 DP-1", "max-length": 20, "interval": 1.5 @@ -61,8 +61,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 5: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 5", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 5", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 5 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 5 DP-1", "max-length": 20, "interval": 1.5 @@ -72,8 +72,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 6: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 6", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 6", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 6 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 6 DP-1", "max-length": 20, "interval": 1.5 @@ -83,8 +83,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 7: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 7", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 7", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 7 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 7 DP-1", "max-length": 20, "interval": 1.5 @@ -94,8 +94,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 8: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 8", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 8", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 8 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 8 DP-1", "max-length": 20, "interval": 1.5 @@ -105,8 +105,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 9: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 9", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 9", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 9 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 9 DP-1", "max-length": 20, "interval": 1.5 @@ -116,8 +116,8 @@ "tooltip": true, "format":"{text}", "tooltip-format": "window 10: {text}", - "on-click": "~/.config/sdgos/monocle/focuswindow.sh 10", - "exec": "~/.config/sdgos/monocle/fetchwindow.sh 10", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 10 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 10 DP-1", "max-length": 20, "interval": 1.5 diff --git a/sdgos/monocle/modules-dp3.json b/sdgos/monocle/modules-dp3.json new file mode 100644 index 0000000..2fe49f2 --- /dev/null +++ b/sdgos/monocle/modules-dp3.json @@ -0,0 +1,351 @@ + +{ + + + // Test Button + "custom/daemon": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "daemon is running, click to refresh", + "on-click": "~/.config/sdgos/monocle/indexer.sh DP-3", + "exec": "~/.config/sdgos/monocle/indexer.sh DP-3", + "max-length": 20, + "interval": 1 + + }, + + "custom/window1": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 1: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 1 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 1 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + "custom/window2": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 2: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 2 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 2 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window3": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 3: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 3 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 3 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window4": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 4: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 4 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 4 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window5": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 5: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 5 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 5 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window6": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 6: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 6 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 6 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window7": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 7: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 7 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 7 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window8": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 8: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 8 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 8 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window9": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 9: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 9 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 9 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window10": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 10: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 10 DP-3", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 10 DP-3", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/test-button2": { + "tooltip": true, + "format":"oooh", + "tooltip-format": "this is a button", + "on-click": "ydotool key 125:1 16:1 125:0 16:0" + + }, + + "custom/button-fuzzel": { + "tooltip": true, + "format":"run", + "tooltip-format": "application start menu", + "on-click": "fuzzel" + + }, + "custom/button-term": { + "tooltip": true, + "format":"shell", + "tooltip-format": "launch terminal", + "on-click": "alacritty" + + }, + + "custom/button-files": { + "tooltip": true, + "format":"files", + "tooltip-format": "launch files", + "on-click": "nautilus" + + }, + + "custom/button-next": { + "tooltip": true, + "format":"next", + "tooltip-format": "next window", + "on-click": "ydotool key 56:1 15:1 56:0 15:0" + + }, + + "custom/button-prev": { + "tooltip": true, + "format": "prev", + "tooltip-format": "previous window", + "on-click": "ydotool key 56:1 42:1 15:1 56:0 42:0 15:0" + + }, + + "custom/button-fit": { + "tooltip": true, + "format":"fit", + "tooltip-format": "fit cluster to viewport", + "on-click": "ydotool key 125:1 42:1 50:1 125:0 42:0 50:0" + + }, + + "custom/button-zoomin": { + "tooltip": true, + "format":"+", + "tooltip-format": "zoom in", + "on-click": "ydotool key 125:1 13:1 125:0 13:0" + + }, + + "custom/button-zoomout": { + "tooltip": true, + "format":"-", + "tooltip-format": "zoom out", + "on-click": "ydotool key 125:1 12:1 125:0 12:0" + + }, + + + + // Keyboard State + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + + // System tray + "tray": { + // "icon-size": 21, + "spacing": 10 + }, + + // Clock + "clock": { + // "timezone": "Europe/Amsterdam", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + + // System + "custom/system": { + "format": "", + "tooltip": false + }, + + // CPU + "cpu": { + "format": "/ C {usage}% ", + "on-click": "alacritty -e btop" + }, + + // Memory + "memory": { + "format": "/ M {}% ", + "on-click": "alacritty -e btop" + }, + + // Harddisc space used + "disk": { + "interval": 30, + "format": "D {percentage_used}% ", + "path": "/", + "on-click": "alacritty -e btop" + }, + + "hyprland/language": { + "format": "/ K {short}" + }, + + // Group Hardware + "group/hardware": { + "orientation": "inherit", + "drawer": { + "transition-duration": 300, + "children-class": "not-memory", + "transition-left-to-right": false + }, + "modules": [ + "custom/system", + "disk", + "cpu", + "memory", + "hyprland/language" + ] + }, + + // Network + "network": { + "format": "{ifname}", + "format-wifi": " {essid}({signalStrength}%)", + "format-ethernet": " {ifname}", + "format-disconnected": "Disconnected ⚠", + "tooltip-format": " {ifname} via {gwaddri}", + "tooltip-format-wifi": " {ifname} @ {essid}\nIP: {ipaddr}\nStrength: {signalStrength}%\nFreq: {frequency}MHz\nUp: {bandwidthUpBits} Down: {bandwidthDownBits}", + "tooltip-format-ethernet": " {ifname}\nIP: {ipaddr}\n up: {bandwidthUpBits} down: {bandwidthDownBits}", + "tooltip-format-disconnected": "Disconnected", + "max-length": 50, + "on-click": "nm-connection-editor" + }, + + // Battery + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{icon} {time}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": [" ", " ", " ", " ", " "] + }, + + // Pulseaudio + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{icon} {volume}%", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", " ", " "] + }, + "on-click": "pavucontrol" + }, + + // Bluetooth + "bluetooth": { + "format-disabled": "", + "format-off": "", + "interval": 30, + "on-click": "blueman-manager", + "format-no-controller": "" + }, + + // Other + "user": { + "format": "{user}", + "interval": 60, + "icon": false + }, + + // Idle Inhibator + "idle_inhibitor": { + "format": "{icon}", + "tooltip": true, + "format-icons":{ + "activated": "", + "deactivated": "" + }, + "on-click-right": "hyprlock" + } + + + + +} \ No newline at end of file diff --git a/sdgos/monocle/modules-hdmi.json b/sdgos/monocle/modules-hdmi.json new file mode 100644 index 0000000..de0b441 --- /dev/null +++ b/sdgos/monocle/modules-hdmi.json @@ -0,0 +1,351 @@ + +{ + + + // Test Button + "custom/daemon": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "daemon is running, click to refresh", + "on-click": "~/.config/sdgos/monocle/indexer.sh HDMI-A-1", + "exec": "~/.config/sdgos/monocle/indexer.sh HDMI-A-1", + "max-length": 20, + "interval": 1 + + }, + + "custom/window1": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 1: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 1 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 1 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + "custom/window2": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 2: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 2 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 2 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window3": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 3: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 3 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 3 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window4": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 4: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 4 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 4 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window5": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 5: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 5 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 5 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window6": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 6: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 6 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 6 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window7": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 7: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 7 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 7 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window8": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 8: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 8 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 8 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window9": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 9: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 9 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 9 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window10": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 10: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 10 HDMI-A-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 10 HDMI-A-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/test-button2": { + "tooltip": true, + "format":"oooh", + "tooltip-format": "this is a button", + "on-click": "ydotool key 125:1 16:1 125:0 16:0" + + }, + + "custom/button-fuzzel": { + "tooltip": true, + "format":"run", + "tooltip-format": "application start menu", + "on-click": "fuzzel" + + }, + "custom/button-term": { + "tooltip": true, + "format":"shell", + "tooltip-format": "launch terminal", + "on-click": "alacritty" + + }, + + "custom/button-files": { + "tooltip": true, + "format":"files", + "tooltip-format": "launch files", + "on-click": "nautilus" + + }, + + "custom/button-next": { + "tooltip": true, + "format":"next", + "tooltip-format": "next window", + "on-click": "ydotool key 56:1 15:1 56:0 15:0" + + }, + + "custom/button-prev": { + "tooltip": true, + "format": "prev", + "tooltip-format": "previous window", + "on-click": "ydotool key 56:1 42:1 15:1 56:0 42:0 15:0" + + }, + + "custom/button-fit": { + "tooltip": true, + "format":"fit", + "tooltip-format": "fit cluster to viewport", + "on-click": "ydotool key 125:1 42:1 50:1 125:0 42:0 50:0" + + }, + + "custom/button-zoomin": { + "tooltip": true, + "format":"+", + "tooltip-format": "zoom in", + "on-click": "ydotool key 125:1 13:1 125:0 13:0" + + }, + + "custom/button-zoomout": { + "tooltip": true, + "format":"-", + "tooltip-format": "zoom out", + "on-click": "ydotool key 125:1 12:1 125:0 12:0" + + }, + + + + // Keyboard State + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + + // System tray + "tray": { + // "icon-size": 21, + "spacing": 10 + }, + + // Clock + "clock": { + // "timezone": "Europe/Amsterdam", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + + // System + "custom/system": { + "format": "", + "tooltip": false + }, + + // CPU + "cpu": { + "format": "/ C {usage}% ", + "on-click": "alacritty -e btop" + }, + + // Memory + "memory": { + "format": "/ M {}% ", + "on-click": "alacritty -e btop" + }, + + // Harddisc space used + "disk": { + "interval": 30, + "format": "D {percentage_used}% ", + "path": "/", + "on-click": "alacritty -e btop" + }, + + "hyprland/language": { + "format": "/ K {short}" + }, + + // Group Hardware + "group/hardware": { + "orientation": "inherit", + "drawer": { + "transition-duration": 300, + "children-class": "not-memory", + "transition-left-to-right": false + }, + "modules": [ + "custom/system", + "disk", + "cpu", + "memory", + "hyprland/language" + ] + }, + + // Network + "network": { + "format": "{ifname}", + "format-wifi": " {essid}({signalStrength}%)", + "format-ethernet": " {ifname}", + "format-disconnected": "Disconnected ⚠", + "tooltip-format": " {ifname} via {gwaddri}", + "tooltip-format-wifi": " {ifname} @ {essid}\nIP: {ipaddr}\nStrength: {signalStrength}%\nFreq: {frequency}MHz\nUp: {bandwidthUpBits} Down: {bandwidthDownBits}", + "tooltip-format-ethernet": " {ifname}\nIP: {ipaddr}\n up: {bandwidthUpBits} down: {bandwidthDownBits}", + "tooltip-format-disconnected": "Disconnected", + "max-length": 50, + "on-click": "nm-connection-editor" + }, + + // Battery + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{icon} {time}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": [" ", " ", " ", " ", " "] + }, + + // Pulseaudio + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{icon} {volume}%", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", " ", " "] + }, + "on-click": "pavucontrol" + }, + + // Bluetooth + "bluetooth": { + "format-disabled": "", + "format-off": "", + "interval": 30, + "on-click": "blueman-manager", + "format-no-controller": "" + }, + + // Other + "user": { + "format": "{user}", + "interval": 60, + "icon": false + }, + + // Idle Inhibator + "idle_inhibitor": { + "format": "{icon}", + "tooltip": true, + "format-icons":{ + "activated": "", + "deactivated": "" + }, + "on-click-right": "hyprlock" + } + + + + +} \ No newline at end of file diff --git a/sdgos/monocle/monocle.sh b/sdgos/monocle/monocle.sh new file mode 100755 index 0000000..487869a --- /dev/null +++ b/sdgos/monocle/monocle.sh @@ -0,0 +1,5 @@ +#!/bin/bash + + +MON=$1 +waybar -c ~/.config/sdgos/monocle/config-$MON -s ~/.config/sdgos/monocle/style.css \ No newline at end of file diff --git a/sdgos/monocle/monocledaemon.sh b/sdgos/monocle/monocledaemon.sh deleted file mode 100644 index 08042b0..0000000 --- a/sdgos/monocle/monocledaemon.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -echo "off" > ~/.config/monocledaemon.state - -# constant command: mmsg watch all-monitors | jq -r '.monitors[] | select(.tags[] | select(.is_active == true) | .layout | test("M|K|VK")) | .name' \ No newline at end of file diff --git a/sdgos/tuis/layout-switch.sh b/sdgos/tuis/layout-switch.sh index d1a6a2c..2cc64de 100755 --- a/sdgos/tuis/layout-switch.sh +++ b/sdgos/tuis/layout-switch.sh @@ -8,10 +8,3 @@ SELECTED=$(cat ~/.config/sdgos/tuis/layouts.list | cut -d '|' -f 1 | fzf --layou CMD=$(cat ~/.config/sdgos/tuis/layouts.list | grep -e "$SELECTED" | cut -d '|' -f 2) eval $CMD - -if [[ "$SELECTED" == "Deck - horizontal " ]] || [[ "$SELECTED" == "Deck - vertical " ]]; then - pkill -9 waybar - mmsg dispatch spawn_shell,'waybar -c ~/.config/sdgos/monocle/config -s ~/.config/sdgos/monocle/style.css' -else - pkill -9 waybar -fi \ No newline at end of file diff --git a/sdgos/wayshell/configs/brightness-bar.sh b/sdgos/wayshell/configs/brightness-bar.sh new file mode 100755 index 0000000..795da40 --- /dev/null +++ b/sdgos/wayshell/configs/brightness-bar.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +BAR_WIDTH=24 + +get_brightness() { + brightnessctl -m 2>/dev/null | cut -d, -f4 | tr -d '%' +} + +pct=$(get_brightness) +[[ -z "$pct" ]] && pct=0 + +filled=$(( pct * BAR_WIDTH / 100 )) +empty=$(( BAR_WIDTH - filled )) + +for ((i=0; i/dev/null | cut -d, -f4 | tr -d '%' +} + +render_bar() { + local pct=$1 + local filled=$(( pct * BAR_WIDTH / 100 )) + local empty=$(( BAR_WIDTH - filled )) + local text="▲" + for ((i=0; i1)printf "\\n"; printf "%s", $0}') +printf '{"text":"%s","class":"brightness","percentage":%d,"alt":"%d%%"}\n' "$escaped" "$pct" "$pct" diff --git a/sdgos/wayshell/configs/colors.css b/sdgos/wayshell/configs/colors.css new file mode 100644 index 0000000..b29fb9c --- /dev/null +++ b/sdgos/wayshell/configs/colors.css @@ -0,0 +1,105 @@ +/* +* Css Colors +* Generated with Matugen +*/ + + @define-color background #0d141c; + + @define-color error #ffb4ab; + + @define-color error_container #93000a; + + @define-color inverse_on_surface #2a3139; + + @define-color inverse_primary #0062a0; + + @define-color inverse_surface #dde3ee; + + @define-color on_background #dde3ee; + + @define-color on_error #690005; + + @define-color on_error_container #ffdad6; + + @define-color on_primary #003256; + + @define-color on_primary_container #d0e4ff; + + @define-color on_primary_fixed #001d35; + + @define-color on_primary_fixed_variant #00497a; + + @define-color on_secondary #22304c; + + @define-color on_secondary_container #d8e2ff; + + @define-color on_secondary_fixed #0c1b36; + + @define-color on_secondary_fixed_variant #394664; + + @define-color on_surface #dde3ee; + + @define-color on_surface_variant #c0c7d2; + + @define-color on_tertiary #282c5a; + + @define-color on_tertiary_container #e0e0ff; + + @define-color on_tertiary_fixed #121644; + + @define-color on_tertiary_fixed_variant #3e4372; + + @define-color outline #8b919b; + + @define-color outline_variant #414750; + + @define-color primary #9bcaff; + + @define-color primary_container #00497a; + + @define-color primary_fixed #d0e4ff; + + @define-color primary_fixed_dim #9bcaff; + + @define-color scrim #000000; + + @define-color secondary #b8c6ea; + + @define-color secondary_container #394664; + + @define-color secondary_fixed #d8e2ff; + + @define-color secondary_fixed_dim #b8c6ea; + + @define-color shadow #000000; + + @define-color source_color #6c8cb0; + + @define-color surface #0d141c; + + @define-color surface_bright #333a42; + + @define-color surface_container #192028; + + @define-color surface_container_high #242b33; + + @define-color surface_container_highest #2f353e; + + @define-color surface_container_low #151c24; + + @define-color surface_container_lowest #080f16; + + @define-color surface_dim #0d141c; + + @define-color surface_tint #9bcaff; + + @define-color surface_variant #414750; + + @define-color tertiary #bfc2fa; + + @define-color tertiary_container #3e4372; + + @define-color tertiary_fixed #e0e0ff; + + @define-color tertiary_fixed_dim #bfc2fa; + diff --git a/sdgos/wayshell/configs/examples/colors.css b/sdgos/wayshell/configs/examples/colors.css new file mode 100644 index 0000000..b29fb9c --- /dev/null +++ b/sdgos/wayshell/configs/examples/colors.css @@ -0,0 +1,105 @@ +/* +* Css Colors +* Generated with Matugen +*/ + + @define-color background #0d141c; + + @define-color error #ffb4ab; + + @define-color error_container #93000a; + + @define-color inverse_on_surface #2a3139; + + @define-color inverse_primary #0062a0; + + @define-color inverse_surface #dde3ee; + + @define-color on_background #dde3ee; + + @define-color on_error #690005; + + @define-color on_error_container #ffdad6; + + @define-color on_primary #003256; + + @define-color on_primary_container #d0e4ff; + + @define-color on_primary_fixed #001d35; + + @define-color on_primary_fixed_variant #00497a; + + @define-color on_secondary #22304c; + + @define-color on_secondary_container #d8e2ff; + + @define-color on_secondary_fixed #0c1b36; + + @define-color on_secondary_fixed_variant #394664; + + @define-color on_surface #dde3ee; + + @define-color on_surface_variant #c0c7d2; + + @define-color on_tertiary #282c5a; + + @define-color on_tertiary_container #e0e0ff; + + @define-color on_tertiary_fixed #121644; + + @define-color on_tertiary_fixed_variant #3e4372; + + @define-color outline #8b919b; + + @define-color outline_variant #414750; + + @define-color primary #9bcaff; + + @define-color primary_container #00497a; + + @define-color primary_fixed #d0e4ff; + + @define-color primary_fixed_dim #9bcaff; + + @define-color scrim #000000; + + @define-color secondary #b8c6ea; + + @define-color secondary_container #394664; + + @define-color secondary_fixed #d8e2ff; + + @define-color secondary_fixed_dim #b8c6ea; + + @define-color shadow #000000; + + @define-color source_color #6c8cb0; + + @define-color surface #0d141c; + + @define-color surface_bright #333a42; + + @define-color surface_container #192028; + + @define-color surface_container_high #242b33; + + @define-color surface_container_highest #2f353e; + + @define-color surface_container_low #151c24; + + @define-color surface_container_lowest #080f16; + + @define-color surface_dim #0d141c; + + @define-color surface_tint #9bcaff; + + @define-color surface_variant #414750; + + @define-color tertiary #bfc2fa; + + @define-color tertiary_container #3e4372; + + @define-color tertiary_fixed #e0e0ff; + + @define-color tertiary_fixed_dim #bfc2fa; + diff --git a/sdgos/wayshell/configs/examples/config-dp1 b/sdgos/wayshell/configs/examples/config-dp1 new file mode 100644 index 0000000..5b3ac20 --- /dev/null +++ b/sdgos/wayshell/configs/examples/config-dp1 @@ -0,0 +1,35 @@ +{ + "layer": "top", + "position": "right", + "fixed-center": "true", + "output": "DP-1", + "margin-top": 0, + "margin-bottom": 0, + "margin-left": 0, + "margin-right": 0, + "spacing": 3, + + // Load Modules + "include": [ + "~/.config/sdgos/monocle/modules-dp1.json" + ], + "modules-left": [ + "custom/daemon", + "custom/window1", + "custom/window2", + "custom/window3", + "custom/window4", + "custom/window5", + "custom/window6", + "custom/window7", + "custom/window8", + "custom/window9", + "custom/window10", + + + ], + "modules-center": [ + ], + "modules-right": [ + ] +} \ No newline at end of file diff --git a/sdgos/wayshell/configs/examples/modules-dp1.json b/sdgos/wayshell/configs/examples/modules-dp1.json new file mode 100644 index 0000000..79875d1 --- /dev/null +++ b/sdgos/wayshell/configs/examples/modules-dp1.json @@ -0,0 +1,351 @@ + +{ + + + // Test Button + "custom/daemon": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "daemon is running, click to refresh", + "on-click": "~/.config/sdgos/monocle/indexer.sh DP-1", + "exec": "~/.config/sdgos/monocle/indexer.sh DP-1", + "max-length": 20, + "interval": 1 + + }, + + "custom/window1": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 1: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 1 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 1 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + "custom/window2": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 2: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 2 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 2 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window3": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 3: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 3 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 3 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window4": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 4: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 4 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 4 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window5": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 5: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 5 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 5 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window6": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 6: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 6 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 6 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window7": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 7: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 7 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 7 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window8": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 8: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 8 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 8 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window9": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 9: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 9 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 9 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/window10": { + "tooltip": true, + "format":"{text}", + "tooltip-format": "window 10: {text}", + "on-click": "~/.config/sdgos/monocle/focuswindow.sh 10 DP-1", + "exec": "~/.config/sdgos/monocle/fetchwindow.sh 10 DP-1", + "max-length": 20, + "interval": 1.5 + + }, + + "custom/test-button2": { + "tooltip": true, + "format":"oooh", + "tooltip-format": "this is a button", + "on-click": "ydotool key 125:1 16:1 125:0 16:0" + + }, + + "custom/button-fuzzel": { + "tooltip": true, + "format":"run", + "tooltip-format": "application start menu", + "on-click": "fuzzel" + + }, + "custom/button-term": { + "tooltip": true, + "format":"shell", + "tooltip-format": "launch terminal", + "on-click": "alacritty" + + }, + + "custom/button-files": { + "tooltip": true, + "format":"files", + "tooltip-format": "launch files", + "on-click": "nautilus" + + }, + + "custom/button-next": { + "tooltip": true, + "format":"next", + "tooltip-format": "next window", + "on-click": "ydotool key 56:1 15:1 56:0 15:0" + + }, + + "custom/button-prev": { + "tooltip": true, + "format": "prev", + "tooltip-format": "previous window", + "on-click": "ydotool key 56:1 42:1 15:1 56:0 42:0 15:0" + + }, + + "custom/button-fit": { + "tooltip": true, + "format":"fit", + "tooltip-format": "fit cluster to viewport", + "on-click": "ydotool key 125:1 42:1 50:1 125:0 42:0 50:0" + + }, + + "custom/button-zoomin": { + "tooltip": true, + "format":"+", + "tooltip-format": "zoom in", + "on-click": "ydotool key 125:1 13:1 125:0 13:0" + + }, + + "custom/button-zoomout": { + "tooltip": true, + "format":"-", + "tooltip-format": "zoom out", + "on-click": "ydotool key 125:1 12:1 125:0 12:0" + + }, + + + + // Keyboard State + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + + // System tray + "tray": { + // "icon-size": 21, + "spacing": 10 + }, + + // Clock + "clock": { + // "timezone": "Europe/Amsterdam", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + + // System + "custom/system": { + "format": "", + "tooltip": false + }, + + // CPU + "cpu": { + "format": "/ C {usage}% ", + "on-click": "alacritty -e btop" + }, + + // Memory + "memory": { + "format": "/ M {}% ", + "on-click": "alacritty -e btop" + }, + + // Harddisc space used + "disk": { + "interval": 30, + "format": "D {percentage_used}% ", + "path": "/", + "on-click": "alacritty -e btop" + }, + + "hyprland/language": { + "format": "/ K {short}" + }, + + // Group Hardware + "group/hardware": { + "orientation": "inherit", + "drawer": { + "transition-duration": 300, + "children-class": "not-memory", + "transition-left-to-right": false + }, + "modules": [ + "custom/system", + "disk", + "cpu", + "memory", + "hyprland/language" + ] + }, + + // Network + "network": { + "format": "{ifname}", + "format-wifi": " {essid}({signalStrength}%)", + "format-ethernet": " {ifname}", + "format-disconnected": "Disconnected ⚠", + "tooltip-format": " {ifname} via {gwaddri}", + "tooltip-format-wifi": " {ifname} @ {essid}\nIP: {ipaddr}\nStrength: {signalStrength}%\nFreq: {frequency}MHz\nUp: {bandwidthUpBits} Down: {bandwidthDownBits}", + "tooltip-format-ethernet": " {ifname}\nIP: {ipaddr}\n up: {bandwidthUpBits} down: {bandwidthDownBits}", + "tooltip-format-disconnected": "Disconnected", + "max-length": 50, + "on-click": "nm-connection-editor" + }, + + // Battery + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{icon} {time}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": [" ", " ", " ", " ", " "] + }, + + // Pulseaudio + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{icon} {volume}%", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", " ", " "] + }, + "on-click": "pavucontrol" + }, + + // Bluetooth + "bluetooth": { + "format-disabled": "", + "format-off": "", + "interval": 30, + "on-click": "blueman-manager", + "format-no-controller": "" + }, + + // Other + "user": { + "format": "{user}", + "interval": 60, + "icon": false + }, + + // Idle Inhibator + "idle_inhibitor": { + "format": "{icon}", + "tooltip": true, + "format-icons":{ + "activated": "", + "deactivated": "" + }, + "on-click-right": "hyprlock" + } + + + + +} \ No newline at end of file diff --git a/sdgos/wayshell/configs/examples/style.css b/sdgos/wayshell/configs/examples/style.css new file mode 100644 index 0000000..0539667 --- /dev/null +++ b/sdgos/wayshell/configs/examples/style.css @@ -0,0 +1,52 @@ +@import "./colors.css"; + +* { + font-family: "JetBrainsMono Nerd Font"; + font-weight: bold; + min-height: 0; + /* set font-size to 100% if font scaling is set to 1.00 using nwg-look */ + font-size: 97%; + font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"'; + border: 0px; + padding-top: 2px; + padding-bottom: 2px; + padding-left: 4px; + background-color: @surface; + animation: gradient_f 20s ease-in infinite; + transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682); +} + + + +#custom-daemon, +#custom-window1, +#custom-window2, +#custom-window3, +#custom-window4, +#custom-window5, +#custom-window6, +#custom-window7, +#custom-window8, +#custom-window9, +#custom-window10, +#custom-button-term, +#custom-button-files, +#custom-button-next, +#custom-button-prev, +#custom-button-zoomin, +#custom-button-zoomout, +#custom-button-fit { + background-color: @surface_container; + color: @primary; + border: 0px; + border-style: solid; + border-color: white; + border-radius: 10px; + padding-top: 4px; + padding-left: 6px; + padding-right: 6px; + padding-bottom: 4px; + +} + + diff --git a/sdgos/wayshell/configs/screenshot-modules b/sdgos/wayshell/configs/screenshot-modules new file mode 100644 index 0000000..a75ff46 --- /dev/null +++ b/sdgos/wayshell/configs/screenshot-modules @@ -0,0 +1,40 @@ +{ + "custom/ss-monitor": { + "format": "", + "tooltip-format": "Capture monitor", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-capture.sh output'" + }, + "custom/ss-zone": { + "format": "", + "tooltip-format": "Select zone", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-capture.sh area'" + }, + "custom/ss-all": { + "format": "", + "tooltip-format": "All monitors", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-capture.sh screen'" + }, + "custom/ss-window": { + "format": "", + "tooltip-format": "Capture window", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-capture.sh active'" + }, + "custom/ss-obs": { + "format": "", + "tooltip-format": "Open OBS", + "on-click": "mmsg dispatch spawn_shell,'obs'" + }, + "custom/ss-mode": { + "exec": "~/.config/sdgos/wayshell/configs/ss-mode.sh", + "interval": 86400, + "signal": 1, + "format": "{}", + "tooltip-format": "Screenshot mode", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-mode-cycle.sh'" + }, + "custom/ss-settings": { + "format": "", + "tooltip-format": "Settings", + "on-click": "mmsg dispatch spawn_shell,'~/.config/sdgos/wayshell/configs/ss-settings-menu.sh'" + } +} diff --git a/sdgos/wayshell/configs/screenshot.css b/sdgos/wayshell/configs/screenshot.css new file mode 100644 index 0000000..97a0d6e --- /dev/null +++ b/sdgos/wayshell/configs/screenshot.css @@ -0,0 +1,36 @@ +@import "./colors.css"; + +window#waybar { + background: transparent; + box-shadow: none; + border: none; +} + +#custom-ss-monitor, +#custom-ss-zone, +#custom-ss-all, +#custom-ss-window, +#custom-ss-obs, +#custom-ss-mode, +#custom-ss-settings { + background-color: @surface_container; + color: @primary; + font-size: 16px; + padding: 4px 10px 6px; + border-color: @primary; + border-style: solid; + border-width: 0 2px 2px; + border-radius: 0 0 10px 10px; + min-width: 20px; +} + +#custom-ss-monitor:hover, +#custom-ss-zone:hover, +#custom-ss-all:hover, +#custom-ss-window:hover, +#custom-ss-obs:hover, +#custom-ss-mode:hover, +#custom-ss-settings:hover { + background-color: @primary; + color: @surface_container; +} diff --git a/sdgos/wayshell/configs/screenshot.json b/sdgos/wayshell/configs/screenshot.json new file mode 100644 index 0000000..3364e5f --- /dev/null +++ b/sdgos/wayshell/configs/screenshot.json @@ -0,0 +1,25 @@ +{ + "layer": "overlay", + "exclusive": true, + "position": "top", + "margin-top": -2, + "margin-bottom": -30, + + "spacing": 2, + "include": [ + "~/.config/sdgos/wayshell/configs/screenshot-modules" + ], + "modules-left": [ + ], + "modules-center": [ + "custom/ss-monitor", + "custom/ss-zone", + "custom/ss-all", + "custom/ss-window", + "custom/ss-obs", + "custom/ss-mode", + "custom/ss-settings" + ], + "modules-right": [ + ] +} diff --git a/sdgos/wayshell/configs/ss-capture.sh b/sdgos/wayshell/configs/ss-capture.sh new file mode 100755 index 0000000..3caa089 --- /dev/null +++ b/sdgos/wayshell/configs/ss-capture.sh @@ -0,0 +1,95 @@ +#!/bin/bash +target=$1 +state_file=$HOME/.config/sdgos/wayshell/screenshot.state + +if [ ! -f "$state_file" ]; then + mkdir -p "$(dirname "$state_file")" + cat > "$state_file" <<- EOF +mode=clipboard +save_dir=$HOME/Pictures/Screenshots +editor=gimp +EOF +fi + +mode=$(awk -F= '/^mode=/ {print $2}' "$state_file") +save_dir=$(awk -F= '/^save_dir=/ {print $2}' "$state_file") +editor=$(awk -F= '/^editor=/ {print $2}' "$state_file") +timestamp=$(date +%s) + +# Hide the screenshot bar so it doesn't appear in captures +pkill -f "screenshot.json" 2>/dev/null || true +sleep 0.5 + +# Resolve capture geometry/device +case $target in + output) + monitor=$(mmsg get cursorpos | python3 -c "import json,sys; print(json.load(sys.stdin)['monitor'])") + grim_args=(-o "$monitor") + label="$(echo "$monitor" | sed 's/[-_.]/ /g')" + ;; + area) + grim_args=(-g "$(slurp)") + label="selected area" + ;; + screen) + grim_args=() + label="all monitors" + ;; + active) + slurp -p -f "%x,%y" >/dev/null 2>&1 + sleep 0.5 + geom=$(mmsg get focusing-client | python3 -c " +import json,sys +d=json.load(sys.stdin) +print(f'{d[\"x\"]},{d[\"y\"]} {d[\"width\"]}x{d[\"height\"]}') +") + grim_args=(-g "$geom") + label="window" + ;; +esac + +case $mode in + disk) + mkdir -p "$save_dir" + file="$save_dir/screenshot-$timestamp.png" + grim "${grim_args[@]}" "$file" + editor_name=$(echo "$editor" | awk '{print $1}' | sed 's|.*/||') + action=$(notify-send \ + -a "Screenshot" \ + -i "$file" \ + -h "string:image-path:$file" \ + -t 10000 \ + -A "open=Open in $editor_name" \ + "Screenshot saved" \ + "$(basename "$file")") + if [ "$action" = "open" ]; then + mmsg dispatch spawn_shell,"$editor $file" + fi + ;; + clipboard) + file=$(mktemp /tmp/screenshot-XXXXXX.png) + grim "${grim_args[@]}" "$file" + wl-copy < "$file" + notify-send \ + -a "Screenshot" \ + -i "$file" \ + -h "string:image-path:$file" \ + -t 3000 \ + "Screenshot copied" \ + "$label captured to clipboard" + rm "$file" + ;; + editor) + mkdir -p "$save_dir" + file="$save_dir/screenshot-$timestamp.png" + grim "${grim_args[@]}" "$file" + mmsg dispatch spawn_shell,"$editor $file" + notify-send \ + -a "Screenshot" \ + -i "$file" \ + -h "string:image-path:$file" \ + -t 3000 \ + "Opening in editor" \ + "$(basename "$file")" + ;; +esac diff --git a/sdgos/wayshell/configs/ss-mode-cycle.sh b/sdgos/wayshell/configs/ss-mode-cycle.sh new file mode 100755 index 0000000..536563e --- /dev/null +++ b/sdgos/wayshell/configs/ss-mode-cycle.sh @@ -0,0 +1,35 @@ +#!/bin/bash +state_file=$HOME/.config/sdgos/wayshell/screenshot.state + +if [ ! -f "$state_file" ]; then + mkdir -p "$(dirname "$state_file")" + cat > "$state_file" <<- EOF +mode=clipboard +save_dir=$HOME/Pictures/Screenshots +editor=gimp +EOF + new_mode="disk" +else + mode=$(awk -F= '/^mode=/ {print $2}' "$state_file") + case $mode in + disk) new_mode="clipboard" ;; + clipboard) new_mode="editor" ;; + editor) new_mode="disk" ;; + *) new_mode="clipboard" ;; + esac + sed -i "s/^mode=.*/mode=$new_mode/" "$state_file" +fi + +killall -SIGRTMIN+1 waybar 2>/dev/null +killall -SIGRTMIN+2 waybar 2>/dev/null + +case $new_mode in + disk) icon_char="" ;; + clipboard) icon_char="" ;; + editor) icon_char="" ;; +esac +notify-send \ + -a "$icon_char" \ + -t 2000 \ + "Screenshot mode" \ + "Changed to: $new_mode" diff --git a/sdgos/wayshell/configs/ss-mode.sh b/sdgos/wayshell/configs/ss-mode.sh new file mode 100755 index 0000000..cb66f8a --- /dev/null +++ b/sdgos/wayshell/configs/ss-mode.sh @@ -0,0 +1,12 @@ +#!/bin/bash +state_file=$HOME/.config/sdgos/wayshell/screenshot.state + +icon="" +if [ -f "$state_file" ]; then + mode=$(awk -F= '/^mode=/ {print $2}' "$state_file") + case $mode in + disk) icon="" ;; + editor) icon="" ;; + esac +fi +echo "$icon" diff --git a/sdgos/wayshell/configs/ss-settings-menu.sh b/sdgos/wayshell/configs/ss-settings-menu.sh new file mode 100755 index 0000000..cba44ae --- /dev/null +++ b/sdgos/wayshell/configs/ss-settings-menu.sh @@ -0,0 +1,52 @@ +#!/bin/bash +state_file=$HOME/.config/sdgos/wayshell/screenshot.state + +if [ ! -f "$state_file" ]; then + mkdir -p "$(dirname "$state_file")" + cat > "$state_file" <<- EOF +mode=clipboard +save_dir=$HOME/Pictures/Screenshots +editor=gimp +EOF +fi + +mode=$(awk -F= '/^mode=/ {print $2}' "$state_file") +save_dir=$(awk -F= '/^save_dir=/ {print $2}' "$state_file") +editor=$(awk -F= '/^editor=/ {print $2}' "$state_file") + +case $mode in + disk) + new_dir=$(zenity --file-selection --directory \ + --title="Screenshot save directory" \ + --filename="$save_dir/") + if [ -n "$new_dir" ]; then + sed -i "s|^save_dir=.*|save_dir=$new_dir|" "$state_file" + notify-send \ + -a "" \ + -t 3000 \ + "Save directory" \ + "$(basename "$new_dir")" + fi + ;; + clipboard) + notify-send \ + -a "" \ + -t 2000 \ + "Clipboard mode" \ + "No settings available" + ;; + editor) + new_editor=$(zenity --entry \ + --title="Screenshot editor" \ + --text="Editor command:" \ + --entry-text="$editor") + if [ -n "$new_editor" ]; then + sed -i "s|^editor=.*|editor=$new_editor|" "$state_file" + notify-send \ + -a "" \ + -t 3000 \ + "Editor" \ + "$new_editor" + fi + ;; +esac diff --git a/sdgos/wayshell/configs/ss-settings.sh b/sdgos/wayshell/configs/ss-settings.sh new file mode 100755 index 0000000..60f99fd --- /dev/null +++ b/sdgos/wayshell/configs/ss-settings.sh @@ -0,0 +1,17 @@ +#!/bin/bash +state_file=$HOME/.config/sdgos/wayshell/screenshot.state + +tooltip="Settings" + +if [ -f "$state_file" ]; then + mode=$(awk -F= '/^mode=/ {print $2}' "$state_file") + save_dir=$(awk -F= '/^save_dir=/ {print $2}' "$state_file") + editor=$(awk -F= '/^editor=/ {print $2}' "$state_file") + case $mode in + disk) tooltip="Save to: $save_dir" ;; + clipboard) tooltip="Clipboard mode" ;; + editor) tooltip="Editor: $editor" ;; + esac +fi + +echo "{\"text\":\"\",\"tooltip\":\"$tooltip\"}" diff --git a/sdgos/wayshell/configs/volume-bar.sh b/sdgos/wayshell/configs/volume-bar.sh new file mode 100755 index 0000000..2ea778d --- /dev/null +++ b/sdgos/wayshell/configs/volume-bar.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +BAR_WIDTH=24 + +get_volume() { + wpctl get-volume @DEFAULT_AUDIO_SINK@ 2>/dev/null | sed 's/.*: //' | awk '{printf "%.0f\n", $1 * 100}' +} + +pct=$(get_volume) +[[ -z "$pct" ]] && pct=0 + +filled=$(( pct * BAR_WIDTH / 100 )) +empty=$(( BAR_WIDTH - filled )) + +for ((i=0; i/dev/null | grep -qi "MUTED"; then + printf "\uf026\n" +else + printf "\uf028\n" +fi diff --git a/sdgos/wayshell/configs/volume.css b/sdgos/wayshell/configs/volume.css new file mode 100644 index 0000000..a3d0429 --- /dev/null +++ b/sdgos/wayshell/configs/volume.css @@ -0,0 +1,49 @@ +@import "./colors.css"; + +window#waybar { + background: transparent; + box-shadow: none; + border: none; +} + +#custom-volume-up, +#custom-volume-bar, +#custom-volume-down, +#custom-volume-icon { + background-color: @surface_container; + color: @primary; + font-size: 12px; +} + +#custom-volume-up, +#custom-volume-bar, +#custom-volume-down { + margin: 0; + border-color: @primary; + border-style: solid; +} + +#custom-volume-up { + padding: 4px 6px; + border-width: 2px 2px 0 2px; + border-radius: 10px 10px 0 0; +} + +#custom-volume-bar { + padding: 0 2px; + border-width: 0 2px; + border-radius: 0; +} + +#custom-volume-down { + padding: 4px 6px; + border-width: 0 2px 2px 2px; + border-radius: 0 0 10px 10px; +} + +#custom-volume-icon { + padding: 4px 6px; + border: 2px solid @primary; + border-radius: 10px; + margin-top: 6px; +} diff --git a/sdgos/wayshell/configs/volume.json b/sdgos/wayshell/configs/volume.json new file mode 100644 index 0000000..425ba73 --- /dev/null +++ b/sdgos/wayshell/configs/volume.json @@ -0,0 +1,24 @@ +{ + "layer": "overlay", + "exclusive": false, + "position": "right", + "width": 36, + "margin-top": 300, + "margin-bottom": 300, + "margin-left": 0, + "margin-right": 6, + "spacing": 0, + "include": [ + "~/.config/sdgos/wayshell/configs/waybar-modules" + ], + "modules-left": [ + ], + "modules-center": [ + "custom/volume-up", + "custom/volume-bar", + "custom/volume-down", + "custom/volume-icon" + ], + "modules-right": [ + ] +} diff --git a/sdgos/wayshell/configs/volume.sh b/sdgos/wayshell/configs/volume.sh new file mode 100755 index 0000000..885d004 --- /dev/null +++ b/sdgos/wayshell/configs/volume.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +BAR_WIDTH=20 + +get_volume() { + wpctl get-volume @DEFAULT_AUDIO_SINK@ 2>/dev/null | sed 's/.*: //' | awk '{printf "%.0f\n", $1 * 100}' +} + +is_muted() { + wpctl get-volume @DEFAULT_AUDIO_SINK@ 2>/dev/null | grep -qi "MUTED" && echo "yes" || echo "no" +} + +render_bar() { + local pct=$1 + local filled=$(( pct * BAR_WIDTH / 100 )) + local empty=$(( BAR_WIDTH - filled )) + local text="▲" + for ((i=0; i1)printf "\\n"; printf "%s", $0}') +printf '{"text":"%s","class":"%s","percentage":%d,"alt":"%d%%"}\n' "$escaped" "$cls" "$pct" "$pct" diff --git a/sdgos/wayshell/configs/waybar-modules b/sdgos/wayshell/configs/waybar-modules new file mode 100644 index 0000000..8a1cc1b --- /dev/null +++ b/sdgos/wayshell/configs/waybar-modules @@ -0,0 +1,43 @@ +{ + "custom/volume-up": { + "on-click": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+", + "format": "▲" + }, + "custom/volume-bar": { + "exec": "~/.config/sdgos/wayshell/configs/volume-bar.sh", + "interval": 0.3, + "rotate": 90, + "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+", + "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-", + "format": "{}" + }, + "custom/volume-down": { + "on-click": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-", + "format": "▼" + }, + "custom/volume-icon": { + "exec": "~/.config/sdgos/wayshell/configs/volume-icon.sh", + "interval": 1, + "on-click": "pavucontrol", + "format": "{}" + }, + "custom/brightness-up": { + "on-click": "brightnessctl set +5%", + "format": "▲" + }, + "custom/brightness-bar": { + "exec": "~/.config/sdgos/wayshell/configs/brightness-bar.sh", + "interval": 1, + "rotate": 90, + "on-scroll-up": "brightnessctl set +5%", + "on-scroll-down": "brightnessctl set 5%-", + "format": "{}" + }, + "custom/brightness-down": { + "on-click": "brightnessctl set 5%-", + "format": "▼" + }, + "custom/brightness-icon": { + "format": "" + } +} diff --git a/sdgos/wayshell/modules/layout.sh b/sdgos/wayshell/modules/layout.sh index 254f5b4..2d252f1 100755 --- a/sdgos/wayshell/modules/layout.sh +++ b/sdgos/wayshell/modules/layout.sh @@ -15,15 +15,11 @@ # - mmsg #=============================================================================== -declare -A ACTIVE_LAYOUTS - -make_key() { - echo "${1}:${2}:${3}" -} +declare -A MONITOR_LAYOUT process_tags_update() { local json="$1" - local monitors monitor tag layout is_active key new_keys="" + local monitors monitor tag layout is_active monitors=$(jq -c '.all_tags[]' <<< "$json" 2>/dev/null) @@ -37,25 +33,19 @@ process_tags_update() { tag=$(jq -r '.index' <<< "$tag_entry" 2>/dev/null) layout=$(jq -r '.layout' <<< "$tag_entry" 2>/dev/null) is_active=$(jq -r '.is_active' <<< "$tag_entry" 2>/dev/null) - key=$(make_key "$monitor" "$tag" "$layout") - new_keys="$new_keys $key" if [[ "$is_active" == "true" ]]; then - if [[ -z "${ACTIVE_LAYOUTS[$key]}" ]]; then + local prev="${MONITOR_LAYOUT[$monitor]}" + if [[ "$prev" != "$layout" ]]; then + if [[ -n "$prev" ]]; then + echo "{\"layout\":\"$prev\",\"state\":\"inactive\",\"monitor\":\"$monitor\",\"tag\":$tag}" + fi echo "{\"layout\":\"$layout\",\"state\":\"active\",\"monitor\":\"$monitor\",\"tag\":$tag}" + MONITOR_LAYOUT["$monitor"]="$layout" fi - ACTIVE_LAYOUTS["$key"]="active" fi done < <(jq -c '.tags[]' <<< "$entry" 2>/dev/null) done <<< "$monitors" - - for key in "${!ACTIVE_LAYOUTS[@]}"; do - if [[ ! " $new_keys " =~ $key ]]; then - IFS=':' read -r monitor tag layout <<< "$key" - echo "{\"layout\":\"$layout\",\"state\":\"inactive\",\"monitor\":\"$monitor\",\"tag\":$tag}" - unset "ACTIVE_LAYOUTS[$key]" - fi - done } if ! command -v mmsg &>/dev/null || ! command -v jq &>/dev/null; then diff --git a/sdgos/wayshell/screenshot.state b/sdgos/wayshell/screenshot.state new file mode 100644 index 0000000..cca80d5 --- /dev/null +++ b/sdgos/wayshell/screenshot.state @@ -0,0 +1,3 @@ +mode=editor +save_dir=/home/den/Pictures/temp +editor=satty --filename diff --git a/sdgos/wayshell/wayshell.conf b/sdgos/wayshell/wayshell.conf index 935e6a4..223bf88 100644 --- a/sdgos/wayshell/wayshell.conf +++ b/sdgos/wayshell/wayshell.conf @@ -1,8 +1,18 @@ # Wayshell daemon configuration # zone_buffer — distance in pixels from screen edge that defines a "zone" (default: 10) -# on_delay — debounce delay in ms before triggering ON action (default: 100) -# off_delay — debounce delay in ms before triggering OFF action (default: 100) +# on_delay — default debounce delay in ms before triggering ON action (default: 100) +# off_delay — default debounce delay in ms before triggering OFF action (default: 100) +# Per-type overrides (fall back to on_delay/off_delay if unset): +# zone_on_delay / zone_off_delay +# layout_on_delay / layout_off_delay +# focused_on_delay / focused_off_delay -zone_buffer=30 -on_delay=500 -off_delay=500 \ No newline at end of file +zone_buffer=40 +on_delay=300 +off_delay=500 +zone_on_delay=300 +zone_off_delay=1500 +layout_on_delay=200 +layout_off_delay=0 +focused_on_delay=50 +focused_off_delay=500d \ No newline at end of file diff --git a/sdgos/wayshell/wayshell.modules b/sdgos/wayshell/wayshell.modules index b535efc..c60c79a 100644 --- a/sdgos/wayshell/wayshell.modules +++ b/sdgos/wayshell/wayshell.modules @@ -1,5 +1,5 @@ # Wayshell module definitions -# Format: name,on_exec,off_exec,type,args... +# Format: name|on_exec|off_exec|type|args... # name — unique identifier for the module # on_exec — command executed when the condition becomes true # off_exec — command executed when the condition becomes false @@ -12,19 +12,35 @@ # Focused args: app_id (e.g. firefox, com.mitchellh.ghostty) # Zone modules — trigger when cursor enters/exits screen edges -zone_left,notify-send "left show",notify-send "left hide",zone,0,0,30,1080 -zone_right,notify-send "right show",notify-send "right hide",zone,1890,0,1920,1080 -zone_top,notify-send "top show",notify-send "top hide",zone,0,0,1920,30 -zone_bottom,notify-send "bottom show",notify-send "bottom hide",zone,0,1050,1920,1080 +zone_left|mmsg dispatch spawn_shell,waybar -c ~/.config/sdgos/wayshell/configs/brightness.json -s ~/.config/sdgos/wayshell/configs/brightness.css|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/wayshell/configs/brightness.json -s /home/$(whoami)/.config/sdgos/wayshell/configs/brightness.css"|zone|0,300,40,780 +zone_right|mmsg dispatch spawn_shell,waybar -c ~/.config/sdgos/wayshell/configs/volume.json -s ~/.config/sdgos/wayshell/configs/volume.css|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/wayshell/configs/volume.json -s /home/$(whoami)/.config/sdgos/wayshell/configs/volume.css"|zone|1880,300,1920,780 +#zone_top|notify-send "top show"|notify-send "top hide"|zone|0,0,1920,30 +#zone_bottom|notify-send "bottom show"|notify-send "bottom hide"|zone|0,1050,1920,1080 + +# Screenshot toolbar — triggered from top-center of any monitor (monitor-local) +zone_topcenter|mmsg dispatch spawn_shell,waybar -c ~/.config/sdgos/wayshell/configs/screenshot.json -s ~/.config/sdgos/wayshell/configs/screenshot.css|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/wayshell/configs/screenshot.json -s /home/$(whoami)/.config/sdgos/wayshell/configs/screenshot.css"|zone|760,0,1160,40 # Layout modules — trigger when a layout is activated/deactivated on any tag # Append a monitor name after the layout to restrict to one display: -# monocle_dp1,...,layout,M,DP-1 -#monocle,notify-send "monocle on HDMI",notify-send "monocle off HDMI",layout,M,HDMI-A-1 -#monocle_dp1,notify-send "monocle on DP-1",notify-send "monocle off DP-1",layout,M,DP-1 -#monocle_dp3,notify-send "monocle on DP-3",notify-send "monocle off DP-2",layout,M,DP-3 -#dwindle,notify-send "dwindle on",notify-send "dwindle off",layout,DW,HDMI-A-1 +# monocle_dp1|...|...|layout|M,DP-1 + +# monocle bar +monocle|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh hdmi|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-hdmi -s /home/den/.config/sdgos/monocle/style.css"|layout|M,HDMI-A-1 +monocle_dp1|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp1|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp1 -s /home/den/.config/sdgos/monocle/style.css"|M,DP-1 +monocle_dp3|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp3|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp3 -s /home/den/.config/sdgos/monocle/style.css"|layout|M,DP-3 + + +# monocle bar on deck +deck-hdmi|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh hdmi|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-hdmi -s /home/den/.config/sdgos/monocle/style.css"|layout|K,HDMI-A-1 +deck-dp1|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp1|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp1 -s /home/den/.config/sdgos/monocle/style.css"|K,DP-1 +deck-dp3|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp3|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp3 -s /home/den/.config/sdgos/monocle/style.css"|layout|K,DP-3 + +# monocle bar on vertical deck +vdeck-hdmi|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh hdmi|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-hdmi -s /home/den/.config/sdgos/monocle/style.css"|layout|VK,HDMI-A-1 +vdeck-dp1|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp1|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp1 -s /home/den/.config/sdgos/monocle/style.css"|VK,DP-1 +vdeck-dp3|mmsg dispatch spawn_shell,~/.config/sdgos/monocle/monocle.sh dp3|pkill -f "waybar -c /home/$(whoami)/.config/sdgos/monocle/config-dp3 -s /home/den/.config/sdgos/monocle/style.css"|layout|VK,DP-3 + # Focused modules — trigger when specific app gains/loses focus -#term_focused,notify-send "terminal focused",notify-send "terminal unfocused",focused,com.mitchellh.ghostty -#browser_focused,notify-send "browser focused",notify-send "browser unfocused",focused,firefox +#term_focused|notify-send "terminal focused"|notify-send "terminal unfocused"|focused|com.mitchellh.ghostty +#browser_focused|notify-send "browser focused"|notify-send "browser unfocused"|focused|firefox diff --git a/sdgos/wayshell/wayshell.sh b/sdgos/wayshell/wayshell.sh index 445081b..bf08e59 100755 --- a/sdgos/wayshell/wayshell.sh +++ b/sdgos/wayshell/wayshell.sh @@ -32,7 +32,14 @@ trap cleanup SIGTERM SIGINT EXIT # --- Config --- ON_DELAY=$(grep -oP 'on_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "100") OFF_DELAY=$(grep -oP 'off_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "100") -echo "Config: on_delay=$ON_DELAY, off_delay=$OFF_DELAY" + +ZONE_ON_DELAY=$(grep -oP 'zone_on_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$ON_DELAY") +ZONE_OFF_DELAY=$(grep -oP 'zone_off_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$OFF_DELAY") +LAYOUT_ON_DELAY=$(grep -oP 'layout_on_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$ON_DELAY") +LAYOUT_OFF_DELAY=$(grep -oP 'layout_off_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$OFF_DELAY") +FOCUSED_ON_DELAY=$(grep -oP 'focused_on_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$ON_DELAY") +FOCUSED_OFF_DELAY=$(grep -oP 'focused_off_delay=\K[0-9]+' "$CONFIG_FILE" 2>/dev/null || echo "$OFF_DELAY") +echo "Config: on_delay=$ON_DELAY, off_delay=$OFF_DELAY zone_on=$ZONE_ON_DELAY zone_off=$ZONE_OFF_DELAY layout_on=$LAYOUT_ON_DELAY layout_off=$LAYOUT_OFF_DELAY focused_on=$FOCUSED_ON_DELAY focused_off=$FOCUSED_OFF_DELAY" # --- Storage --- declare -A MODULES @@ -45,10 +52,10 @@ parse_modules() { echo "Parsing modules from $MODULES_FILE" [[ -f "$MODULES_FILE" ]] || { echo "ERROR: Modules file not found"; exit 1; } local count=0 - while IFS=',' read -r name onexec offexec type args; do + while IFS='|' read -r name onexec offexec type args; do name="${name// /}" [[ "$name" =~ ^#.*$ || -z "$name" ]] && continue - MODULES["$name"]="$onexec,$offexec,$type,$args" + MODULES["$name"]="$onexec|$offexec|$type|$args" MODULE_STATES["$name"]="disabled" ((count++)) echo " [$count] $name ($type)" @@ -61,7 +68,7 @@ parse_modules modules_by_type() { local t="$1" for n in "${!MODULES[@]}"; do - IFS=',' read -r _ _ mt _ <<< "${MODULES[$n]}" + IFS='|' read -r _ _ mt _ <<< "${MODULES[$n]}" [[ "$mt" == "$t" ]] && echo "$n" done } @@ -89,17 +96,24 @@ get_monitor_offset() { # --- Check debounce timers and fire actions --- # Called every ~50ms from the main event loop. check_fires() { - local now name onexec offexec + local now name onexec offexec mtype on_delay off_delay now=$(date +%s%3N) # Pending ON fires for name in "${!MODULE_ENTER_TS[@]}"; do local st=${MODULE_STATES[$name]} [[ "$st" != "pending_on" && "$st" != "pending_off" ]] && continue - if (( now - MODULE_ENTER_TS[$name] >= ON_DELAY )); then + IFS='|' read -r _ _ mtype _ <<< "${MODULES[$name]}" + case "$mtype" in + zone) on_delay=$ZONE_ON_DELAY ;; + layout) on_delay=$LAYOUT_ON_DELAY ;; + focused) on_delay=$FOCUSED_ON_DELAY ;; + *) on_delay=$ON_DELAY ;; + esac + if (( now - MODULE_ENTER_TS[$name] >= on_delay )); then if [[ "$st" == "pending_on" ]]; then MODULE_STATES["$name"]="enabled" - IFS=',' read -r onexec _ _ _ <<< "${MODULES[$name]}" + IFS='|' read -r onexec _ _ _ <<< "${MODULES[$name]}" echo "ON $name" eval "$onexec" & fi @@ -111,9 +125,16 @@ check_fires() { for name in "${!MODULE_EXIT_TS[@]}"; do local st=${MODULE_STATES[$name]} [[ "$st" != "pending_off" && "$st" != "enabled" ]] && continue - if (( now - MODULE_EXIT_TS[$name] >= OFF_DELAY )); then + IFS='|' read -r _ _ mtype _ <<< "${MODULES[$name]}" + case "$mtype" in + zone) off_delay=$ZONE_OFF_DELAY ;; + layout) off_delay=$LAYOUT_OFF_DELAY ;; + focused) off_delay=$FOCUSED_OFF_DELAY ;; + *) off_delay=$OFF_DELAY ;; + esac + if (( now - MODULE_EXIT_TS[$name] >= off_delay )); then MODULE_STATES["$name"]="disabled" - IFS=',' read -r _ offexec _ _ <<< "${MODULES[$name]}" + IFS='|' read -r _ offexec _ _ <<< "${MODULES[$name]}" echo "OFF $name" eval "$offexec" & unset "MODULE_EXIT_TS[$name]" @@ -159,7 +180,7 @@ process_zone_event() { while IFS= read -r module_name; do [[ -z "$module_name" ]] && continue - IFS=',' read -r onexec offexec _ args <<< "${MODULES[$module_name]}" + IFS='|' read -r onexec offexec _ args <<< "${MODULES[$module_name]}" IFS=',' read -r x1 y1 x2 y2 <<< "$args" local ax1=$(( x1 + mx )) ay1=$(( y1 + my )) local ax2=$(( x2 + mx )) ay2=$(( y2 + my )) @@ -195,7 +216,7 @@ process_layout_event() { local now; now=$(date +%s%3N) while IFS= read -r module_name; do [[ -z "$module_name" ]] && continue - IFS=',' read -r onexec offexec _ args <<< "${MODULES[$module_name]}" + IFS='|' read -r onexec offexec _ args <<< "${MODULES[$module_name]}" # args = "layout_name" or "layout_name,monitor_name" local expected_layout="${args%%,*}" local expected_monitor="" @@ -223,7 +244,7 @@ process_focused_event() { local now; now=$(date +%s%3N) while IFS= read -r module_name; do [[ -z "$module_name" ]] && continue - IFS=',' read -r onexec offexec _ expected <<< "${MODULES[$module_name]}" + IFS='|' read -r onexec offexec _ expected <<< "${MODULES[$module_name]}" [[ "$app_id" != "$expected" ]] && continue local st=${MODULE_STATES[$module_name]} if [[ "$state" == "focused" && "$st" == "disabled" ]]; then