updated waybar config
This commit is contained in:
+45
-45
@@ -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
|
||||
}
|
||||
*/
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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
|
||||
@@ -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 <MAC_ADDRESS>"
|
||||
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 <span size='large'></span>\", \"tooltip\": \"$tooltip\"}"
|
||||
else
|
||||
# Output empty string when no device is connected
|
||||
echo "{}"
|
||||
fi
|
||||
|
||||
|
||||
@@ -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\"}"
|
||||
@@ -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\"}"
|
||||
@@ -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
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <mountpoint>"
|
||||
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}'
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
FORMAT_ACTIVATED="<span size='large'></span>"
|
||||
FORMAT_DEACTIVATED="<span size='large'></span>"
|
||||
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
|
||||
@@ -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\"}"
|
||||
@@ -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"
|
||||
@@ -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\"}"
|
||||
@@ -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\": \"<span size='large'></span>\", \"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
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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"}))
|
||||
+15
-3
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user