diff --git a/.config/waybar/config.jsonc##hostname.cn-arch b/.config/waybar/config.jsonc##hostname.cn-arch index cb72997..1150c82 100644 --- a/.config/waybar/config.jsonc##hostname.cn-arch +++ b/.config/waybar/config.jsonc##hostname.cn-arch @@ -1,18 +1,14 @@ { "layer": "bottom", + "output": ["DP-1", "DP-2", "!HDMI-A-2"], "position": "bottom", "mod": "dock", "exclusive": true, "gtk-layer-shell": true, "passthrough": false, "height": 30, - "modules-left": [ - "hyprland/workspaces" - ], - "modules-center": [ - "mpris", - "privacy" - ], + "modules-left": ["hyprland/workspaces"], + "modules-center": ["mpris", "privacy"], "modules-right": [ "custom/alhp", "cpu", @@ -23,18 +19,18 @@ "network", "battery", "tray", - "clock" + "clock", ], "hyprland/workspaces": { "icon-size": 32, "spacing": 16, "on-scroll-up": "hyprctl dispatch workspace r+1", - "on-scroll-down": "hyprctl dispatch workspace r-1" + "on-scroll-down": "hyprctl dispatch workspace r-1", }, "cpu": { "interval": 5, "format": " {usage}%", - "max-length": 10 + "max-length": 10, }, "disk": { "interval": 30, @@ -42,14 +38,14 @@ "path": "/", "tooltip": true, "unit": "GB", - "tooltip-format": "Available {free} of {total}" + "tooltip-format": "Available {free} of {total}", }, "memory": { "interval": 10, "format": " {percentage}%", "max-length": 10, "tooltip": true, - "tooltip-format": "RAM - {used:0.1f}GiB used" + "tooltip-format": "RAM - {used:0.1f}GiB used", }, "wlr/taskbar": { "format": "{icon} {title:.17}", @@ -58,11 +54,11 @@ "on-click-middle": "close", "tooltip-format": "{title}", "ignore-list": [], - "on-click": "activate" + "on-click": "activate", }, "tray": { "icon-size": 18, - "spacing": 3 + "spacing": 3, }, "clock": { "format": "{:%R | %d.%m.%Y}", @@ -78,16 +74,16 @@ "days": "{}", "weeks": "W{}", "weekdays": "{}", - "today": "{}" - } + "today": "{}", + }, }, "actions": { "on-click-right": "mode", "on-click-forward": "tz_up", "on-click-backward": "tz_down", "on-scroll-up": "shift_up", - "on-scroll-down": "shift_down" - } + "on-scroll-down": "shift_down", + }, }, "network": { "format-wifi": "{essid} ({signalStrength}%) {icon}", @@ -97,37 +93,19 @@ "tooltip-format-wifi": "{essid} ({signalStrength}%) ", "tooltip-format-ethernet": "{ifname} ", "tooltip-format-disconnected": "Disconnected", - "format-icons": [ - "󰤯 ", - "󰤟 ", - "󰤢 ", - "󰤢 ", - "󰤨 " - ] + "format-icons": ["󰤯 ", "󰤟 ", "󰤢 ", "󰤢 ", "󰤨 "], }, "battery": { "states": { "good": 95, "warning": 30, - "critical": 20 + "critical": 20, }, "format": "{icon} {capacity}%", "format-charging": " {capacity}%", "format-plugged": " {capacity}%", "format-alt": "{time} {icon}", - "format-icons": [ - "󰂎", - "󰁺", - "󰁻", - "󰁼", - "󰁽", - "󰁾", - "󰁿", - "󰂀", - "󰂁", - "󰂂", - "󰁹" - ] + "format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"], }, "pulseaudio": { "format": "{volume}% {icon} ", @@ -143,16 +121,11 @@ "phone-muted": "", "portable": "", "car": "", - "default": [ - "", - "" - ] + "default": ["", ""], }, "scroll-step": 5, "on-click": "pwvucontrol", - "ignored-sinks": [ - "Easy Effects Sink" - ] + "ignored-sinks": ["Easy Effects Sink"], }, "privacy": { "icon-spacing": 4, @@ -162,19 +135,19 @@ { "type": "screenshare", "tooltip": true, - "tooltip-icon-size": 12 + "tooltip-icon-size": 12, }, { "type": "audio-out", "tooltip": true, - "tooltip-icon-size": 12 + "tooltip-icon-size": 12, }, { "type": "audio-in", "tooltip": true, - "tooltip-icon-size": 12 - } - ] + "tooltip-icon-size": 12, + }, + ], }, "mpris": { "format": "{player_icon} {dynamic}", @@ -183,11 +156,11 @@ "ellipsis": "…", "player-icons": { "default": "▶", - "mpv": "🎵" + "mpv": "🎵", }, "status-icons": { - "paused": "⏸" - } + "paused": "⏸", + }, }, "bluetooth": { "format": " {status}", @@ -197,13 +170,14 @@ "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected", "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}", "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", - "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%" + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%", }, "custom/alhp": { + "id": "custom-alhp", "exec": "$HOME/.config/waybar/scripts/alhp.sh", - "format": "{} \uEB29 ", "return-type": "json", "interval": 60, - "tooltip": true - } + "tooltip": true, + "format": "{text}", + }, } diff --git a/.config/waybar/config.jsonc##hostname.cn-mate b/.config/waybar/config.jsonc##hostname.cn-mate index 0578cf7..99c6eca 100644 --- a/.config/waybar/config.jsonc##hostname.cn-mate +++ b/.config/waybar/config.jsonc##hostname.cn-mate @@ -191,10 +191,11 @@ "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%" }, "custom/alhp": { + "id": "custom-alhp", "exec": "$HOME/.config/waybar/scripts/alhp.sh", - "format": "{} \uEB29 ", "return-type": "json", "interval": 60, - "tooltip": true + "tooltip": true, + "format": "{text}", } } diff --git a/.config/waybar/scripts/alhp.sh b/.config/waybar/scripts/alhp.sh index 5f83b55..d48cab2 100755 --- a/.config/waybar/scripts/alhp.sh +++ b/.config/waybar/scripts/alhp.sh @@ -1,28 +1,41 @@ #!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' -# Retrieve JSON output from alhp.utils. -readonly ALHP_OUTPUT=$(alhp.utils -j) +ALHP_OUTPUT=$(alhp.utils -j) +total=$(jq -r '.total' <<<"$ALHP_OUTPUT") +mirror_stale=$(jq -r '.mirror_out_of_date' <<<"$ALHP_OUTPUT") -# Extract "total" as a string and read "packages" into a Bash array. -readonly total=$(echo "$ALHP_OUTPUT" | jq -r '.total | tostring') -readarray -t packages < <(echo "$ALHP_OUTPUT" | jq -r '.packages[]?') - -# Initialize default tooltip and class. -tooltip='' +# defaults +text="" +tooltip='All good' class='good' -# Use arithmetic evaluation to check if total is greater than 0. -if (( total > 0 )); then - class='bad' +# safe array even if packages is null +readarray -t packages < <( + jq -r '.packages // [] | .[]' <<<"$ALHP_OUTPUT" + ) + +# 1) Mirror stale? highest priority +if [[ "$mirror_stale" == "true" ]]; then + class="stale" + tooltip="Mirror is out of date" +# 2) Any pending PKGBUILDs? +elif (( total > 0 )); then + class="bad" + text="$tooltip" + tooltip=$(printf "%s\n" "${packages[@]}") fi -# If there are any packages, join them with newline as separator. -if (( ${#packages[@]} > 0 )); then - tooltip=$(IFS=$'\n'; echo "${packages[*]}") -else - tooltip="All good" -fi +case "$class" in + good) icon="";; + stale) icon="󰏖";; + bad) icon="󰏗";; +esac -# Generate compact JSON output (all in one line) with jq. -jq -nc --arg text "$total" --arg class "$class" --arg tooltip "$tooltip" \ - '{text: $text, class: $class, tooltip: $tooltip}' +# Emit compact JSON for Statusbar +jq -nc \ + --arg text "$icon $text" \ + --arg class "$class" \ + --arg tooltip "$tooltip" \ + '{text: $text, class: $class, tooltip: $tooltip}' diff --git a/.config/waybar/style.css##hostname.cn-arch b/.config/waybar/style.css##hostname.cn-arch index 338888a..f6904f8 100644 --- a/.config/waybar/style.css##hostname.cn-arch +++ b/.config/waybar/style.css##hostname.cn-arch @@ -1,9 +1,7 @@ - /*base background color*/ @define-color bg_main rgba(25, 25, 25, 0.65); @define-color bg_main_tooltip rgba(0, 0, 0, 0.7); - /*base background color of selections */ @define-color bg_hover rgba(200, 200, 200, 0.3); /*base background color of active elements */ @@ -18,132 +16,133 @@ @define-color content_inactive rgba(255, 255, 255, 0.25); * { - text-shadow: none; - box-shadow: none; - border: none; - border-radius: 0; - font-family: "Inconsolata Go Nerd Font"; - font-size: 14px; + text-shadow: none; + box-shadow: none; + border: none; + border-radius: 0; + font-family: "Inconsolata Go Nerd Font"; + font-size: 14px; } window#waybar { - background: @bg_main; - border-top: 1px solid @border_main; - color: @content_main; + background: @bg_main; + border-top: 1px solid @border_main; + color: @content_main; } tooltip { - font-size: 14px; - background: @bg_main_tooltip; - border-radius: 5px; - border-width: 1px; - border-style: solid; - border-color: @border_main; + font-size: 14px; + background: @bg_main_tooltip; + border-radius: 5px; + border-width: 1px; + border-style: solid; + border-color: @border_main; } -tooltip label{ - color: @content_main; +tooltip label { + color: @content_main; } .module { - margin-left: 2px; - margin-right: 2px; + margin-left: 2px; + margin-right: 2px; } #workspaces { - color: transparent; - margin-right: 1.5px; - margin-left: 1.5px; + color: transparent; + margin-right: 1.5px; + margin-left: 1.5px; } #workspaces button { - padding: 3px; - color: @content_inactive; + padding: 3px; + color: @content_inactive; } #workspaces button.active { - color: whitesmoke; - background: @bg_active; + color: whitesmoke; + background: @bg_active; } #workspaces button.focused { - color: @bg_active; + color: @bg_active; } #workspaces button.urgent { - background: rgba(255, 200, 0, 0.35); - color: @warning_color; + background: rgba(255, 200, 0, 0.35); + color: @warning_color; } #workspaces button:hover { - background: @bg_hover; - color: @content_main; + background: @bg_hover; + color: @content_main; } -#cpu, #disk, #memory { - border-bottom: 1px solid grey; - padding-right: 5px; - padding-left: 5px; +#cpu, +#disk, +#memory { + border-bottom: 1px solid grey; + padding-right: 5px; + padding-left: 5px; } -#tray{ - padding-left: 5px; - padding-right: 5px; +#tray { + padding-left: 5px; + padding-right: 5px; } #tray > .passive { - border-bottom: none; + border-bottom: none; } #tray > .active { - } #tray > .needs-attention { - border-bottom: 3px solid @warning_color; + border-bottom: 3px solid @warning_color; } #tray > widget { - transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); } #tray > widget:hover { - background: @bg_hover; + background: @bg_hover; } #pulseaudio { - border-bottom: 1px solid grey; - padding-right: 5px; - padding-left: 5px; - transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + border-bottom: 1px solid grey; + padding-right: 5px; + padding-left: 5px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); } #pulseaudio:hover { - background: @bg_hover; + background: @bg_hover; } #network { - border-bottom: 1px solid grey; - padding-right: 5px; - padding-left: 5px; + border-bottom: 1px solid grey; + padding-right: 5px; + padding-left: 5px; } #clock { - padding-right: 5px; - padding-left: 5px; - transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); + padding-right: 5px; + padding-left: 5px; + transition: all 0.25s cubic-bezier(0.165, 0.84, 0.44, 1); } #clock:hover { - background: @bg_hover; + background: @bg_hover; } #privacy { } #privacy-item { - padding-left: 5px; - padding-right: 5px; + padding-left: 5px; + padding-right: 5px; } #privacy-item.screenshare { - background: #850404; + background: #850404; } #privacy-item.audio-in { - background: #6c045e; + background: #6c045e; } #privacy-item.audio-out { - background: #02605b; + background: #02605b; } #mpris { - padding-left: 5px; - padding-right: 5px; + padding-left: 5px; + padding-right: 5px; } #mpris.playing { } @@ -152,33 +151,33 @@ tooltip label{ #mpris.stopped { } #mpris.firefox { - border-bottom: 1px solid #fd8728; + border-bottom: 1px solid #fd8728; } #mpris.spotify { - border-bottom: 1px solid #17d860; + border-bottom: 1px solid #17d860; } #mpris.mpv { - border-bottom: 1px solid #420042; + border-bottom: 1px solid #420042; } #mpris.chromium { - border-bottom: 1px solid #1a73e8; + border-bottom: 1px solid #1a73e8; } #bluetooth { - padding-right: 5px; - padding-left: 5px; + padding-right: 5px; + padding-left: 5px; } #bluetooth.disabled { - border-bottom: 1px solid grey; + border-bottom: 1px solid grey; } #bluetooth.off { - border-bottom: 1px solid grey; + border-bottom: 1px solid grey; } #bluetooth.on { - border-bottom: 1px solid #0059fd; + border-bottom: 1px solid #0059fd; } #bluetooth.connected { - border-bottom: 1px solid #00b7fa; + border-bottom: 1px solid #00b7fa; } #bluetooth.discoverable { } @@ -187,16 +186,19 @@ tooltip label{ #bluetooth.pairable { } #bluetooth.no-controller { - background: darkred; + background: darkred; } #custom-alhp { - padding-left: 5px; - padding-right: 5px; + padding-left: 5px; + padding-right: 5px; } #custom-alhp.good { - border-bottom: 1px solid greenyellow; + border-bottom: 1px solid greenyellow; +} +#custom-alhp.stale { + border-bottom: 1px solid yellow; } #custom-alhp.bad { - border-bottom: 1px solid orangered; + border-bottom: 1px solid orangered; } diff --git a/.config/waybar/style.css##hostname.cn-mate b/.config/waybar/style.css##hostname.cn-mate index 338888a..2a7f6ce 100644 --- a/.config/waybar/style.css##hostname.cn-mate +++ b/.config/waybar/style.css##hostname.cn-mate @@ -197,6 +197,9 @@ tooltip label{ #custom-alhp.good { border-bottom: 1px solid greenyellow; } +#custom-alhp.stale { + border-bottom: 1px solid yellow; +} #custom-alhp.bad { border-bottom: 1px solid orangered; }