diff --git a/hypr/modules/keybinds.conf b/hypr/modules/keybinds.conf index 6bac9e0..1a9450e 100644 --- a/hypr/modules/keybinds.conf +++ b/hypr/modules/keybinds.conf @@ -77,10 +77,10 @@ bindm = $mainMod, mouse:272, movewindow bindm = $mainMod, mouse:273, resizewindow # Laptop multimedia keys for volume and LCD brightness -bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && pkill -RTMIN+9 waybar -bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%- && pkill -RTMIN+9 waybar -bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pkill -RTMIN+9 waybar -bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle && pkill -RTMIN+9 waybar +bindel = ,XF86AudioRaiseVolume, exec, fluxo-rs vol up 5 +bindel = ,XF86AudioLowerVolume, exec, fluxo-rs vol down 5 +bindel = ,XF86AudioMute, exec, fluxo-rs vol mute +bindel = ,XF86AudioMicMute, exec, fluxo-rs mic mute bindel = ,XF86MonBrightnessUp, exec, brightnessctl set 5%+ bindel = ,XF86MonBrightnessDown, exec, brightnessctl set 5%- diff --git a/waybar/config.jsonc b/waybar/config.jsonc index cba8761..3773ca9 100644 --- a/waybar/config.jsonc +++ b/waybar/config.jsonc @@ -15,7 +15,7 @@ "hyprland/window" ], "modules-center": [ - "clock" + "group/center" ], "modules-right": [ "tray", @@ -34,29 +34,44 @@ }, "clock": { "format": "{:%a %d %b %H:%M}", - "on-click-right": "xdg-open https://calendar.proton.me/u/0/month &> /dev/null & disown", "tooltip": false }, + "custom/mpris": { + "format": "{}", + "return-type": "json", + "exec": "fluxo-rs mpris", + "on-click": "playerctl play-pause", + "signal": 11, + "interval": 0 + }, "tray": { "icon-size": 18, "spacing": 10 }, + "group/center": { + "orientation": "horizontal", + "modules": [ + "custom/mpris", + "clock" + // "custom/dnd" + ] + }, "custom/gamemode": { "format": "{}", "return-type": "json", "exec": "fluxo-rs game", - "on-click": "~/.config/hypr/scripts/gamemode.sh && pkill -RTMIN+1 waybar & disown", - "signal": 1, + "on-click": "~/.config/hypr/scripts/gamemode.sh", + "signal": 7, "interval": 5 }, - // --- Fluxo-rs Power --- "custom/power_status": { "format": "{} ", "return-type": "json", "exec": "fluxo-rs power", "on-click": "~/.config/hypr/scripts/powermenu.sh & disown", + "signal": 10, "interval": 5 } }, @@ -71,15 +86,13 @@ "margin-right": 10, "modules-left": [ - "group/hardware" // Replaced individual modules with a group + "group/hardware" ], - // Add the group definition anywhere in the bottom bar block: "group/hardware": { "orientation": "horizontal", "modules": [ "custom/sys", "custom/cpu", - "custom/gpu", "custom/mem", "custom/disk-root", "custom/network" @@ -98,6 +111,7 @@ "format": "{}", "return-type": "json", "exec": "fluxo-rs sys", + "signal": 5, "interval": 1 }, "custom/cpu": { @@ -105,33 +119,37 @@ "return-type": "json", "exec": "fluxo-rs cpu", "on-click": "zenmonitor & disown", + "signal": 2, "interval": 1 }, "custom/mem": { "format": "{}", "return-type": "json", "exec": "fluxo-rs mem", + "signal": 3, "interval": 1 }, "custom/gpu": { "format": "{}", "return-type": "json", "exec": "fluxo-rs gpu", + "signal": 4, "interval": 1 }, "custom/network": { "format": "{}", "return-type": "json", "exec": "fluxo-rs net", + "signal": 1, "interval": 1 }, - // --- Fluxo-rs Utilities --- "custom/disk-root": { "format": "{}", "return-type": "json", "exec": "fluxo-rs disk /", - "interval": 30 + "signal": 6, + "interval": 1 }, // --- Fluxo-rs Audio & BT --- @@ -139,10 +157,10 @@ "format": "{}", "return-type": "json", "exec": "fluxo-rs vol", - "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && pkill -RTMIN+8 waybar", - "on-scroll-up": "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && pkill -RTMIN+8 waybar", - "on-scroll-down": "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%- && pkill -RTMIN+8 waybar", - "on-click-right": "fluxo-rs vol --cycle && pkill -RTMIN+8 waybar", + "on-click": "fluxo-rs vol mute", + "on-scroll-up": "fluxo-rs vol up 5", + "on-scroll-down": "fluxo-rs vol down 5", + "on-click-right": "fluxo-rs vol cycle", "on-click-middle": "pavucontrol", "signal": 8, "interval": 1 @@ -151,49 +169,31 @@ "format": "{}", "return-type": "json", "exec": "fluxo-rs mic", - "on-click": "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle && pkill -RTMIN+9 waybar", - "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%+ && pkill -RTMIN+9 waybar", - "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 5%- && pkill -RTMIN+9 waybar", - "on-click-right": "fluxo-rs mic --cycle && pkill -RTMIN+9 waybar", + "on-click": "fluxo-rs mic mute", + "on-scroll-up": "fluxo-rs mic up 5", + "on-scroll-down": "fluxo-rs mic down 5", + "on-click-right": "fluxo-rs mic cycle", "on-click-middle": "pavucontrol", - "signal": 9, + "signal": 8, "interval": 1 }, "custom/bluetooth-audio": { "format": "{}", "return-type": "json", "exec": "fluxo-rs bt", - "on-click": "fluxo-rs bt menu && pkill -RTMIN+10 waybar", - "on-click-right": "fluxo-rs bt cycle_mode && pkill -RTMIN+10 waybar", - "signal": 10, + "on-click": "fluxo-rs bt menu", + "on-click-right": "fluxo-rs bt cycle_mode", + "signal": 9, "interval": 1, "tooltip": true - } - // --- Commented Out Modules --- - /* - "custom/btrfs": { - "format": "{}", - "return-type": "json", - "exec": "fluxo-rs pool", - "interval": 30 }, - "custom/buds": { + "custom/dnd": { "format": "{}", "return-type": "json", - "exec": "fluxo-rs buds", - "on-click": "fluxo-rs buds connect & disown", - "on-click-right": "fluxo-rs buds cycle_anc & disown", - "interval": 5 - }, - "custom/gpu-screen-recorder": { - "format": "{}", - "return-type": "json", - "exec": "~/.config/waybar/scripts/gpu-screen-recorder-status.sh", - "on-click-right": "~/.config/hypr/scripts/replay-ctrl.sh save & disown", - "on-click-middle": "nautilus ~/Videos/replay & disown", - "on-click": "~/.config/waybar/scripts/toggle-replay.sh & disown", - "interval": 1 + "exec": "fluxo-rs dnd", + "on-click": "fluxo-rs dnd toggle", + "signal": 14, + "interval": 0 } - */ } ] diff --git a/waybar/scripts/audio.sh b/waybar/scripts/audio.sh deleted file mode 100755 index d94086a..0000000 --- a/waybar/scripts/audio.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -DEFAULT_SINK=$(pactl info | grep 'Default Sink' | cut -d ' ' -f3) -DESCRIPTION=$(pactl list sinks | grep -A2 "Name: $DEFAULT_SINK" | grep "Description:" | cut -d ' ' -f2-) - - -case $1 in - cycle) - SINKS=($(pactl list short sinks | awk '{print $2}')) - NUM_SINKS=${#SINKS[@]} - CURRENT_SINK=$(pactl info | grep 'Default Sink' | cut -d ' ' -f3) - - for i in "${!SINKS[@]}"; do - if [[ "${SINKS[$i]}" == "$CURRENT_SINK" ]]; then - NEXT_INDEX=$(( (i + 1) % NUM_SINKS )) - pactl set-default-sink "${SINKS[$NEXT_INDEX]}" - exit 0 - fi - done - ;; - show) - TEXT=$(echo "$DESCRIPTION" | cut -c -20) - if [ -z "$DESCRIPTION" ]; then - DESCRIPTION=$DEFAULT_SINK - fi - CLASS="" - case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in - yes) - CLASS="muted" - ;; - no) - CLASS="unmuted" - ;; - esac - - printf '{"text": "%s", "tooltip": "%s", "class": "%s"}' "$TEXT" "$DESCRIPTION" "$CLASS" - ;; - *) - echo "usage audio.sh {cycle|show}" - ;; -esac diff --git a/waybar/scripts/bluetooth_audio.sh b/waybar/scripts/bluetooth_audio.sh deleted file mode 100755 index aa5c171..0000000 --- a/waybar/scripts/bluetooth_audio.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash - -bt-audio-info() { - # Check if a MAC address was provided as the first argument. - if [ -z "$1" ]; then - echo "Usage: $0 " - echo "Example: $0 00:11:22:33:AA:BB" - exit 1 - fi - MAC_ADDRESS="$1" - - # --- Main Logic --- - - # Construct the PipeWire sink name from the MAC address. - # The format is typically: bluez_output.XX_XX_XX_XX_XX_XX.a2dp_sink - # We replace colons with underscores for the format. - SINK_IDENTIFIER="bluez_output.$(echo "$MAC_ADDRESS" | tr ':' '_')" - - # Use pactl to get the full details for all sinks, then find the one - # that contains our device's identifier. We use awk to print the - # entire block of text for that specific sink. - # We check for a partial match on the sink identifier because the profile - # (e.g., .a2dp_sink) can change. - sink_info=$(pactl list sinks | awk -v id="$SINK_IDENTIFIER" '/Sink #/ {p=0} $0 ~ "Name: " id {p=1} p') - - # If sink_info is empty, the device might not be an audio sink or isn't connected. - if [ -z "$sink_info" ]; then - echo "Error: Could not find an active audio sink for MAC ${MAC_ADDRESS}" - echo "Please ensure the device is connected and is an audio output device." - exit 1 - fi - - # Get the full block of info for the device from bluetoothctl. - device_info=$(bluetoothctl info "$MAC_ADDRESS") - - # --- Parse Information --- - - # Parse bluetoothctl output for general device details. - alias=$(echo "$device_info" | rg "Alias:" | cut -d ' ' -f 2-) - trusted=$(echo "$device_info" | rg "Trusted:" | awk '{print $2}') - battery_raw=$(echo "$device_info" | rg "Battery Percentage:" | awk -F'[()]' '{print $2}') - - # Parse pactl output for audio-specific details. - volume=$(echo "$sink_info" | rg "Volume:" | head -n1 | awk '{print $5}') - codec=$(echo "$sink_info" | rg -e 'bluetooth.codec|api.bluez5.codec' | awk -F'"' '{print $2}') - - # --- Build and Display Compact Output --- - - # Build the output string with all the information. - output_string="${alias} | MAC: ${MAC_ADDRESS}\n" - output_string+="Trusted: ${trusted}" - - # Append battery info if available, otherwise show N/A. - if [ -n "$battery_raw" ]; then - output_string+=" | Bat: ${battery_raw}%" - else - output_string+=" | Bat: N/A" - fi - - output_string+=" | Vol: ${volume} | Codec: ${codec:-N/A}" - - # Print the final, single-line string. - echo "$output_string" -} - -# Find the MAC address of the first connected device that is an audio sink -find_audio_device() { - default_sink_name=$(pactl get-default-sink) - - # Check if the default sink is a Bluetooth device. Their names typically - # start with "bluez_output.". If not, print a message and exit. - if [[ "$default_sink_name" == bluez_output* ]]; then - # Extract the MAC address from the sink name. - # The format is bluez_output.XX_XX_XX_XX_XX_XX.profile - # We extract the middle part and replace underscores with colons. - mac_with_underscores=$(echo "$default_sink_name" | cut -d '.' -f 2) - mac=$(echo "$mac_with_underscores" | tr '_' ':') - echo "$mac" - return - fi - - # else look for the first bluetooth device that provides a sink - bluetoothctl devices Connected | rg '^Device ' | awk '{print $2}' | while read -r mac; - do - # Check if the device provides the "Audio Sink" service - if bluetoothctl info "$mac" | rg -q "0000110b-0000-1000-8000-00805f9b34fb"; then - echo "$mac" - # If you only want the first audio device found, you can 'break' or 'exit' here. - break - fi - done -} - -# If the script is called with "disconnect" -if [ "$1" == "disconnect" ]; then - device_mac=$(find_audio_device) - if [ -n "$device_mac" ]; then - bluetoothctl disconnect "$device_mac" - fi - echo "{}" - exit 0 -fi - -# Main logic to display the device name -device_mac=$(find_audio_device) - -if [ -n "$device_mac" ]; then - # Get the device alias (name) - device_name=$(bluetoothctl info "$device_mac" | rg "Alias:" | cut -d ' ' -f 2-) - # Output in Waybar's JSON format - tooltip=$(bt-audio-info $device_mac) - echo "{\"text\": \"$device_name 󰂰\", \"tooltip\": \"$tooltip\"}" -else - # Output empty string when no device is connected - echo "{}" -fi - - diff --git a/waybar/scripts/btrfs.sh b/waybar/scripts/btrfs.sh deleted file mode 100755 index 7e88fd5..0000000 --- a/waybar/scripts/btrfs.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -# Get BTRFS filesystems -btrfs_filesystems=$(df -hT | grep btrfs) - -# Initialize variables -total_used=0 -total_size=0 - -# Process each BTRFS filesystem -while read -r line; do - size_str=$(echo "$line" | awk '{print $3}') - used_str=$(echo "$line" | awk '{print $4}') - - size=$(echo "$size_str" | sed 's/[GT]//') - used=$(echo "$used_str" | sed 's/[GT]//') - - if [[ $size_str == *T ]]; then - size=$(awk -v s="$size" 'BEGIN {print s*1024}') - fi - if [[ $used_str == *T ]]; then - used=$(awk -v u="$used" 'BEGIN {print u*1024}') - fi - - total_size=$(awk -v total="$total_size" -v size="$size" 'BEGIN {print total+size}') - total_used=$(awk -v total="$total_used" -v used="$used" 'BEGIN {print total+used}') - -done <<< "$btrfs_filesystems" - -# Calculate usage percentage -usage_percentage=$(awk -v used="$total_used" -v total="$total_size" 'BEGIN {printf "%.0f", (used/total)*100}') - -# Set class based on usage -if [ "$usage_percentage" -gt 95 ]; then - class="max" -elif [ "$usage_percentage" -gt 80 ]; then - class="high" -else - class="normal" -fi - -text="$(printf "%.0f" $total_used)G / $(printf "%.0f" $total_size)G" - -# Manually construct the JSON output -echo "{\"text\": \"$text\", \"tooltip\": \"\", \"class\": \"$class\"}" diff --git a/waybar/scripts/cpu_info.sh b/waybar/scripts/cpu_info.sh deleted file mode 100755 index b578b0c..0000000 --- a/waybar/scripts/cpu_info.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -USAGE=$(mpstat 1 1 | awk '/Average:/ {print 100 - $12}') -TEMP=$(cat /sys/class/hwmon/hwmon6/temp1_input) -TEXT="$(printf "%.1f" $(echo "$USAGE"))% $(printf "%.1f" $(echo "scale=2; $TEMP"/1000 | bc -l))C" -CPU=$(lscpu | grep 'Model name' | awk -F': ' '{print $2}' | sed 's/^[ \t]*//') -# TOOLTIP=$(ps -eo %cpu,comm --sort=-%cpu | head -n 6 | sed '1d' | awk '{output = output sprintf("%.1f%%\t%s\\n", $1, $2)} END {printf "%s", output}') -# TOOLTIP=$(ps -eo %cpu,comm --sort=-%cpu | head -n 6 | sed '1d' | awk -v ncores=$(nproc) '{printf "%.1f%%\t%s\n", $1/ncores, $2}') -# TOOLTIP=$(ps -eo %cpu,comm --sort=-%cpu | head -n 6 | sed '1d' | awk -v ncores=$(nproc) '{printf "%.1f%%\t%s\\n", $1/ncores, $2}') -# TOOLTIP=$(top -b -n 1 | sed '1,7d' | head -n 5 | awk '{output = output sprintf("%.1f%%\t%s\\n", $9, $12)} END {printf "%s", output}') - -CLASS="" - -if (( $(echo "$USAGE > 95" | bc -l) )); then - CLASS="max" -elif (( $(echo "$USAGE > 75" | bc -l) )); then - CLASS="high" -else - CLASS="normal" -fi - -# echo "{\"text\":\"CPU: $TEXT\", \"tooltip\": \"$TOOLTIP\", \"class\":\"$CLASS\"}" -echo "{\"text\":\"CPU: $TEXT\", \"class\":\"$CLASS\"}" diff --git a/waybar/scripts/cycle_input.sh b/waybar/scripts/cycle_input.sh deleted file mode 100755 index 858227f..0000000 --- a/waybar/scripts/cycle_input.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -DEFAULT_SOURCE=$(pactl info | grep 'Default Source' | cut -d ' ' -f3) -DESCRIPTION=$(pactl list sources | grep -A2 "Name: $DEFAULT_SOURCE" | grep "Description:" | cut -d ' ' -f2-) - - -case $1 in - cycle) - # Filter out monitor sources - SOURCES=($(pactl list short sources | awk '{print $2}' | grep -v ".monitor")) - NUM_SOURCES=${#SOURCES[@]} - CURRENT_SOURCE=$(pactl info | grep 'Default Source' | cut -d ' ' -f3) - - for i in "${!SOURCES[@]}"; do - if [[ "${SOURCES[$i]}" == "$CURRENT_SOURCE" ]]; then - NEXT_INDEX=$(( (i + 1) % NUM_SOURCES )) - pactl set-default-source "${SOURCES[$NEXT_INDEX]}" - exit 0 - fi - done - # If current source was a monitor or not in list, just pick the first one - if [ $NUM_SOURCES -gt 0 ]; then - pactl set-default-source "${SOURCES[0]}" - fi - ;; - show) - TEXT=$(echo "$DESCRIPTION" | cut -c -20) - if [ -z "$DESCRIPTION" ]; then - DESCRIPTION=$DEFAULT_SOURCE - fi - CLASS="" - case $(pactl get-source-mute @DEFAULT_SOURCE@ | awk '{print $2}') in - yes) - CLASS="muted" - ;; - no) - CLASS="unmuted" - ;; - esac - - printf '{"text": "%s", "tooltip": "%s", "class": "%s"}' "$TEXT" "$DESCRIPTION" "$CLASS" - ;; - *) - echo "usage cycle_input.sh {cycle|show}" - ;; -esac diff --git a/waybar/scripts/disk_info.sh b/waybar/scripts/disk_info.sh deleted file mode 100755 index 855b584..0000000 --- a/waybar/scripts/disk_info.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -if [ -z "$1" ]; then - echo "Usage: $0 " - exit 1 -fi - -MOUNTPOINT=$1 - -# Get disk usage info -USED=$(df -h --output=used "$MOUNTPOINT" | sed '1d' | awk '{print $1}') -TOTAL=$(df -h --output=size "$MOUNTPOINT" | sed '1d' | awk '{print $1}') -PERCENTAGE=$(df --output=pcent "$MOUNTPOINT" | sed '1d' | tr -d '%' | awk '{print $1}') - -# Set class based on usage -CLASS="normal" -if [ "$PERCENTAGE" -gt 95 ]; then - CLASS="max" -elif [ "$PERCENTAGE" -gt 80 ]; then - CLASS="high" -fi - -# Create tooltip with more details -TOOLTIP=$(df -h "$MOUNTPOINT" | sed '1d' | awk '{printf "Used: %s\nTotal: %s\nFree: %s", $3, $2, $4}') - -# Output JSON for Waybar using jq -jq -n -c \ - --arg text "$1 $USED/$TOTAL" \ - --arg tooltip "$TOOLTIP" \ - --arg class "$CLASS" \ - '{"text": $text, "tooltip": $tooltip, "class": $class}' diff --git a/waybar/scripts/gamemode_status.sh b/waybar/scripts/gamemode_status.sh deleted file mode 100755 index 1d54671..0000000 --- a/waybar/scripts/gamemode_status.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env sh - -FORMAT_ACTIVATED="󰊖" -FORMAT_DEACTIVATED="" -HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}') -if [ "$HYPRGAMEMODE" = 1 ] ; then - printf "{\"text\": \"$FORMAT_DEACTIVATED\", \"tooltip\": \"Gamemode deactivated\"}" -else - printf "{\"text\": \"$FORMAT_ACTIVATED\", \"tooltip\": \"Gamemode activated\", \"class\": \"active\"}" -fi diff --git a/waybar/scripts/gpu_info.sh b/waybar/scripts/gpu_info.sh deleted file mode 100755 index bf09791..0000000 --- a/waybar/scripts/gpu_info.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -USAGE=$(cat /sys/class/drm/card1/device/gpu_busy_percent) -MEM_USED=$(cat /sys/class/drm/card1/device/mem_info_vram_used) -MEM_TOTAL=$(cat /sys/class/drm/card1/device/mem_info_vram_total) -EDGE_TEMP=$(cat /sys/class/drm/card1/device/hwmon/hwmon2/temp1_input) -JUNC_TEMP=$(cat /sys/class/drm/card1/device/hwmon/hwmon2/temp2_input) -MEM_TEMP=$(cat /sys/class/drm/card1/device/hwmon/hwmon2/temp3_input) -GPU=$(/opt/rocm/bin/rocm-smi --showproductname | grep "Card Series" | awk -F':' '{print $3}' | xargs) -TEXT="$USAGE% $(printf "%.1f" $(echo "scale=2; $MEM_USED/1024/1024/1024" | bc -l))/$(printf "%.1f" $(echo "scale=2; $MEM_TOTAL/1024/1024/1024" | bc -l))GB $(printf "%.1f" $(echo "scale=2; $EDGE_TEMP/1000" | bc -l))/$(printf "%.1f" $(echo "scale=2; $MEM_TEMP/1000" | bc -l))C" -RATIO=$(echo "$MEM_USED/ $MEM_TOTAL" | bc -l) - -CLASS="" - -if (( $(echo "$USAGE > 95" | bc -l) )); then - CLASS="max" -elif (( $(echo "$USAGE > 75" | bc -l) )); then - CLASS="high" -else - CLASS="normal" -fi - -echo "{\"text\":\"GPU: $TEXT\", \"tooltip\": \"$GPU\", \"class\":\"$CLASS\"}" diff --git a/waybar/scripts/memory.sh b/waybar/scripts/memory.sh deleted file mode 100755 index fd9ffbf..0000000 --- a/waybar/scripts/memory.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# TOOLTIP=$(ps -eo rss,comm --sort=-rss | head -n 6 | sed '1d' | awk '{output = output sprintf("%.2f GB\t%s\\n", $1/1024/1024, $2)} END {printf "%s", output}') -TOTAL=$(awk '/MemTotal/ {printf "%.2f\n", $2/1024/1024}' /proc/meminfo) -USED=$(awk '/MemTotal/ {total=$2} /MemAvailable/ {available=$2} END {printf "%.2f\n", (total-available)/1024/1024}' /proc/meminfo) -RATIO=$(echo "$USED/ $TOTAL" | bc -l) - -CLASS="" - -if (( $(echo "$RATIO> 95" | bc -l) )); then - CLASS="max" -elif (( $(echo "$RATIO> 75" | bc -l) )); then - CLASS="high" -else - CLASS="normal" -fi - -# printf '{"text": "%s/%sGB", "tooltip": "%s", "class": "%s"}' "$USED" "$TOTAL" "$TOOLTIP" "$CLASS" -printf '{"text": "%s/%sGB", "class": "%s"}' "$USED" "$TOTAL" "$CLASS" diff --git a/waybar/scripts/network.sh b/waybar/scripts/network.sh deleted file mode 100755 index 7acff8d..0000000 --- a/waybar/scripts/network.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -# Path for the temporary file to store previous stats -STATS_FILE="/tmp/waybar_net_stats" - -# Find the primary default network interface by sorting routing metrics. -# This correctly prioritizes a VPN connection when it's active. -INTERFACE_INFO=$(ip route list | grep '^default' | sort -k 9 -n | head -n1) -INTERFACE=$(echo "$INTERFACE_INFO" | awk '{print $5}') - -# Exit if no active interface is found -if [ -z "$INTERFACE" ]; then - echo "{\"text\": \"No connection\"}" - exit 0 -fi - -# Get the IP address for the interface -IP_ADDR=$(ip -4 addr show "$INTERFACE" | grep -oP 'inet \K[\d.]+') - -# Get current time and byte counts -TIME_NOW=$(date +%s) -RX_BYTES_NOW=$(cat "/sys/class/net/$INTERFACE/statistics/rx_bytes") -TX_BYTES_NOW=$(cat "/sys/class/net/$INTERFACE/statistics/tx_bytes") - -# Initialize speeds to 0 -RX_MBPS="0.00" -TX_MBPS="0.00" - -# Read previous values if the stats file exists -if [ -f "$STATS_FILE" ]; then - # shellcheck source=/dev/null - # Use a lock to ensure we don't source while another instance is writing - { - flock -s 200 || exit 1 - source "$STATS_FILE" 2>/dev/null - } 200>"$STATS_FILE.lock" -fi - -# Calculate speed if we have previous data and time has passed -if [ -n "$PREV_TIME" ] && [ -n "$PREV_RX_BYTES" ] && [ -n "$PREV_TX_BYTES" ] && [ "$TIME_NOW" -gt "$PREV_TIME" ]; then - TIME_DIFF=$((TIME_NOW - PREV_TIME)) - - RX_BPS=$(( (RX_BYTES_NOW - PREV_RX_BYTES) / TIME_DIFF )) - TX_BPS=$(( (TX_BYTES_NOW - PREV_TX_BYTES) / TIME_DIFF )) - - # Using printf for better formatting (forces two decimal places) - RX_MBPS=$(printf "%.2f" "$(echo "$RX_BPS / 1024 / 1024" | bc -l)") - TX_MBPS=$(printf "%.2f" "$(echo "$TX_BPS / 1024 / 1024" | bc -l)") -fi - -# Save current values for the next run safely using a lock -# We use a subshell with flock to ensure atomic updates and prevent race conditions -( - flock -x 200 || exit 1 - echo "PREV_TIME=$TIME_NOW" > "$STATS_FILE" - echo "PREV_RX_BYTES=$RX_BYTES_NOW" >> "$STATS_FILE" - echo "PREV_TX_BYTES=$TX_BYTES_NOW" >> "$STATS_FILE" -) 200>"$STATS_FILE.lock" - -# Format the main output string -OUTPUT_TEXT="$INTERFACE ($IP_ADDR):  ${RX_MBPS} MB/s  ${TX_MBPS} MB/s" - -# Prepend a VPN icon if a common VPN interface is active -case "$INTERFACE" in - tun*|wg*|ppp*|pvpn*) - OUTPUT_TEXT=" $OUTPUT_TEXT" - ;; -esac - -# Output JSON for Waybar -echo "{\"text\": \"$OUTPUT_TEXT\"}" diff --git a/waybar/scripts/pixelbuds_pro_control.sh b/waybar/scripts/pixelbuds_pro_control.sh deleted file mode 100755 index 7bbaa06..0000000 --- a/waybar/scripts/pixelbuds_pro_control.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash - -# --- CONFIGURATION --- -# Your Pixel Buds Pro's MAC Address -MAC_ADDRESS="B4:23:A2:09:D3:53" -# --- END CONFIGURATION --- - -not_connected() { - printf "{\"text\": \"\", \"tooltip\": \"Pixel Buds Pro 2 not connected\", \"class\": \"disconnected\"}\n" - exit -} - -# This function gets the current status and formats it for Waybar. -get_status() { - # Get all info from pbpctrl in one go. Redirect errors to null. - battery_output=$(pbpctrl show battery 2>/dev/null) - - # Fallback: If pbpctrl fails or returns 'unknown', hide the module. - if [[ $? -ne 0 || -z "$battery_output" ]]; then - not_connected - fi - - # --- PARSE BATTERY INFO --- - left_bud=$(echo "$battery_output" | grep "left bud:" | awk '{print $3}') - right_bud=$(echo "$battery_output" | grep "right bud:" | awk '{print $3}') - - if ([[ "$left_bud" == "unknown" ]] && [[ "$right_bud" == "unknown" ]]) || \ - [[ -z "$left_bud" && -z "$right_bud" ]]; then - echo "{}" - exit - fi - - if [[ "$left_bud" == "unknown" ]]; then - left_display="L: ---" - else - left_display="L: $left_bud" - fi - - if [[ "$right_bud" == "unknown" ]]; then - right_display="R: ---" - else - right_display="R: $right_bud" - fi - - # --- PARSE ANC INFO --- - current_mode=$(pbpctrl get anc 2>/dev/null) - - case "$current_mode" in - "active") - anc_icon="ANC" - class="anc-active" - ;; - "aware") - anc_icon="Aware" - class="anc-aware" - ;; - "off") - anc_icon="Off" - class="anc-off" - ;; - *) - anc_icon="?" - class="anc-unknown" - ;; - esac - - # --- FORMAT OUTPUT --- - printf '{"text": "%s | %s | %s", "tooltip": "Pixel Buds Pro 2", "class": "%s"}\n' \ - "$left_display" "$right_display" "$anc_icon" "$class" - exit -} - -status() { - # First, check if the device is connected using bluetoothctl. - if bluetoothctl info "$MAC_ADDRESS" | grep -q "Connected: yes"; then - # --- DEVICE IS CONNECTED --- - get_status - else - # --- DEVICE IS NOT CONNECTED --- - not_connected - fi -} - -# Handle click actions passed from Waybar. -case "$1" in - cycle_anc) - current_mode=$(pbpctrl get anc 2>/dev/null) - next_mode="active" - case "$current_mode" in - active) - next_mode="aware" - ;; - aware) - next_mode="off" - ;; - off) - next_mode="active" - ;; - esac - pbpctrl set anc "$next_mode" - sleep 0.1 - exit - ;; - connect) - if bluetoothctl info "$MAC_ADDRESS" | grep -q "Connected: yes"; then - notify-send "Pixel Buds Pro 2 are already connected" - exit - else - bluetoothctl connect "$MAC_ADDRESS" - exit - fi - ;; - disconnect) - if bluetoothctl info "$MAC_ADDRESS" | grep -q "Connected: yes"; then - bluetoothctl disconnect "$MAC_ADDRESS" - exit - else - notify-send "Pixel Buds Pro 2 aren't connected" - exit - fi - ;; - *) - status - exit - ;; -esac diff --git a/waybar/scripts/tlp-profile.sh b/waybar/scripts/tlp-profile.sh deleted file mode 100755 index e6a7239..0000000 --- a/waybar/scripts/tlp-profile.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -# --- Configuration --- -CRITICAL_THRESHOLD=15 -WARNING_THRESHOLD=50 -# --------------------- - -# Get the battery path from upower -battery_path=$(upower -e | grep 'BAT') - -# Handle case where no battery is found -if [ -z "$battery_path" ]; then - # Check if we are on AC power anyway - if [[ $(tlp-stat -s | grep "Power source" | awk '{print $4}') == "AC" ]]; then - printf '{"text": "", "tooltip": "AC Power (No Battery)", "class": "ac"}\n' - else - printf '{"text": "", "tooltip": "Error: Battery not found", "class": "unknown"}\n' - fi - exit 0 -fi - -# Get battery percentage and state -percentage=$(upower -i "$battery_path" | grep "percentage" | awk '{print $2}' | tr -d '%') -state=$(upower -i "$battery_path" | grep "state" | awk '{print $2}') -tlp_profile=$(tlp-stat -s | grep "Power source" | awk '{print $4}') - -# Set icon, class, and tooltip based on state and percentage -if [ "$state" == "charging" ] || [ "$tlp_profile" == "AC" ]; then - icon="" - class="charging" - tooltip="TLP: AC | Charging at ${percentage}%" -elif [ "$state" == "discharging" ]; then - tooltip="TLP: Battery | Discharging at ${percentage}%" - if [ "$percentage" -le "$CRITICAL_THRESHOLD" ]; then - icon="" # Very low - class="critical" - elif [ "$percentage" -le "$WARNING_THRESHOLD" ]; then - icon="" # Low - class="warning" - elif [ "$percentage" -le 85 ]; then - icon="" # Healthy - class="bat" - else - icon="" # Full - class="bat" - fi -else # Fallback for "fully-charged", "pending-charge", etc. - icon="" - class="charging" - tooltip="TLP: AC | Fully Charged at ${percentage}%" -fi - -# Output JSON for Waybar -printf '{"text": "%s%% %s", "tooltip": "%s", "class": "%s"}\n' "$percentage" "$icon" "$tooltip" "$class" diff --git a/waybar/scripts/volume.sh b/waybar/scripts/volume.sh deleted file mode 100755 index 1de7c85..0000000 --- a/waybar/scripts/volume.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -TYPE=$1 # "mic" for source, empty for sink - -if [ "$TYPE" == "mic" ]; then - TARGET="@DEFAULT_AUDIO_SOURCE@" -else - TARGET="@DEFAULT_AUDIO_SINK@" -fi - -# Get volume and mute status from wpctl -OUTPUT=$(wpctl get-volume $TARGET) -VOLUME_RAW=$(echo "$OUTPUT" | awk '{print $2}') -VOLUME=$(echo "$VOLUME_RAW * 100 / 1" | bc) -MUTE=$(echo "$OUTPUT" | grep -c "MUTED") - -if [ "$MUTE" -eq 1 ]; then - if [ "$TYPE" == "mic" ]; then - ICON="" - else - ICON="" - fi - printf '{"text": "%s", "class": "muted", "percentage": %d}' "$ICON" "$VOLUME" -else - if [ "$TYPE" == "mic" ]; then - ICON="" - else - if [ "$VOLUME" -le 30 ]; then - ICON="" - elif [ "$VOLUME" -le 60 ]; then - ICON="" - else - ICON="" - fi - fi - printf '{"text": "%d%% %s", "class": "unmuted", "percentage": %d}' "$VOLUME" "$ICON" "$VOLUME" -fi diff --git a/waybar/scripts/volume_combined.py b/waybar/scripts/volume_combined.py deleted file mode 100644 index dc51b42..0000000 --- a/waybar/scripts/volume_combined.py +++ /dev/null @@ -1,64 +0,0 @@ -import subprocess -import json -import sys - -def get_wpctl_status(target): - try: - output = subprocess.check_output(["wpctl", "get-volume", target], text=True) - parts = output.strip().split() - if len(parts) < 2: - return 0, False - vol = int(float(parts[1]) * 100) - muted = "[MUTED]" in output - return vol, muted - except: - return 0, False - -def get_pactl_description(target_type): - try: - cmd_info = ["pactl", "info"] - info = subprocess.check_output(cmd_info, text=True) - search_key = "Default Sink" if target_type == "sink" else "Default Source" - default_dev = next(line.split(": ")[1] for line in info.splitlines() if search_key in line) - - cmd_list = ["pactl", "list", "sinks" if target_type == "sink" else "sources"] - output = subprocess.check_output(cmd_list, text=True) - - blocks = output.split("\n\n") - for block in blocks: - if f"Name: {default_dev}" in block: - for line in block.splitlines(): - if "Description:" in line: - desc = line.split(": ")[1].strip() - # Add a small hint if it is a monitor, though cycle_input should prevent it - if ".monitor" in default_dev: - return "Monitor: " + desc[:11] - return desc[:20] - except: - pass - return "Unknown" - -try: - target_type = sys.argv[1] if len(sys.argv) > 1 else "sink" - target = "@DEFAULT_AUDIO_SINK@" if target_type == "sink" else "@DEFAULT_AUDIO_SOURCE@" - - vol, muted = get_wpctl_status(target) - name = get_pactl_description(target_type) - - if muted: - icon = "" if target_type == "sink" else "" - text = f"{name} {icon}" - cls = "muted" - else: - if target_type == "sink": - if vol <= 30: icon = "" - elif vol <= 60: icon = "" - else: icon = "" - else: - icon = "" - text = f"{name} {vol}% {icon}" - cls = "unmuted" - - print(json.dumps({"text": text, "class": cls, "percentage": vol})) -except Exception as e: - print(json.dumps({"text": "Error", "class": "error"})) diff --git a/waybar/style.css b/waybar/style.css index 5d3e302..2934cc0 100644 --- a/waybar/style.css +++ b/waybar/style.css @@ -36,6 +36,7 @@ window#waybar.bottom { #custom-volume, #custom-buds, #custom-mic, +#custom-dnd, #custom-gamemode, #custom-power_status { background-color: alpha(@surface0, 0.8); @@ -79,7 +80,7 @@ window#waybar.bottom { } /* --- Clock (Centered Pill) --- */ -#clock { +#center { background: linear-gradient(45deg, @mauve, @lavender); /* Cohesive pastel gradient */ color: @surface0; font-weight: 900; @@ -123,7 +124,10 @@ window#waybar.bottom { #custom-network #custom-sys, #custom-gpu, -#custom-disk-root { +#custom-disk-root, +#custom-mpris, +#clock, +#custom-dnd { background-color: transparent; border: none; box-shadow: none; @@ -136,7 +140,9 @@ window#waybar.bottom { #custom-mem, #custom-sys, #custom-gpu, -#custom-disk-root { +#custom-disk-root, +#custom-mpris +/* #clock */ { border-right: 1px solid alpha(@surface1, 0.5); border-radius: 0; } @@ -151,6 +157,12 @@ window#waybar.bottom { .high { color: @peach; } .max { color: @red; } +/* Stale Data Warning (Module in backoff/failure state) */ +/* .warning { + color: @peach; + opacity: 0.6; +} */ + /* --- Center Bottom Utilities --- */ #custom-gamemode.active { color: @mauve; /* Matches the workspace accent */