From 4c8bdc323b72d5c83140b4fb9c0e5f0990da7fd3 Mon Sep 17 00:00:00 2001 From: fennek182 Date: Thu, 11 Jun 2026 19:09:42 +0200 Subject: [PATCH] added waybar config --- .config/waybar/config.jsonc | 333 ++++++++++++++ .config/waybar/img/start.png | Bin 0 -> 4486 bytes .config/waybar/scripts/battery-g502x.sh | 48 ++ .config/waybar/scripts/cpu.sh | 51 +++ .config/waybar/scripts/dunst.sh | 16 + .config/waybar/scripts/gpu.sh | 79 ++++ .config/waybar/scripts/gpu_nvidia.sh | 28 ++ .config/waybar/scripts/hyprland_clients.sh | 35 ++ .config/waybar/scripts/kraken.sh | 25 + .config/waybar/scripts/memory.sh | 19 + .config/waybar/scripts/ssd.sh | 8 + .config/waybar/scripts/waybar-media.py | 275 +++++++++++ .config/waybar/scripts/wlsunset.sh | 51 +++ .config/waybar/style.css | 508 +++++++++++++++++++++ 14 files changed, 1476 insertions(+) create mode 100644 .config/waybar/config.jsonc create mode 100644 .config/waybar/img/start.png create mode 100755 .config/waybar/scripts/battery-g502x.sh create mode 100755 .config/waybar/scripts/cpu.sh create mode 100755 .config/waybar/scripts/dunst.sh create mode 100755 .config/waybar/scripts/gpu.sh create mode 100755 .config/waybar/scripts/gpu_nvidia.sh create mode 100755 .config/waybar/scripts/hyprland_clients.sh create mode 100755 .config/waybar/scripts/kraken.sh create mode 100755 .config/waybar/scripts/memory.sh create mode 100755 .config/waybar/scripts/ssd.sh create mode 100755 .config/waybar/scripts/waybar-media.py create mode 100755 .config/waybar/scripts/wlsunset.sh create mode 100644 .config/waybar/style.css diff --git a/.config/waybar/config.jsonc b/.config/waybar/config.jsonc new file mode 100644 index 0000000..e72a81f --- /dev/null +++ b/.config/waybar/config.jsonc @@ -0,0 +1,333 @@ +{ + "height": 38, + "layer": "top", + "spacing": 4, + "modules-left": [ + "custom/start_button", + "custom/hyprexpo_toggle", + "tray", + "custom/separator", + "hyprland/workspaces", + "custom/separator", + "wlr/taskbar", + ], + // "modules-center": [ "custom/waybar-mpris"], + "modules-center": ["mpris"], + "modules-right": [ + "custom/cpu-info", + "custom/kraken", + "custom/memory-info", + "custom/gpu-info", + "custom/battery_g502", + //"custom/wlsunset", "idle_inhibitor", "custom/brightness", + "wireplumber", + "custom/mount", + "custom/kde-connect", + // "network", + "custom/bluetooth", + "custom/cast", + "custom/server", + "custom/sync", + "custom/dunst", + "clock#date", + "clock#clock", + ], + "hyprland/workspaces": { + "on-click": "activate", + "on-scroll-up": "hyprctl dispatch workspace e+1", + "on-scroll-down": "hyprctl dispatch workspace e-1", + "format": "{name}", + "all-outputs": true, + // "move-to-monitor": true, + }, + "custom/start_button": { + "format": " ", + "tooltip-format": "", + "interval": 3600, + "on-click": "hyprctl dispatch exec ~/.config/rofi/bin/menu_powermenu", + }, + "custom/hyprexpo_toggle": { + "format": " 󱗼 ", + "tooltip-format": "", + "interval": 3600, + "on-click": "hyprctl dispatch exec ~/.config/rofi/bin/menu_powermenu", + }, + "custom/separator": { + "format": "|", + "interval": 9600, + }, + "custom/usage-toggle": { + "format": " {}", + "tooltip-format": "mehr System-Infos anzeigen", + "interval": 6600, + "on-click": "dunstify 'Umschalten der Telemetrie Info'", + }, + "custom/battery-g502": { + "format": "{}", + "tooltip-format": "mehr System-Infos anzeigen", + "interval": 600, + "on-click": "solaar", + "exec": "$HOME/.config/waybar/scripts/battery-g502x.sh", + }, + "custom/server": { + "format": "{}", + "tooltip-format": "dunstify 'Server Control", + "interval": 6600, + "on-click": "dunstify 'Server Control'", + }, + "custom/tray": { + "format": " 󱕷 {}", + "tooltip-format": "Tray anzeigen", + "interval": 6600, + "on-click": "dunstify 'Tray anzeigen'", + }, + "custom/cast": { + "format": "󰞊{}", + "tooltip-format": "Remote", + "interval": 6600, + "on-click": "dunstify 'Remote'", + }, + "hyprland/window": { + "max-length": 54, // char count, doesn't seem to work - https://github.com/Alexays/Waybar/issues/2898 + "on-click": "dunstify \"$(hyprctl activewindow -j | jq -r .title)\"", + "on-click-middle": "hyprctl dispatch killactive", + }, + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "", + }, + }, + "wlr/taskbar": { + "format": "{icon}", + "icon-size": 24, + "tooltip-format": "{title}", + "on-click": "activate", + "on-click-middle": "close", + "active-first": "true", + // "sort-by-app-id": true + // "ignore-list": [ "Alacritty" //], + // "app_ids-mapping": { + // // "firefoxdeveloperedition": "firefox-developer-edition" + // } + // "icon-theme": "Numix-Circle", + }, + "sway/mode": { + "format": "{}", + }, + "sway/scratchpad": { + "format": "{icon} {count}", + "show-empty": false, + "format-icons": ["", ""], + "tooltip": true, + "tooltip-format": "{app}: {title}", + }, + "custom/cpu-info": { + "format": "{}", + // "format": "{}", + "interval": 5, + "exec": "$HOME/.config/waybar/scripts/cpu.sh", + "on-click": "alacritty --class floating -e btop", + // "on-click-middle": "corectrl" + "on-click-middle": "~/.local/bin/poweroptions_rofi", + }, + "custom/kraken": { + "format": "{}", + // "format": "# 󰏈 {}", + "interval": 5, + "exec": "$HOME/.config/waybar/scripts/kraken.sh", + }, + "custom/memory-info": { + "format": "󰆼 {}", + "on-click": "flatpak run io.missioncenter.MissionCenter", + "interval": 5, + "exec": "$HOME/.config/waybar/scripts/memory.sh", + }, + "custom/gpu-info": { + "format": "{}", + "interval": 5, + "exec": "$HOME/.config/waybar/scripts/gpu.sh", + "on-click-middle": "corectrl", + }, + "custom/bluetooth": { + // "icon-size": 21, + "spacing": 10, + "format": "  ", + "format": "", + "on-click": "blueman-manager", + "tooltip-format": "hier könnte ihre Werbung stehen.", + }, + "custom/kde-connect": { + // "icon-size": 21, + "spacing": 10, + "format": "  ", + "format": "", + "on-click": "dunstify 'für nur 420,69€ im Monat!'", + "tooltip-format": "hier könnte ihre Werbung stehen.", + }, + "custom/mount": { + // "icon-size": 21, + "spacing": 10, + "format": " ", + "format": " 󱇰 ", + "on-click": "dunstify 'für nur 420,69€ im Monat!'", + "tooltip-format": "hier könnte ihre Werbung stehen.", + }, + "custom/sync": { + "spacing": 10, + "format": " 󰅟 ", + "format": "󰅟", + "on-click": "dunstify 'für nur 420,69€ im Monat!'", + "tooltip-format": "hier könnte ihre Werbung stehen.", + }, + "tray": { + // "icon-size": 21, + "spacing": 10, + }, + "clock#date": { + "timezone": "Europe/Berlin", + "locale": "en_GB.UTF-8", + // "locale": "de_DE.UTF-8", + "tooltip-format": "{:L%A %d.%m.%Y\nKW %V}\n{calendar}", + "format": "󰸘 KW {:L%V %a %d.%m.%y}", + "on-click": "flatpak run org.gnome.Calendar", + }, + "clock#clock": { + "timezone": "Europe/Berlin", + "locale": "de_DE.UTF-8", + "tooltip-format": "{:L%A %d.%m.%Y\nKW %V}\n{calendar}", + "format": " {:L%H:%M}", + "on-click": "flatpak run org.gnome.clocks", + }, + "backlight": { + // "device": "acpi_video1", + "format": "{icon} {percent}%", + "format-icons": ["", "", "", "", "", "", "", "", ""], + }, + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15, + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + // "format-plugged": " {capacity}%", + "format-plugged": " {capacity}%", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""], + }, + "battery#bat2": { + "bat": "BAT2", + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + // "format-linked": "", + // "format-ethernet": "  󰈀 󰈁  󰌘 󰤯 󰤟 󰤢 󰤥 󰤨  󰌆 󰖂 ", + // "format-ethernet": "󰌆 󰈀", + "format-ethernet": "󰈀", + // https://github.com/Alexays/Waybar/wiki/Module:-Custom + // "format-ethernet": "{ipaddr}/{cidr} ", + // "format-ethernet": "{ifname} ", + // "tooltip-format": "{ifname} via {gwaddr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + // "format": "  󰈀 󰈁   󰌘 󰤯 󰤟 󰤢 󰤥 󰤨  󰌆 󰖂", + // "format": "  󰈀 󰈁   󰌘 󰤯 󰤟 󰤢 󰤥 󰤨  󰌆 󰖂", + // "format-linked": "{ifname}: {ipaddr}/{cidr}%", + // "format": " ", + // "format-linked": "{ifname} (No IP)    ", + // "format-linked": "{ifname} (No IP)    ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}", + }, + "wireplumber": { + "scroll-step": 1, // %, can be a float + // "format": "{icon} {volume}% {format_source}", + "format": "{icon} {volume}% {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-muted": " stumm", + "format-source": " ", + // "format-source-muted": "", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""], + }, + "on-click": "pavucontrol", + }, + "custom/brightness": { + "exec": "$HOME/.local/bin/monitor --get_brightness_with_icon", + // "exec-if": "sleep 1", // Give enough time for `sway output` command changes to propagate so we can read them in the next `exec` + "format": "{}%", + "interval": "once", + "signal": 1, + "on-click": "dunstify 'hier könnte mal was sein...'", + // "on-scroll-up": "$HOME/.local/bin/monitor --brighter", + // "on-scroll-down": "$HOME/.local/bin/monitor --dimmer" + }, + "custom/dunst": { + "format": "{}", + "exec": "~/.config/waybar/scripts/dunst.sh", + "on-click": "dunstctl set-paused toggle", + "on-click-middle": "dunstctl history-pop", + // "restart-interval": 1 + "interval": 1, + "signal": 2, + }, + "custom/wlsunset": { + "exec": "~/.config/waybar/scripts/wlsunset.sh", + "on-click": "~/.local/bin/blue_light_filter --toggle", + "restart-interval": 3, + "interval": 300, + "signal": 3, + }, + "custom/waybar-mpris": { + "return-type": "json", + "exec": "waybar-mpris --position --autofocus", + "on-click": "waybar-mpris --send toggle", + "on-click-right": "waybar-mpris --send player-next", // switch between players on right click + "on-click-middle": "waybar-mpris --send prev", + "on-scroll-up": "waybar-mpris --send player-next", // switch the selected player on scroll + "on-scroll-down": "waybar-mpris --send player-prev", // switch the selected player on scroll + // "on-scroll-up": "waybar-mpris --send next", // go to next/previous track on scroll + // "on-scroll-down": "waybar-mpris --send prev", // go to next/previous track on scrol + "escape": true, + }, + "mpris": { + "format": "{player_icon} {dynamic}", + "format-paused": "{status_icon} {dynamic}", + "interval": 1, + "dynmic-importance-order": [ + "title", + "artist", + "position", + "length", + "album", + ], + "max-length": 128, + "title-len": 42, + "album-len": 32, + "artist-len": 36, + "player-icons": { + "default": "▶", + "mpv": "🎵", + }, + "status-icons": { + "paused": "⏸", + }, + // "ignored-players": ["firefox"] + }, +} diff --git a/.config/waybar/img/start.png b/.config/waybar/img/start.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc63f66c8327178425c600501bc7a1b1ccb7a2f GIT binary patch literal 4486 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 z 7 { s += $9 } END { print int(s / n + .5); }') + + +## echo "CPU $usage% CORE $temp_cpu LIQUID $temp_liquid FAN $rpm_fan PUMP $rpm_pump $clock Mhz $power_package" +## echo "CPU $usage% $temp_cpu $clock $power_package" +#[[ "$temp_cpu" -gt 50 || %usage -gt 33 ]] && echo "$usage% $power_package" || && exit + +#echo "$usage% $temp_cpu°C $clock_ghz $power_package" + +## diff --git a/.config/waybar/scripts/cpu.sh b/.config/waybar/scripts/cpu.sh new file mode 100755 index 0000000..ffb2e60 --- /dev/null +++ b/.config/waybar/scripts/cpu.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +round() { + printf "%.${2:-0}f" "$1" +} + +temp_cpu=$(echo "$(sensors | grep Tctl | awk '{print $2}' | cut -c 2-3)") +# temp_liquid=$(echo "$(liquidctl status | grep 'Liquid' | awk '{print $4}')°C") +# rpm_fan=$(echo "$(liquidctl status | grep 'Fan' | awk '{print $4}')RPM") +# rpm_pump=$(echo "$(liquidctl status | grep 'Pump' | awk '{print $4}')RPM") +power_core=$(echo "$(sensors | grep SVI2_P_Core | awk '{print $2}')") +power_soc=$(echo "$(sensors | grep SVI2_P_SoC | awk '{print $2}')") +power_package=$(echo "$power_core + $power_soc" | bc) +power_package="$(round $power_package 0)W" +#usage=$(echo "$(grep 'cpu ' /proc/stat | awk '{cpu_usage=($2+$4)*100/($2+$4+$5)} END {printf "%0.2f%", cpu_usage}')") + +temp_liquid=$(echo "$(sensors | grep 'Coolant' | awk '{print $2}' | cut -c 2-)") +temp_liquid=$(round $temp_liquid 0) + +rpm_fan=$(echo "$(sensors | grep 'Fan' | awk '{print $2}')RPM") +# rpm_fan=$(echo "$(liquidctl status | grep 'Fan' | awk '{print $4}')RPM") +rpm_pump=$(echo "$(sensors | grep 'Pump' | awk '{print $2}')RPM") + +#deprecated: +#clock=$(lscpu | grep 'CPU MHz' | awk '{ print $3 }' | head -c4) + +# clock=$(echo "$(cat /proc/cpuinfo | grep MHz | sort -r | head -n1 | awk '{ print $4 }' | cut -c-4)"Mhz) +clock=$(cat /proc/cpuinfo | grep MHz | sort -r | head -n1 | awk '{ print $4 }' | cut -c-4) + +#divide clock in Mhz by 1000 for Ghz +# clock_ghz=$( echo "scale=1; $clock/1000" | bc -l ) +clock_ghz="$( echo "scale=1; $clock/1000" | bc -l | sed 's/\./,/g' )GHz" + +# Get number of cores +CORECOUNT=$(grep -c ^processor /proc/cpuinfo) +# Use top, skip the first 7 rows, count the sum of the values +# in column 9 - the CPU column, do some simple rounding at the end +usage=$(top -bn 1 | awk -v n=$CORECOUNT 'NR > 7 { s += $9 } END { print int(s / n + .5); }') + + +# echo "CPU $usage% CORE $temp_cpu LIQUID $temp_liquid FAN $rpm_fan PUMP $rpm_pump $clock Mhz $power_package" +# echo "CPU $usage% $temp_cpu $clock $power_package" +# [[ "$temp_cpu" -gt 50 || %usage -gt 33 ]] && echo "$usage% $power_package" && exit +# [[ "$temp_cpu" -gt 50 || %usage -gt 33 ]] && echo "$usage% $power_package" || && exit + +# [[ "$temp_liquid" -gt 35 ]] && echo "$usage% $temp_cpu°C  $temp_liquid°C $power_package" && exit || echo "$usage% $temp_cpu°C $power_package" + +[[ "$temp_liquid" -gt 38 ]] && echo "$usage% $temp_cpu°C  $temp_liquid°C $power_package" && exit || echo "$usage% $power_package" +echo "$usage% $temp_cpu°C  $temp_liquid°C 󰈐 $rpm_fan $clock_ghz $power_package" + +# diff --git a/.config/waybar/scripts/dunst.sh b/.config/waybar/scripts/dunst.sh new file mode 100755 index 0000000..51c19e3 --- /dev/null +++ b/.config/waybar/scripts/dunst.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# curtesy of: +#https://github.com/Alexays/Waybar/wiki/Module:-Custom + +COUNT=$(dunstctl count waiting) +ENABLED="" +DISABLED="" +if [ $COUNT != 0 ]; then DISABLED=" $COUNT"; fi +if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED"; else echo "$DISABLED"; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED  "; else echo "$DISABLED  "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED    "; else echo "$DISABLED   "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED   |  "; else echo "$DISABLED   "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED   |   "; else echo "$DISABLED   "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED      X "; else echo "$DISABLED   "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED       "; else echo "$DISABLED   "; fi +# if dunstctl is-paused | grep -q "false" ; then echo "$ENABLED        "; else echo "$DISABLED   "; fi diff --git a/.config/waybar/scripts/gpu.sh b/.config/waybar/scripts/gpu.sh new file mode 100755 index 0000000..18ba2f6 --- /dev/null +++ b/.config/waybar/scripts/gpu.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# version 2 +# written by fennek182 +# for personal use +# waybar module to display gpu usage - for all gpus using mesa (intel) + + +round() { + number="$(echo $1 | sed 's/\./,/')" + printf "%.${2:-0}f" "$number" +} + +gpu_usage=$(cat /sys/class/drm/card1/device/gpu_busy_percent) +gpu_temp_core=$(sensors | grep "edge" | awk '{ print $2 }' | cut -c 2-3) #edge temp, there's also junction and mem +gpu_temp_hotspot=$(sensors | grep "junction" | awk '{ print $2 }' | cut -c 2-3) #edge temp, there's also junction and mem +gpu_temp_mem=$(sensors | grep "mem" | awk '{ print $2 }' | cut -c 2-3) #edge temp, there's also junction and mem +gpu_clock=$(cat /sys/class/drm/card1/device/pp_dpm_sclk | grep "*" | awk '{ print $2 }') +gpu_power=$(sensors | grep "PPT" | awk '{ print $2 }') +gpu_power=$(echo "${gpu_power%%.*}") +# gpu_power=$(sensors | grep "PPT" | awk '{ print $2 }' | head -c2) +fan_current_rpm=$(sensors | grep "fan1" | awk '{ print $2 }') +fan_max_rpm=$(sensors | grep "fan1" | awk '{ print $10 }') +fan_duty=$(echo "$(awk "BEGIN { print "$fan_current_rpm/$fan_max_rpm*100" }" | head -c2 )") +# vram_size=$(nvidia-smi -q | grep 'Total' | head -n1 | awk '{print int($3/1000)}') +vram_size=20 +vram_used=$(cat /sys/class/drm/card1/device/mem_info_vram_used) +# vram_used=$(echo $vram_used | sed 's/G//') + +vram_used_percentage=$(echo "$(awk "BEGIN { print "$vram_used/21474836480*100" }" | cut -c1-4 )") +vram_used_percentage=$(round $vram_used_percentage 0) + +# todo: use MB and TB insted of MiB and GiB and hide the G if it's >= 1 GB + +# auto format to human readable file size unit +vram_used=$(printf %s\\n $vram_used | numfmt --to=si | sed 's/G*//g') +# vram_used=$(printf %s\\n $vram_used | numfmt --to=iec-i | sed 's/.$//') + +# make usage human readable +# vram_used_mib=$(echo "$(awk "BEGIN { print "$vram_used/1024/1024" }" | head -c4)") + +# when the usage in MiB is greater than 999MBiB, so over 1G +# if [ ${#vram_used/1024/1024} -gt 1000 ]; then +# vram_used=$(echo "$(awk "BEGIN { print "$vram_used/1024/1024/1024" }")G") +# else +# vram_used=$(echo "$(awk "BEGIN { print "$vram_used/1024/1024" }" | head -c3 )M") +# fi + + +#echo "GPU "$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used" / "$vram_size"G + + +# hide core clock and vram usage if gpu usage is below 50% +# [[ $fan_duty == "0" ]] && echo ""$gpu_usage"% $gpu_temp_core°C "$gpu_power"W 󰈐 "$fan_duty"%" + +# [[ $gpu_usage -lt 51 ]] && echo "$usage% $power_package" +# [[ $gpu_usage -lt "51" ]] && echo ""$gpu_usage"% $gpu_temp_core°C "$gpu_power"W" + +# when called from terminal, show the info and exit +# TODO: make this properly check if run from terminal + +[[ "$1" == "-a" ]] && echo ""$gpu_usage"% C: $gpu_temp_core°C H: $gpu_temp_hotspot°C M: $gpu_temp_mem°C "$gpu_clock" "$gpu_power"W 󰈐 "$fan_duty"% "$fan_current_rpm"RPM 󰆼 "$vram_used_percentage"% $vram_used"/"$vram_size"GB && exit + +[[ $gpu_temp_core -lt "65" ]] && [[ $gpu_usage -lt "51" ]] && echo ""$gpu_usage"% "$gpu_power"W" +[[ $gpu_temp_core -gt "66" ]] && echo ""$gpu_usage"% $gpu_temp_core °C "$gpu_power"W" + +# [[ $gpu_usage -lt "51" ]] && echo ""$gpu_usage"% $gpu_temp_core°C "$gpu_power"W" +# [[ $gpu_usage -lt "50" ]] && echo ""$gpu_usage"% $gpu_temp°C "$gpu_power"W 󰈐 "$fan_duty"%" +# [[ $gpu_usage -lt "50" ]] && echo ""$gpu_usage"% $gpu_temp°C "$gpu_power"W 󰈐 "$fan_duty"% "$fan_current_rpm"RPM" + +# echo "GPU "$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used"/"$vram_size"G +# echo ""$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used"/"$vram_size"G +# echo ""$gpu_usage"% $gpu_temp_core°C "$gpu_clock" "$gpu_power"W 󰈐 "$fan_duty"% "$fan_current_rpm"RPM 󰆼 "$vram_used_percentage"% $vram_used"/"$vram_size"G + +# older output with more withspace for the temps - used until 2026-05-04: +# echo ""$gpu_usage"% C: $gpu_temp_core°C H: $gpu_temp_hotspot°C M: $gpu_temp_mem°C "$gpu_clock" "$gpu_power"W 󰈐 "$fan_duty"% "$fan_current_rpm"RPM 󰆼 "$vram_used_percentage"% $vram_used"/"$vram_size"GB +echo ""$gpu_usage"% C/H/M: $gpu_temp_core/$gpu_temp_hotspot/$gpu_temp_mem°C "$gpu_clock" "$gpu_power"W 󰈐 "$fan_duty"% "$fan_current_rpm"RPM 󰆼 "$vram_used_percentage"% $vram_used"GB + +# diff --git a/.config/waybar/scripts/gpu_nvidia.sh b/.config/waybar/scripts/gpu_nvidia.sh new file mode 100755 index 0000000..13ee0f0 --- /dev/null +++ b/.config/waybar/scripts/gpu_nvidia.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +gpu_usage=$(nvidia-smi -q | grep 'Gpu' | awk '{ print $3 }') +gpu_temp=$(nvidia-smi -q | grep 'GPU Current Temp' | awk '{ print $5 }') +gpu_clock=$(nvidia-smi -q | grep 'Graphics' | head -n1 | awk '{ print $3 }') +gpu_power=$(nvidia-smi -q | grep 'Power Draw' | awk '{ print $4 }' | awk -F. '{ print $1 }') +fan_duty=$(nvidia-smi -q | grep 'Fan Speed' | awk '{ print $4 }') + +vram_used=$(nvidia-smi -q | grep 'Used' | head -n1 | awk '{print $3}' | head -c4 | sed -r 's/[.]+/,/g') + +# make usage human readable +# when the usage in MiB is greater than 3 charaters, so over 1G +if [ ${#vram_used} -gt 3 ]; then + vram_used=$(echo "$(awk "BEGIN { print "$vram_used/1024" }" | head -c4)G") + else + vram_used=$(echo "$vram_used"M) +fi + +vram_used_percentage=$(nvidia-smi -q | grep 'Memory' | sed '3q;d' | awk '{print $3}') +vram_size=$(nvidia-smi -q | grep 'Total' | head -n1 | awk '{print int($3/1000)}') + +#echo "GPU "$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used" / "$vram_size"G + +# echo "GPU "$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used"/"$vram_size"G +# echo ""$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W FAN "$fan_duty"% VRAM "$vram_used_percentage"% $vram_used"/"$vram_size"G +echo ""$gpu_usage"% $gpu_temp°C "$gpu_clock"MHz "$gpu_power"W 󰈐 "$fan_duty"% 󰆼 "$vram_used_percentage"% $vram_used"/"$vram_size"G + +# diff --git a/.config/waybar/scripts/hyprland_clients.sh b/.config/waybar/scripts/hyprland_clients.sh new file mode 100755 index 0000000..2448f0a --- /dev/null +++ b/.config/waybar/scripts/hyprland_clients.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +: "${XDG_RUNTIME_DIR:?Environment variable XDG_RUNTIME_DIR not set}" +: "${HYPRLAND_INSTANCE_SIGNATURE:?Environment variable HYPRLAND_INSTANCE_SIGNATURE not set}" + +handle() { + case "$1" in + workspace* | focusedmon* | openwindow* | closewindow* | movewindow* | activewindow*) + update_active_clients + ;; + esac +} + +update_active_clients() { + # active_clients=$(hyprctl activeworkspace -j | jq -r .windows) + # echo "$active_clients" + clients=$(hyprctl clients -j | grep address | awk '{print $2}' | sed "s/\"//"| cut -c -14) + active_window=$(hyprctl -j activewindow | jq -r '.address') + + + while IFS= read -r line; do + hyprctl dispatch setprop address:$line bordersize 1 + done <<< "$clients" + + # echo $active_window + hyprctl dispatch setprop address:$active_window bordersize 2 +} + +# Initial update +update_active_clients + +# Listen to events and handle them +socat -U - UNIX-CONNECT:"$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while IFS= read -r line; do + handle "$line" +done diff --git a/.config/waybar/scripts/kraken.sh b/.config/waybar/scripts/kraken.sh new file mode 100755 index 0000000..27078e6 --- /dev/null +++ b/.config/waybar/scripts/kraken.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +round() { + printf "%.${2:-0}f" "$1" +} + +temp_liquid=$(echo "$(sensors | grep 'Coolant' | awk '{print $2}' | cut -c 2-)") +temp_liquid=$(round $temp_liquid 0)°C + +# temp_liquid=$(echo "$(liquidctl status | grep 'Liquid' | awk '{print $4}')°C") + +rpm_fan=$(echo "$(sensors | grep 'Fan' | awk '{print $2}')RPM") +# rpm_fan=$(echo "$(liquidctl status | grep 'Fan' | awk '{print $4}')RPM") +rpm_pump=$(echo "$(sensors | grep 'Pump' | awk '{print $2}')RPM") +# rpm_pump=$(echo "$(liquidctl status | grep 'Pump' | awk '{print $4}')RPM") + +# echo "LIQUID $temp_liquid FAN $rpm_fan PUMP $rpm_pump" +# echo "KRAKEN $temp_liquid FAN $rpm_fan PUMP $rpm_pump" +# echo "$temp_liquid 󰈐 $rpm_fan 󱐂 $rpm_pump" + +[[ "$rpm_fan" =~ ^4* || "$rpm_fan" =~ ^5* ]] && echo "" && exit + +echo "$temp_liquid 󰈐 $rpm_fan" + +# diff --git a/.config/waybar/scripts/memory.sh b/.config/waybar/scripts/memory.sh new file mode 100755 index 0000000..bfd67e6 --- /dev/null +++ b/.config/waybar/scripts/memory.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +usage=$(echo "$(free -h --si | awk '/^Speicher:/ {print $3 "/" $2}')" | sed 's/G//')GB +usage_short=$(echo "$(free -h --si | awk '/^Speicher:/ {print $3}')" | sed 's/G//')GB +# usage=$(echo "$(free -h --si | awk '/^Speicher:/ {print $3 "/" $2}')") + +percentage=$(echo "$(free --si | awk '/^Speicher:/ {print int($3/$2 * 100.0)}')%") +# echo "RAM $percentage $usage" + +# [[ "$percentage" -lt 33 || "$temp_cpu" =~ ^4* || $usage -lt 33 ]] && exit + +# echo "$percentage $usage_short" + +echo "$percentage" +echo "$percentage $usage" +#[[ "$temp_cpu" =~ ^3* || "$temp_cpu" =~ ^4* ]] && echo "$usage% $power_package" + + +# diff --git a/.config/waybar/scripts/ssd.sh b/.config/waybar/scripts/ssd.sh new file mode 100755 index 0000000..c254884 --- /dev/null +++ b/.config/waybar/scripts/ssd.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +root=$(df -h / | grep '/dev/nvme0' | awk '{ print $4 }') +root_percentage=$(df -h / | grep '/dev/nvme0' | awk '{ print $5 }') +data=$(df -h /mnt/data | grep '/dev/nvme1' | awk '{ print $4 }') +data_percentage=$(df -h /mnt/data | grep '/dev/nvme1' | awk '{ print $5 }') + +echo "ROOT $root_percentage $root DATA $data_percentage $data" diff --git a/.config/waybar/scripts/waybar-media.py b/.config/waybar/scripts/waybar-media.py new file mode 100755 index 0000000..824e30a --- /dev/null +++ b/.config/waybar/scripts/waybar-media.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python3 + +import json +import math +import os +import sys +import textwrap +import traceback + +import psutil +from gi.repository import GLib +from pydbus import SessionBus + +MPRIS_PLAYER_OBJ_PATH = '/org/mpris/MediaPlayer2' +MPRIS_PLAYER_IFACE = 'org.mpris.MediaPlayer2.Player' +KNOWN_SERVICES = [ + 'org.mpris.MediaPlayer2.mpv', + 'org.kde.plasma.browser_integration' +] +KNOWN_BROWSER_MAP = { + 'mozilla': 'Firefox', + 'chromium': 'Chromium', + 'chrome': 'Google Chrome' +} + + +class Player: + def __init__(self, bus, owner_name): + self._bus = bus + self.owner_name = owner_name + self.owner_process = self._get_owner_process() + self._obj = self._bus.get(owner_name, MPRIS_PLAYER_OBJ_PATH) + + def _get_owner_process(self): + obj = self._bus.get('org.freedesktop.DBus', '/org/freedesktop/DBus') + pid = obj.GetConnectionUnixProcessID(self.owner_name) + if pid is None: + return None + + return psutil.Process(pid) + + @staticmethod + def _identify_browser_by_cmdline(cmdline): + for fragment, browser in KNOWN_BROWSER_MAP.items(): + if fragment in cmdline: + return browser + return None + + @property + def name(self): + name = self.owner_process.name() + if name == 'plasma-browser-integration-host': + cmdline = ' '.join(self.owner_process.cmdline()) + return self._identify_browser_by_cmdline(cmdline) + return name + + @property + def status(self): + return self._obj.PlaybackStatus.lower() + + @property + def title(self): + return self._obj.Metadata.get('xesam:title') + + @property + def album(self): + return self._obj.Metadata.get('xesam:album') + + @property + def artist(self): + artists = self._obj.Metadata.get('xesam:artist') + return ', '.join(artists) if isinstance(artists, list) else artists + + def playpause(self): + if self._obj.CanPlay or self._obj.CanPause: + self._obj.PlayPause() + + def play(self): + if self._obj.CanPlay: + self._obj.Play() + + def pause(self): + if self._obj.CanPause: + self._obj.Pause() + + def previous(self): + if self._obj.CanGoPrevious: + self._obj.Previous() + + def next(self): + if self._obj.CanGoNext: + self._obj.Next() + + +class MediaWatcher: + def __init__(self, bus, do_print_status=False): + self._bus = bus + + self._owner_to_player = self._find_players() + self.player = self._find_active_player() + + if do_print_status: + self.status_builder = MediaWatcherStatusBuilder(self) + self.status_builder.print_status() + else: + self.status_builder = None + + def __enter__(self): + self._subscription = self._bus.subscribe( + iface='org.freedesktop.DBus.Properties', + signal='PropertiesChanged', + object=MPRIS_PLAYER_OBJ_PATH, + arg0=MPRIS_PLAYER_IFACE, + signal_fired=self._mpris_signal_handler, + ) + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_type is not None: + traceback.print_exception(exc_type, exc_value, tb) + self._subscription.unsubscribe() + + def _find_players(self): + owner_to_player = {} + for service in KNOWN_SERVICES: + try: + owner_name = self._bus.dbus.GetNameOwner(service) + except GLib.Error: + continue + owner_to_player[owner_name] = Player(bus=self._bus, owner_name=owner_name) + return owner_to_player + + def _group_players_by_status(self): + status_to_players = {} + for player in self._owner_to_player.values(): + if player.status in status_to_players: + status_to_players[player.status].append(player) + else: + status_to_players[player.status] = [player] + return status_to_players + + def _find_active_player(self): + players_by_status = self._group_players_by_status() + + if players_by_status.get('playing'): + players_by_status['playing'].sort(key=lambda x: x.owner_process.create_time(), reverse=True) + return players_by_status['playing'][0] + elif players_by_status.get('paused'): + return players_by_status['paused'][0] + elif players_by_status.get('stopped'): + return players_by_status['stopped'][0] + + return None + + def _mpris_signal_handler(self, sender_name, *_): + if sender_name not in self._owner_to_player: + self._owner_to_player[sender_name] = Player(bus=self._bus, owner_name=sender_name) + + self.player = self._find_active_player() + + if self.status_builder: + self.status_builder.print_status() + + +class MediaWatcherStatusBuilder: + def __init__(self, watcher): + self.watcher = watcher + + def _build_tooltip(self): + tooltip = [] + player = self.watcher.player + + if player.status in ['playing', 'paused']: + tooltip.append(player.status.title() + ':') + if player.title: + tooltip.append(player.title) + if player.album: + tooltip.append(player.album) + if player.artist: + tooltip.append(player.artist) + if player.name: + tooltip.append('(' + player.name + ')') + + return '\n'.join(tooltip) if tooltip else None + + def _build_text(self, max_width, title_to_artist_ratio=2 / 3, separator=' - ', placeholder='…'): + max_width = max_width - len(separator) + player = self.watcher.player + + if player.title and player.artist: + title_width = math.floor(max_width * title_to_artist_ratio) + artist_width = max_width - title_width + elif player.title and not player.artist: + title_width = max_width + artist_width = 0 + elif player.artist and not player.title: + title_width = 0 + artist_width = max_width + else: + return None + + short_title = ( + None if title_width == 0 else textwrap.shorten(player.title, width=title_width, placeholder=placeholder) + ) + short_artist = ( + None if artist_width == 0 else textwrap.shorten(player.artist, width=artist_width, placeholder=placeholder) + ) + + if short_title and short_artist: + return separator.join((short_title, short_artist)) + elif short_title and not short_artist: + return short_title + elif short_artist and not short_title: + return short_artist + + def _build_classes(self): + classes = [] + player = self.watcher.player + + if player.status in ['playing', 'paused']: + classes.append(player.status) + else: + classes.append('stopped') + + return classes + + def build_status(self): + return json.dumps( + {'tooltip': self._build_tooltip(), 'text': self._build_text(max_width=80), 'class': self._build_classes()} + ) + + def print_status(self): + print(self.build_status()) + sys.stdout.flush() + + +def print_usage(): + name = os.path.basename(sys.argv[0]) + print('Usage:\n\t{} (status|playpause|previous|next)\n'.format(name)) + + +def main(): + bus = SessionBus() + loop = GLib.MainLoop() + + if len(sys.argv) == 2: + arg = sys.argv[1] + else: + print_usage() + return + + with MediaWatcher(bus, do_print_status=(arg == 'status')) as media_watcher: + if arg == 'status': + while True: + try: + loop.run() + except GLib.Error: + pass + elif arg == 'playpause': + media_watcher.player.playpause() + elif arg == 'play': + media_watcher.player.play() + elif arg == 'pause': + media_watcher.player.pause() + elif arg == 'previous': + media_watcher.player.previous() + elif arg == 'next': + media_watcher.player.next() + else: + print_usage() + return + + +if __name__ == '__main__': + main() diff --git a/.config/waybar/scripts/wlsunset.sh b/.config/waybar/scripts/wlsunset.sh new file mode 100755 index 0000000..47c48de --- /dev/null +++ b/.config/waybar/scripts/wlsunset.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +sunrise=$(wlsunset_info --sunrise) +sunset=$(wlsunset_info --sunset) + +# sleep .1 + +if pgrep -x "wlsunset" > /dev/null +then + state="an" +else + state="aus" +fi + +# check if temperature is set, so blue light filter is active +# if there's a line in the logs, than it's active +# example line: +# setting temperature on output '49' to 4771 K + +[[ $sunrise == "" ]] && echo "󰹏" && echo "6500K" && exit +[[ $state == "aus" ]] && echo "󰹏" && echo "$sunrise - $sunset - 6500K" && exit + + +# todo: if temperature is below 6500K + + +[[ $state == "an" ]] && \ + temperature=$(cat /tmp/wlsunset.log | awk '/temperature/ {print $4}' | tail -n1) && \ + [[ $temperature == "" ]] && echo "󱩌" && exit || echo "󰤄" && echo "$sunrise - $sunset - $temperature"K # echo "󱩌 󰹏 󰤄  󱩍 󰹐" + + +# 󱩌 +# 󱩌 +# 󰹏 +# 󱩍 +#  +# ⏾ +# 󰤄 +#  +#  +#  +# 󰛨 +# 󱩎 +# 󱩏 +# 󱩐 +# 󱩑 +# 󱩒 +# 󱩔 +# 󱩕 +# 󱩖 +# 󰛩 diff --git a/.config/waybar/style.css b/.config/waybar/style.css new file mode 100644 index 0000000..0c9b473 --- /dev/null +++ b/.config/waybar/style.css @@ -0,0 +1,508 @@ +/* + * written by fennek182 + * version 1 + * last change: Fr 2025-11-11 +*/ + +* { + font-family: + Symbols Nerd Font, + Roboto; + font-size: 16px; + font-weight: 600; +} + +window#waybar { + background-color: rgba(30, 30, 46, 0.8); /* windowed */ + border-radius: 0px; + border-bottom: 1px solid rgba(90, 104, 125, 0.4); + color: #cdd6f4; + transition-property: background-color; + transition-duration: 0.3s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +button.active { + color: #ff80d5; /* pink */ + border-radius: 0; +} + +button:hover { + background-color: rgba(10, 80, 100, 0.95); + box-shadow: inset 0 -1px transparent; /* Use box-shadow instead of border so the text isn't offset */ + border: 1px solid rgba(90, 104, 125, 0.3); + border-radius: 3px; + transition-property: background-color; + transition-duration: 0.3s; /* animation *1/ */ +} + +button.active:hover { + background-color: rgba(80, 50, 100, 0.95); + box-shadow: inset 0 -1px #ff80d5; + border-radius: 3px; +} + +#window { + color: #ff80d5; /* pink */ + margin-left: 8px; + margin-right: 8px; + transition-property: background-color; + transition-duration: 0.3s; +} + +#window:hover { + background-color: rgba(90, 60, 110, 0.97); + border: 1px solid rgba(90, 104, 125, 0.8); + padding: 0 4px; + border-radius: 5px; + transition-property: background-color; + transition-duration: 0.3s; + margin: 2px 0; +} + +#window#waybar.hidden { + opacity: 0.2; +} + +#workspaces { + transition-property: background-color; + transition-duration: 0.5s; +} + +#workspaces:hover { + /* background-color: rgba(0, 70, 100, 0.33); */ + border-radius: 5px; + transition-property: background-color; + transition-duration: 0.5s; +} + +#workspaces button:hover { + border: 1px solid rgba(90, 104, 125, 0.8); + border-radius: 5px; + transition-property: background-color; + transition-duration: 0.5s; +} + +#workspaces button { + /*color: #78dcff;*/ + border-radius: 5px; + padding: 0 8px; + margin: 2px 3px; + transition-property: background-color; + transition-duration: 0.5s; +} + +#workspaces button.active, +#wlr-taskbar button.active { + color: #ff80d5; /* pink */ + background-color: rgba(80, 50, 100, 0.6); + border: 1px solid rgba(90, 104, 125, 0.5); + transition-property: background-color; + transition-duration: 0.3s; +} + +#workspaces button:hover { + background-color: rgba(90, 60, 110, 0.97); + border: 1px solid rgba(90, 104, 125, 0.6); +} + +#workspaces button.active:hover { + background-color: rgba(90, 60, 110, 0.97); + border-radius: 5px; + transition-property: background-color; + transition-duration: 0.5s; + border: 1px solid rgba(90, 104, 125, 0.6); +} + +#workspaces button.urgent { + background-color: #eb4d4b; +} + +#window, +#custom-cast, +#custom-cpu-info, +#custom-gpu-info, +#custom-kraken, +#custom-memory-info, +#custom-start_button, +#custom-start_button, +#custom-usage-toggle, +#battery, +#cpu, +#memory, +#disk, +#temperature, +#backlight, +#network, +#pulseaudio, +#wireplumber, +#custom-battery_g502, +#custom-bluetooth, +#custom-mount, +#custom-sync, +#custom-server, +#custom-kde-connect, +#custom-media, +#custom-brightness, +#custom-wlsunset, +#idle_inhibitor, +#custom-battery-suffix, +#clock.date, +#clock.clock, +#custom-dunst, +#tray, +#wlr-taskbar, +#mode, +#scratchpad, +#mpris, +#mpd { + border-radius: 5px; + padding: 0 5px; + margin: 0; + min-width: 18px; + transition-property: background-color; + transition-duration: 0.3s; +} + +#clock.date:hover, +#clock.clock:hover, +#custom-battery_g502:hover, +#custom-dunst:hover, +#custom-cpu-info:hover, +#custom-usage-toggle:hover, +#custom-kraken:hover, +#custom-memory-info:hover, +#custom-gpu-info:hover, +#backlight:hover, +#custom-brightness:hover, +#custom-bluetooth:hover, +#custom-wlsunset:hover, +#idle_inhibitor:hover, +#battery:hover, +#custom-battery-suffix:hover, +#pulseaudio:hover, +#wireplumber:hover, +#custom-bluetooth:hover, +#network:hover, +#custom-kde-connect:hover, +#custom-cast:hover, +#custom-server:hover, +#custom-mount:hover, +#custom-sync:hover, +#mpris:hover { + background-color: rgba(10, 80, 100, 0.95); + border: 1px solid rgba(90, 104, 125, 0.8); + padding: 0 4px; + border-radius: 5px; + transition-property: background-color; + transition-duration: 0.3s; + margin: 2px 0; +} + +#tray { + padding: 4px; + color: #78dcff; + border-radius: 5px; + padding: 0 5px; + margin: 2px 1px; +} + +#tray:hover { + border: 1px solid rgba(90, 104, 125, 0.8); + border-radius: 5px; + padding: 0px 4px; + background-color: rgba(10, 80, 100, 0.95); + transition-property: background-color; + transition-duration: 0.3s; +} + +#wlr-taskbar { + background-color: #303030; + border-radius: 5px; + padding-left: 2px; + padding-right: 2px; +} + +#taskbar button { + border-radius: 5px; + padding-left: 10px; /* was 5px until Wed 2026-05-06 */ + padding-right: 10px; /* was 5px until Wed 2026-05-06 */ + margin: 2px; + /* margin-left: 1px; */ + /* margin-right: 1px; */ + transition-property: background-color; + transition-duration: 300ms; +} + +#taskbar button:hover { + border: 1px solid rgba(90, 104, 125, 0.4); + background-color: rgba(0, 178, 255, 0.3); + transition-property: background-color; + transition-duration: 300ms; +} + +#taskbar button.active { + border: 1px solid rgba(90, 104, 125, 0.4); + background-color: rgba(10, 70, 90, 0.6); +} + +#taskbar button.active:hover { + /*background-color: rgba(10, 80, 100, 1);*/ + background-color: rgba(20, 80, 100, 0.95); + box-shadow: inset 0 -1px #78dcff; +} + +#mpris { + color: #78dcff; +} +#mpris:hover { + background-color: rgba(10, 80, 100, 0.95); +} + +#custom-usage-toggle:hover { + background-color: rgba(60, 50, 100, 0.95); +} + +#custom-start_button { + padding: 0px 16px; + background-image: url("/home/tobias/.config/waybar/img/start.png"); + margin: 0 5px; + margin-top: 4px; + transition-property: background-color; + transition-duration: 0.35s; +} + +#custom-start_button:hover { + margin: 2px 4px; + /* margin-right: 6px; */ + border: 1px solid rgba(90, 104, 125, 0.2); + border-radius: 5px; + background-color: rgba(0, 178, 255, 0.5); + transition-property: background-color; + transition-duration: 0.35s; +} + +#custom-separator { + color: #cdd6f4; + margin: 0; + padding: 0; +} + +#workspaces { + padding: 0; + margin: 0; +} + +#workspaces:hover, +#workspaces button:hover, +#taskbar button:hover { + transition-property: background-color; + transition-duration: 300ms; +} + +#custom-cpu-info { + color: #ff8ca1; +} +#custom-cpu-info:hover { + background-color: rgba(90, 50, 60, 0.95); + border: 1px solid rgba(90, 104, 125, 0.6); +} + +#custom-kraken { + color: #ffaf8a; +} + +#custom-memory-info { + color: #ffe769; +} + +#custom-memory-info:hover, +#custom-usage-toggle:hover { + background-color: rgba(120, 80, 60, 0.95); +} + +#clock.date:hover, +#clock.clock:hover { + background-color: rgba(60, 50, 100, 0.95); +} + +/* ===== BLUE - SERVICE /SYSTEM CONTROL ===== */ +#custom-bluetooth, +#custom-mount, +#custom-kde-connect, +#custom-cast, +#custom-sync, +#custom-server, +#custom-dunst, +#network { + color: #78dcff; /* blue */ +} + +#pulseaudio:hover, +#custom-bluetooth:hover, +#custom-mount:hover, +#custom-kde-connect:hover, +#custom-sync:hover, +#custom-server:hover, +#custom-dunst:hover, +#network:hover { + background-color: rgba(10, 70, 90, 0.95); +} + +/* ===== GREEN - SERVICE / SYSTEM CONTROL ===== */ +#battery:hover, +#pulseaudio:hover { + background-color: rgba(10, 90, 70, 0.95); /* green */ +} + +#backlight, +#custom-brightness, +#idle_inhibitor, +#custom-wlsunset, +#wireplumber { + color: #8df1a9; /* green */ +} + +#backlight:hover, +#custom-brightness:hover, +#custom-wlsunset:hover, +#idle_inhibitor:hover, +#wireplumber:hover { + background-color: rgba(10, 90, 70, 0.95); /* green */ +} + +/* ===== YELLOW - SERVICE / SYSTEM CONTROL ===== */ +#custom-gpu-info { + color: #ffe769; /* # yellow */ +} + +#custom-gpu-info:hover { + background-color: rgba(81, 95, 60, 0.95); /* yellow */ +} +/* ==========================================-------------- */ + +#custom-battery-suffix { + padding-left: 1px; + background-color: #ff80d5; +} + +#custom-battery-suffix:hover { + padding-left: 0px; +} + +#custom-separator { + color: #cdd6f4; + margin-right: 2px; +} + +#custom-cpu-info { + color: #ff8ca1; +} + +#custom-memory-info, +#custom-usage-toggle { + color: #ffaf8a; +} + +span { + color: red; + font-size: 20px; +} + +#clock.date { + color: #b6b2ff; + margin-right: 0px; +} + +#clock.clock { + color: #b6b2ff; + margin-left: 0px; + padding-left: 2px; + margin-right: 5px; +} + +#clock.clock:hover { + margin-left: 0px; + padding-left: 1px; + margin-right: 5px; +} + +#battery, +#custom-battery-suffix, +#pulseaudio { + color: #8df1a9; +} + +#battery.charging, +#battery.plugged { + color: #8df1a9; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +#battery.critical:not(.charging) { + /* background-color: #f53c3c; */ + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +label:focus { + background-color: #000000; +} + +#wireplumber.muted { + background-color: #f53c3c; +} + +#temperature { + background-color: #f0932b; +} + +#temperature.critical { + background-color: #eb4d4b; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} +#mode { + background-color: #64727d; + border-bottom: 2px solid #5599ff; +} + +#language { + background: #00b093; + color: #740864; + padding: 0 5px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state { + background: #97e1ad; + color: #000000; + padding: 0 0px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state > label { + padding: 0 5px; +} + +#keyboard-state > label.locked { + background: rgba(0, 0, 0, 0.2); +}