From b90305836064413d3cce528f44235455d7d76a24 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 12 Mar 2025 21:37:28 +0100 Subject: [PATCH] adds waybar --- .config/waybar/config | 376 ++++++++++++++++++++++++++++++ .config/waybar/modules/mail.py | 42 ++++ .config/waybar/modules/spotify.sh | 18 ++ .config/waybar/modules/storage.sh | 24 ++ .config/waybar/modules/weather.sh | 79 +++++++ 5 files changed, 539 insertions(+) create mode 100644 .config/waybar/config create mode 100755 .config/waybar/modules/mail.py create mode 100755 .config/waybar/modules/spotify.sh create mode 100755 .config/waybar/modules/storage.sh create mode 100755 .config/waybar/modules/weather.sh diff --git a/.config/waybar/config b/.config/waybar/config new file mode 100644 index 0000000..3b6394e --- /dev/null +++ b/.config/waybar/config @@ -0,0 +1,376 @@ +{ + // ------------------------------------------------------------------------- + // Global configuration + // ------------------------------------------------------------------------- + + "layer": "top", + + "position": "top", + + //"height": 20, + + "margin-left": 10, + "margin-bottom": 0, + "margin-right": 10, + + "spacing": 5, // Gaps between modules (4px) + + "modules-left": [ + //"custom/rofi", + "hyprland/workspaces", + //"hyprland/submap", + "temperature", + //"idle_inhibitor", + //"mpd" + "custom/spotify" + ], + "modules-center": [ + //"hyprland/window" + "clock#date", + "custom/weather" + //"custom/gammastep" + ], + "modules-right": [ + "backlight", + "custom/storage", + "memory", + "cpu", + "battery", + //"pulseaudio", + "wireplumber", + "custom/screenshot_t", + "tray", + "custom/power" + ], + + + // ------------------------------------------------------------------------- + // Modules + // ------------------------------------------------------------------------- + + "custom/sp1": { + "format": " | ", + "tooltip": false + }, + "custom/sp2": { + "format": " |", + "tooltip": false + }, + + + "custom/rofi": { + "format": "", + "tooltip": false, + "on-click-right": "nwg-drawer", + "on-click": "wofi --show run", + "on-click-middle": "pkill -9 wofi" + }, + "custom/screenshot_t":{ + "format":" ", + "on-click": "~/.config/hypr/scripts/screenshot_full", + "on-click-right":"~/.config/hypr/scripts/screenshot_area" + }, + + "clock#1": { + "format": " {:%a}", + "tooltip": false, + "on-click": "gsimplecal" + }, + "clock#2": { + "format": " {:%d-%h-%Y}", + "tooltip": false, + "on-click": "gsimplecal" + }, + "clock#3": { + "format": " {:%H:%M:%S %p}", + "tooltip": false, + "on-click": "gsimplecal" + }, + + "temperature": { + // "thermal-zone": 1, + "interval": 4, + //"hwmon-path": "/sys/class/hwmon/hwmon3/temp1_input", + "critical-threshold": 80, + // "format-critical": " {temperatureC}°C", + "format-critical": " {temperatureC}°C", + "format": "{icon} {temperatureC}°C", + "format-icons": ["", "", ""], + "max-length": 7, + "min-length": 7, + "on-click": "xsensors" + }, + + "memory": { + "interval": 30, + "format": " {used:0.2f} / {total:0.0f} GB", + "on-click": "alacritty -e btop" + }, + + "battery": { + "interval": 2, + "states": { + "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", + "format-icons": [ + "", + "", + "", + "", + "" + ] + }, + "network": { + "format-wifi": " {essid} ({signalStrength}%)", + "format-ethernet": "{ifname}: {ipaddr}/{cidr} ", + "format-linked": "{ifname} (No IP) ", + "format": "", + "format-disconnected": "", + "format-alt": "{ifname}: {ipaddr}/{cidr}", + "on-click": "wl-copy $(ip address show up scope global | grep inet | head -n1 | cut -d/ -f 1 | tr -d [:space:] | cut -c5-)", + "on-click-right": "wl-copy $(ip address show up scope global | grep inet6 | head -n1 | cut -d/ -f 1 | tr -d [:space:] | cut -c6-)", + "tooltip-format": " {bandwidthUpBits}  {bandwidthDownBits}\n{ifname}\n{ipaddr}/{cidr}\n", + "tooltip-format-wifi": " {essid} {frequency}MHz\nStrength: {signaldBm}dBm ({signalStrength}%)\nIP: {ipaddr}/{cidr}\n {bandwidthUpBits}  {bandwidthDownBits}", + "interval": 10 + }, + "custom/storage": { + "format": " {}", + "format-alt": "{percentage}% ", + "format-alt-click": "click-right", + "return-type": "json", + "interval": 60, + "exec": "~/.config/waybar/modules/storage.sh" + }, + + "backlight": { + "device": "intel_backlight", + "format": "{icon} {percent}%", + "format-alt": "{percent}% {icon}", + "format-alt-click": "click-right", + //"format-icons": ["", ""], + "format-icons": ["", ""], + "on-scroll-down": "brightnessctl s 5%-", + "on-scroll-up": "brightnessctl s +5%" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + }, + "tooltip": "true" + }, + "custom/weather": { + "format": "{}", + "format-alt": "{alt}: {}", + "format-alt-click": "click-right", + "interval": 3600, + "exec": "curl -s 'https://wttr.in/?format=1'", + //"return-type": "json", + //"exec": "~/.config/waybar/modules/weather.sh", + "exec-if": "ping wttr.in -c1" + }, + "custom/pacman": { + "format": "􏆲 {}", + "interval": 3600, // every hour + "exec": "checkupdates | wc -l", // # of updates + "exec-if": "exit 0", // always run; consider advanced run conditions + "on-click": "alacritty -e 'paru'; pkill -SIGRTMIN+8 waybar", // update system + "signal": 8, + "max-length": 5, + "min-length": 3 + }, + +"custom/spotify": { + "exec": "~/.config/waybar/mediaplayer.py --player spotify", + "format": "{} ", + "return-type": "json", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl next", + "on-scroll-down": "playerctl previous" +}, + + "custom/media": { + "format": "{0} {1}", + "return-type": "json", + "max-length": 40, + "format-icons": { + "spotify": "", + "default": "🎜" + }, + "escape": true, + //"exec": "~/.config/waybar/mediaplayer.py" // Script in resources folder + // "exec": "~/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name + }, + + "custom/power": { + "format": " 󰐥 ", + "tooltip": false, + "on-click": "wlogout" + }, + + "clock": { + "format": " {:%H:%M  %e %b}", + "tooltip-format": "{:%Y %B}\n{calendar}", + "today-format": "{}" + }, + + "clock#date": { + "format": "󰥔 {:%H:%M \n %e %b}", + "tooltip-format": "{:%Y %B}\n{calendar}", + "today-format": "{}" + }, + + "custom/gammastep": { + "interval": 5, + "return-type": "json", + "exec": { + "pre": "if unit_status=\"$(systemctl --user is-active gammastep)\"; then\nstatus=\"$unit_status ($(journalctl --user -u gammastep.service -g 'Period: ' | tail -1 | cut -d ':' -f6 | xargs))\"\nelse\nstatus=\"$unit_status\"\nfi", + "alt": "${status:-inactive}", + "tooltip": "Gammastep is $status", + }, + "format": "{icon}", + "format-icons": { + "activating": "󰁪 ", + "deactivating": "󰁪 ", + "inactive": "? ", + "active (Night)": " ", + "active (Nighttime)": " ", + "active (Transition (Night)": " ", + "active (Transition (Nighttime)": " ", + "active (Day)": " ", + "active (Daytime)": " ", + "active (Transition (Day)": " ", + "active (Transition (Daytime)": " ", + }, + "on-click": "systemctl --user is-active gammastep && systemctl --user stop gammastep || systemctl --user start gammastep", + }, + + "cpu": { + "interval": 1, + //"format": " {}%", // Icon: microchip + "format": "{max_frequency}GHz | {usage}%", + "max-length": 13, + "min-length": 13 + }, + + "mpd": { + "max-length": 25, + "format": " {title}", + "format-paused": " {title}", + "format-stopped": "", + "format-disconnected": "", + "on-click": "mpc --quiet toggle", + "on-click-right": "mpc update; mpc ls | mpc add", + "on-click-middle": "alacritty -e ncmpcpp", + "on-scroll-up": "mpc --quiet prev", + "on-scroll-down": "mpc --quiet next", + "smooth-scrolling-threshold": 5, + "tooltip-format": "{title} - {artist} ({elapsedTime:%M:%S}/{totalTime:%H:%M:%S})" + }, + + "custom/title": { + "format": "{}", + "interval": 0, + "return-type": "json", + //"max-length": 35, + "tooltip": false + }, + + "custom/title#name": { + "format": "{}", + "interval": 0, + "return-type": "json", + + "max-length": 35, + "exec": "$HOME/.scripts/title" + }, + + /*"custom/keyboard": { + "format": " {}", + "interval": 1, + "exec": "$HOME/.config/waybar/get_kbdlayout.sh" + },*/ + + "hyprland/workspaces": { + "all-outputs": true, + "format": "{name}", + "format-icons": { + "1": "一", + "2": "二", + "3": "三", + "4": "四", + "5": "五", + "6": "六", + "7": "七", + "8": "八", + "9": "九", + "10": "十", + }, + "on-scroll-up": "hyprctl dispatch workspace e+1 1>/dev/null", + "on-scroll-down": "hyprctl dispatch workspace e-1 1>/dev/null", + "sort-by-number": true, + "active-only": false, + }, + + "hyprland/window": { + "max-length": 100, + "separate-outputs": true + }, + + "pulseaudio": { + "scroll-step": 3, // %, can be a float + "format": "{icon} {volume}% {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + //"format-source": "{volume}% ", + //"format-source-muted": "", + "format-source": "", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol", + "on-click-right": "amixer sset Master toggle" + }, + + "wireplumber": { + "on-click": "pavucontrol", + "on-click-right": "amixer sset Master toggle 1>/dev/null", + //on-click: "${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle"; + //on-scroll-down: "${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 0.04+"; + //on-scroll-up: "${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 0.04-"; + "format": "{icon} {volume}%", + "format-muted": " ", + "format-source": "", + "format-source-muted": "", + //"format-muted": "", + //"format-icons": [ "" ] + "format-icons": { + "headphone": " ", + "hands-free": " ", + "headset": " ", + "phone": " ", + "portable": " ", + "car": " ", + "default": [" ", " ", " "] + }, + }, + + "tray": { + "icon-size": 15, + "spacing": 5 + } +} diff --git a/.config/waybar/modules/mail.py b/.config/waybar/modules/mail.py new file mode 100755 index 0000000..abc36ec --- /dev/null +++ b/.config/waybar/modules/mail.py @@ -0,0 +1,42 @@ +#!/usr/bin/python + +import os +import imaplib + +import mailsecrets + +def getmails(username, password, server): + imap = imaplib.IMAP4_SSL(server, 993) + imap.login(username, password) + imap.select('INBOX') + ustatus, uresponse = imap.uid('search', None, 'UNSEEN') + if ustatus == 'OK': + unread_msg_nums = uresponse[0].split() + else: + unread_msg_nums = [] + + fstatus, fresponse = imap.uid('search', None, 'FLAGGED') + if fstatus == 'OK': + flagged_msg_nums = fresponse[0].split() + else: + flagged_msg_nums = [] + + return [len(unread_msg_nums), len(flagged_msg_nums)] + +ping = os.system("ping " + mailsecrets.server + " -c1 > /dev/null 2>&1") +if ping == 0: + mails = getmails(mailsecrets.username, mailsecrets.password, mailsecrets.server) + text = '' + alt = '' + + if mails[0] > 0: + text = alt = str(mails[0]) + if mails[1] > 0: + alt = str(mails[1]) + "  " + alt + else: + exit(1) + + print('{"text":"' + text + '", "alt": "' + alt + '"}') + +else: + exit(1) diff --git a/.config/waybar/modules/spotify.sh b/.config/waybar/modules/spotify.sh new file mode 100755 index 0000000..c00622b --- /dev/null +++ b/.config/waybar/modules/spotify.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +class=$(playerctl metadata --player=spotify --format '{{lc(status)}}') +icon="" + +if [[ $class == "playing" ]]; then + info=$(playerctl metadata --player=spotify --format '{{artist}} - {{title}}') + if [[ ${#info} > 40 ]]; then + info=$(echo $info | cut -c1-40)"..." + fi + text=$info" "$icon +elif [[ $class == "paused" ]]; then + text=$icon +elif [[ $class == "stopped" ]]; then + text="" +fi + +echo -e "{\"text\":\""$text"\", \"class\":\""$class"\"}" diff --git a/.config/waybar/modules/storage.sh b/.config/waybar/modules/storage.sh new file mode 100755 index 0000000..ae2a5ce --- /dev/null +++ b/.config/waybar/modules/storage.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +mount="/" +warning=20 +critical=10 + +df -h -P -l "$mount" | awk -v warning=$warning -v critical=$critical ' +/\/.*/ { + text=$4 + tooltip="Filesystem: "$1"\rSize: "$2"\rUsed: "$3"\rAvail: "$4"\rUse%: "$5"\rMounted on: "$6 + use=$5 + exit 0 +} +END { + class="" + gsub(/%$/,"",use) + if ((100 - use) < critical) { + class="critical" + } else if ((100 - use) < warning) { + class="warning" + } + print "{\"text\":\""text"\", \"percentage\":"use",\"tooltip\":\""tooltip"\", \"class\":\""class"\"}" +} +' diff --git a/.config/waybar/modules/weather.sh b/.config/waybar/modules/weather.sh new file mode 100755 index 0000000..06157ef --- /dev/null +++ b/.config/waybar/modules/weather.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +cachedir=~/.cache/rbn +cachefile=${0##*/}-$1 + +if [ ! -d $cachedir ]; then + mkdir -p $cachedir +fi + +if [ ! -f $cachedir/$cachefile ]; then + touch $cachedir/$cachefile +fi + +# Save current IFS +SAVEIFS=$IFS +# Change IFS to new line. +IFS=$'\n' + +cacheage=$(($(date +%s) - $(stat -c '%Y' "$cachedir/$cachefile"))) +if [ $cacheage -gt 1740 ] || [ ! -s $cachedir/$cachefile ]; then + data=($(curl -s https://en.wttr.in/$1\?0qnT 2>&1)) + echo ${data[0]} | cut -f1 -d, > $cachedir/$cachefile + echo ${data[1]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile + echo ${data[2]} | sed -E 's/^.{15}//' >> $cachedir/$cachefile +fi + +weather=($(cat $cachedir/$cachefile)) + +# Restore IFSClear +IFS=$SAVEIFS + +temperature=$(echo ${weather[2]} | sed -E 's/([[:digit:]])+\.\./\1 to /g') + +#echo ${weather[1]##*,} + +# https://fontawesome.com/icons?s=solid&c=weather +case $(echo ${weather[1]##*,} | tr '[:upper:]' '[:lower:]') in +"clear" | "sunny") + condition="" + ;; +"partly cloudy") + condition="杖" + ;; +"cloudy") + condition="" + ;; +"overcast") + condition="" + ;; +"mist" | "fog" | "freezing fog") + condition="" + ;; +"patchy rain possible" | "patchy light drizzle" | "light drizzle" | "patchy light rain" | "light rain" | "light rain shower" | "rain") + condition="" + ;; +"moderate rain at times" | "moderate rain" | "heavy rain at times" | "heavy rain" | "moderate or heavy rain shower" | "torrential rain shower" | "rain shower") + condition="" + ;; +"patchy snow possible" | "patchy sleet possible" | "patchy freezing drizzle possible" | "freezing drizzle" | "heavy freezing drizzle" | "light freezing rain" | "moderate or heavy freezing rain" | "light sleet" | "ice pellets" | "light sleet showers" | "moderate or heavy sleet showers") + condition="ﭽ" + ;; +"blowing snow" | "moderate or heavy sleet" | "patchy light snow" | "light snow" | "light snow showers") + condition="流" + ;; +"blizzard" | "patchy moderate snow" | "moderate snow" | "patchy heavy snow" | "heavy snow" | "moderate or heavy snow with thunder" | "moderate or heavy snow showers") + condition="ﰕ" + ;; +"thundery outbreaks possible" | "patchy light rain with thunder" | "moderate or heavy rain with thunder" | "patchy light snow with thunder") + condition="" + ;; +*) + condition="" + echo -e "{\"text\":\""$condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}" + ;; +esac + +#echo $temp $condition + +echo -e "{\"text\":\""$temperature $condition"\", \"alt\":\""${weather[0]}"\", \"tooltip\":\""${weather[0]}: $temperature ${weather[1]}"\"}"