wayland: Consolidate with mako into desktop module
Since the existing wayland module basically describes everything about my 'desktop environment' setup already anyway, might as well rename it accordingly. Additionally, mako is important for notifications in this environment so it moves here as well.
This commit is contained in:
parent
4c33a6da56
commit
2e0c992a54
12 changed files with 10 additions and 2 deletions
181
desktop/.config/waybar/config
Normal file
181
desktop/.config/waybar/config
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
{
|
||||
"layer": "top",
|
||||
"modules-left": ["river/tags", "custom/events", "custom/vidl"],
|
||||
"modules-center": ["clock", "custom/media"],
|
||||
"modules-right": ["custom/wireguard", "custom/archupdates", "pulseaudio", "backlight", "network", "cpu", "memory", "temperature", "battery", "tray"],
|
||||
"custom/archupdates": {
|
||||
"format": "{} {icon}",
|
||||
"format-alt-click": "right",
|
||||
"format-icons": {
|
||||
"default": ""
|
||||
},
|
||||
"return-type": "json",
|
||||
"exec": "~/.config/waybar/modules/archupdates 5 json",
|
||||
"interval": 3600,
|
||||
"on-click": "$TERMINAL start --class float topgrade"
|
||||
},
|
||||
"backlight": {
|
||||
"device": "intel_backlight",
|
||||
"format": "{percent}% {icon}",
|
||||
"format-icons": ["滋", "", "", ""],
|
||||
"on-scroll-up": "brightnessctl set 1%+",
|
||||
"on-scroll-down": "brightnessctl set 1%-"
|
||||
},
|
||||
"battery": {
|
||||
"format": "{capacity}% {icon}",
|
||||
"format-alt":"{capacity}% ({time}) {icon}",
|
||||
"format-alt-click": "click-right",
|
||||
"format-icons": ["", "", "", "", ""],
|
||||
"interval": 60,
|
||||
"states": {
|
||||
"warning": 30,
|
||||
"critical": 15
|
||||
},
|
||||
},
|
||||
"clock": {
|
||||
"format-alt": "{:%a, %d. %b %H:%M}",
|
||||
"format-alt-click": "click-right",
|
||||
"on-click": "gsimplecal"
|
||||
},
|
||||
"cpu": {
|
||||
"interval": 10,
|
||||
"format": "{usage}% ",
|
||||
"max-length": 10,
|
||||
"states": {
|
||||
"warning": 50,
|
||||
"critical": 80
|
||||
},
|
||||
"on-click": "$TERMINAL start --class float top",
|
||||
"on-click-right": "$TERMINAL start --class float glances"
|
||||
},
|
||||
"custom/events": {
|
||||
"format": "{}",
|
||||
"interval": 300,
|
||||
"format-icons": {
|
||||
"default": ""
|
||||
},
|
||||
"exec": "~/.config/waybar/modules/khal.py 2>/dev/null",
|
||||
"exec-if": "command -v khal >/dev/null 2>&1",
|
||||
"return-type": "json"
|
||||
},
|
||||
"memory": {
|
||||
"interval": 30,
|
||||
"format": "{avail:0.1f}G ",
|
||||
"format-alt": "{used:0.1f}G/{total:0.1f}G ",
|
||||
"format-alt-click": "click-right",
|
||||
"max-length": 10
|
||||
},
|
||||
"mpd": {
|
||||
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}",
|
||||
"format-disconnected": "ﱙ",
|
||||
"format-stopped": "",
|
||||
"interval": 10,
|
||||
"consume-icons": {
|
||||
"on": " " // Icon shows only when "consume" is on
|
||||
},
|
||||
"random-icons": {
|
||||
"on": " "
|
||||
},
|
||||
"repeat-icons": {
|
||||
"on": " "
|
||||
},
|
||||
"single-icons": {
|
||||
"on": "1 "
|
||||
},
|
||||
"state-icons": {
|
||||
"paused": "",
|
||||
"playing": "",
|
||||
},
|
||||
"tooltip-format": "{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ",
|
||||
"tooltip-format-disconnected": "MPD (disconnected)"
|
||||
},
|
||||
"custom/media": {
|
||||
"format": "{icon}{}",
|
||||
"format-alt-click": "right",
|
||||
"return-type": "json",
|
||||
"format-icons": {
|
||||
"Playing": " ",
|
||||
"Paused": " ",
|
||||
},
|
||||
"escape": true,
|
||||
"max-length":70,
|
||||
"exec": "playerctl -a metadata --format '{\"text\": \"\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
||||
"exec-if": "command -v playerctl >/dev/null 2>&1",
|
||||
"on-click": "playerctl play-pause",
|
||||
"on-click-right": "playerctl stop",
|
||||
},
|
||||
"network": {
|
||||
"interface": "wlp58s0",
|
||||
"format": "{ifname}",
|
||||
"format-wifi": "{signalStrength}% ",
|
||||
"format-ethernet": "{ipaddr}/{cidr} ",
|
||||
"format-disconnected": "睊",
|
||||
"tooltip-format": "{ifname} via {gwaddr} ",
|
||||
"tooltip-format-wifi": "{essid}: {bandwidthDownBits}-{bandwidthUpBits} ({signalStrength}%) {ifname}",
|
||||
"tooltip-format-ethernet": "{ifname} ",
|
||||
"tooltip-format-disconnected": "Disconnected",
|
||||
"max-length": 50,
|
||||
"on-click": "$TERMINAL start --class float nmtui",
|
||||
// "on-click-right": "sudo rfkill toggle wlan"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{volume}% {icon}",
|
||||
"format-bluetooth": "{volume}% {icon}",
|
||||
"format-muted": "",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"hands-free": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": ["", ""]
|
||||
},
|
||||
"scroll-step": 1,
|
||||
"on-click": "$TERMINAL start --class float pulsemixer",
|
||||
"on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +1%",
|
||||
"on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -1%"
|
||||
},
|
||||
"river/tags": {
|
||||
"num-tags": 10,
|
||||
"tag-labels": [ "", "", "", "", "", "", "", "", "", "" ]
|
||||
},
|
||||
"temperature": {
|
||||
// "thermal-zone": 2,
|
||||
"hwmon-path": "/sys/class/hwmon/hwmon5/temp1_input",
|
||||
"critical-threshold": 80,
|
||||
// "format-critical": "{temperatureC}° ",
|
||||
"format": "{temperatureC}° ",
|
||||
"on-click": "$TERMINAL start --class float watch sensors"
|
||||
},
|
||||
"tray": {
|
||||
"icon-size": 21,
|
||||
"spacing": 10
|
||||
},
|
||||
"custom/weather": {
|
||||
"exec": "curl 'https://wttr.in/?format=%t'",
|
||||
"exec-if": "command -v curl >/dev/null 2>&1",
|
||||
"interval": 3600
|
||||
},
|
||||
"custom/wireguard": {
|
||||
"format-icons": {
|
||||
"default": "嬨"
|
||||
},
|
||||
"exec": "~/.config/waybar/modules/wireguard json",
|
||||
"exec-if": "command -v nmcli >/dev/null 2>&1",
|
||||
"return-type": "json",
|
||||
"signal": 6,
|
||||
"interval": 60,
|
||||
},
|
||||
"custom/vidl": {
|
||||
"format": "{} {icon}",
|
||||
"format-alt-click": "right",
|
||||
"format-icons": {
|
||||
"default": ""
|
||||
},
|
||||
"exec": "wc -l ~/.local/share/vidl/vidl_queue | cut -d' ' -f1",
|
||||
"exec-if": "[ -f ~/.local/share/vidl/vidl_queue ]",
|
||||
"interval": 5,
|
||||
"on-click": "$TERMINAL start --class float nvim ~/.local/share/vidl/vidl_queue"
|
||||
},
|
||||
}
|
||||
58
desktop/.config/waybar/modules/archupdates
Executable file
58
desktop/.config/waybar/modules/archupdates
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Check for available archupdates and return their number.
|
||||
# Checks both repositories and aur,
|
||||
# returns empty string when 0 packages are available, so
|
||||
# that polybar simply displays nothing.
|
||||
# Can be used to generate json-like output for waybar.
|
||||
#
|
||||
# dependencies: yay, (pacman-contrib optional)
|
||||
# optional: jq
|
||||
#
|
||||
# Takes 2 arguments:
|
||||
# Takes an optional integer argument, which is the minimum
|
||||
# numer of package updates for an answer to be returned.
|
||||
min_upd=${1:-0}
|
||||
# Takes as second optional argument the output format
|
||||
# Valid value is "json", everything else returns plain-text.
|
||||
# json output requires jq.
|
||||
format=${2:-plain}
|
||||
|
||||
# prefer checkupdates since it allows checking w/o partial upgrade
|
||||
if command -v "checkupdates" >/dev/null; then
|
||||
updates_repo="$(checkupdates 2>&1)"
|
||||
fi
|
||||
|
||||
# fall back to yay, but be aware it will not find everything
|
||||
# if checkupdates finds nothing or returns an error
|
||||
if [ "$updates_repo" = "" ] || [ -z "${updates_repo##*==> ERROR: Cannot fetch updates*}" ]; then
|
||||
updates_repo="$(yay -Qun 2>/dev/null)"
|
||||
fi
|
||||
updates_repo=$(echo "$updates_repo" | wc -l)
|
||||
|
||||
updates_aur="$(yay -Qum 2>/dev/null | wc -l)"
|
||||
# updates_aur=$(cower -u 2> /dev/null | wc -l)
|
||||
# updates_aur=$(trizen -Su --aur --quiet | wc -l)
|
||||
# updates_aur=$(pikaur -Qua 2> /dev/null | wc -l)
|
||||
# updates_aur=$(rua upgrade --printonly 2> /dev/null | wc -l)
|
||||
|
||||
updates=$((updates_repo + updates_aur))
|
||||
|
||||
text="${updates}"
|
||||
alt="${updates_repo}|${updates_aur}"
|
||||
tooltip="Repositories: ${updates_repo} | AUR: ${updates_aur}"
|
||||
[ "$updates" -gt "$min_upd" ] && class="available" || class="empty"
|
||||
if [ "$format" = "json" ]; then
|
||||
printf "{\"text\": \"%s\", \"alt\": \"%s\", \"tooltip\": \"%s\", \"class\": \"%s\"}" \
|
||||
"$text" \
|
||||
"$alt" \
|
||||
"$tooltip" \
|
||||
"$class"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$updates" -gt "$min_upd" ]; then
|
||||
echo "$updates"
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
35
desktop/.config/waybar/modules/khal.py
Executable file
35
desktop/.config/waybar/modules/khal.py
Executable file
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/env python
|
||||
# from https://gist.github.com/bjesus/178a9bd3453470d74803945dbbf9ed40
|
||||
# List upcoming khal events in simple json container fit for waybar
|
||||
|
||||
import subprocess
|
||||
import datetime
|
||||
import json
|
||||
from html import escape
|
||||
|
||||
data = {}
|
||||
|
||||
today = datetime.date.today().strftime("%Y-%m-%d")
|
||||
|
||||
next_week = (datetime.date.today() + datetime.timedelta(days=10)).strftime("%Y-%m-%d")
|
||||
|
||||
output = subprocess.check_output("khal list now " + next_week, shell=True)
|
||||
output = output.decode("utf-8")
|
||||
|
||||
lines = output.split("\n")
|
||||
new_lines = []
|
||||
for line in lines:
|
||||
clean_line = escape(line).split(" ::")[0]
|
||||
if len(clean_line) and not clean_line[0] in ["0", "1", "2"]:
|
||||
clean_line = "\n<b>" + clean_line + "</b>"
|
||||
new_lines.append(clean_line)
|
||||
output = "\n".join(new_lines).strip()
|
||||
|
||||
if today in output:
|
||||
data["text"] = " " + output.split("\n")[1]
|
||||
else:
|
||||
data["text"] = ""
|
||||
|
||||
data["tooltip"] = output
|
||||
|
||||
print(json.dumps(data))
|
||||
151
desktop/.config/waybar/modules/wireguard
Executable file
151
desktop/.config/waybar/modules/wireguard
Executable file
|
|
@ -0,0 +1,151 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# nmcli WireGuard abstraction layer for use with my waybar module and rofi custom menu script
|
||||
#
|
||||
# requires nmcli on your path
|
||||
# install to the same directory as wireguard-rofi.sh
|
||||
#
|
||||
# usage: ./wireguard.sh [menu|toggle NAME]
|
||||
# no argument: print current connections
|
||||
# json: print waybar-ready json output
|
||||
# menu: print all connections
|
||||
# toggle NAME: toggle connection NAME
|
||||
|
||||
if ! command -v nmcli >/dev/null 2>&1; then
|
||||
echo "err: nmcli not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
nargs=$#
|
||||
showmenu="no"
|
||||
dotoggle="no"
|
||||
printjson="no"
|
||||
if [[ $nargs == 1 ]]; then
|
||||
if [[ $1 == "menu" ]]; then
|
||||
showmenu="yes"
|
||||
elif [[ $1 == "json" ]]; then
|
||||
printjson="yes"
|
||||
fi
|
||||
elif [[ $nargs == 2 ]]; then
|
||||
if [[ $1 == "toggle" ]]; then
|
||||
dotoggle="yes"
|
||||
conn="$2"
|
||||
fi
|
||||
fi
|
||||
|
||||
nmclicmd="nmcli connection"
|
||||
wgconns="$nmclicmd show"
|
||||
wgactive="$wgconns --active"
|
||||
|
||||
connected=()
|
||||
available=()
|
||||
|
||||
function print_as_json() {
|
||||
text="嬨" # only prints a single icon when connected
|
||||
# text="${1}" # use this line to show all output in text
|
||||
alt="${1}"
|
||||
tooltip="${1}"
|
||||
[ -n "$1" ] && class="connected" || class="disconnected"
|
||||
printf "{\"text\": \"%s\", \"alt\": \"%s\", \"tooltip\": \"%s\", \"class\": \"%s\"}" \
|
||||
"$text" \
|
||||
"$alt" \
|
||||
"$tooltip" \
|
||||
"$class"
|
||||
}
|
||||
|
||||
function get_conns {
|
||||
while read -r name _ type device; do
|
||||
if [[ $type != "wireguard" && ($type != "tun" || $device != "proton0") ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ $device != "--" ]]; then
|
||||
while read -r key value; do
|
||||
if [[ $key != "ipv4.addresses:" ]]; then
|
||||
continue
|
||||
fi
|
||||
connected+=("$name: $value")
|
||||
done < <($wgconns "$name")
|
||||
else
|
||||
available+=("$name")
|
||||
fi
|
||||
done < <($1)
|
||||
}
|
||||
|
||||
function get_pia {
|
||||
if ! command -v piactl >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
status=$(piactl get connectionstate)
|
||||
if [[ $status = "Connected" ]]; then
|
||||
connected+=("$(piactl get region): $(piactl get vpnip)")
|
||||
fi
|
||||
}
|
||||
|
||||
function print_conns {
|
||||
local first="yes"
|
||||
local array_print="$1[@]"
|
||||
local array_print=("${!array_print}")
|
||||
if [[ $2 == "list" ]]; then
|
||||
for c in "${array_print[@]}"; do
|
||||
output="$1: $c"
|
||||
done
|
||||
else
|
||||
output=""
|
||||
for c in "${array_print[@]}"; do
|
||||
if [[ "$first" != "yes" ]]; then
|
||||
output+=" | "
|
||||
fi
|
||||
output+="$c"
|
||||
first="no"
|
||||
done
|
||||
fi
|
||||
if [[ "$printjson" == "yes" ]]; then
|
||||
print_as_json "$output"
|
||||
else
|
||||
echo "$output"
|
||||
fi
|
||||
}
|
||||
|
||||
function array_contains {
|
||||
local array_has="$1[@]"
|
||||
local array_has=("${!array_has}")
|
||||
local element="$2"
|
||||
for e in "${array_has[@]}"; do
|
||||
if [[ "$e" == *"$element"* ]]; then
|
||||
echo "yes"
|
||||
return
|
||||
fi
|
||||
done
|
||||
echo "no"
|
||||
}
|
||||
|
||||
if [[ $nargs == 0 ]] || [[ $printjson = "yes" ]]; then
|
||||
get_conns "$wgactive"
|
||||
get_pia
|
||||
print_conns connected
|
||||
|
||||
elif [[ $showmenu == "yes" ]]; then
|
||||
get_conns "$wgconns"
|
||||
get_pia
|
||||
print_conns connected "list"
|
||||
print_conns available "list"
|
||||
|
||||
elif [[ $dotoggle == "yes" ]]; then
|
||||
get_conns "$wgconns"
|
||||
get_pia
|
||||
|
||||
if [[ "$(array_contains connected "$conn")" == "yes" ]]; then
|
||||
$nmclicmd down "$conn"
|
||||
elif [[ "$(array_contains available "$conn")" == "yes" ]]; then
|
||||
$nmclicmd up "$conn"
|
||||
else
|
||||
echo "err: connection not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "err: wrong args"
|
||||
exit 1
|
||||
fi
|
||||
152
desktop/.config/waybar/style.css
Normal file
152
desktop/.config/waybar/style.css
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
* {
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
font-size: 15px;
|
||||
color: @base0F;
|
||||
background-color: @base00;
|
||||
border-bottom: 1px solid @base01;
|
||||
transition-property: background-color;
|
||||
transition-duration: .5s;
|
||||
}
|
||||
|
||||
window#waybar.hidden {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
#tags button {
|
||||
font-size:17px;
|
||||
font-weight:900;
|
||||
background-color: transparent;
|
||||
color: @base03;
|
||||
margin: 0px;
|
||||
padding: 0px 5px;
|
||||
/* Use box-shadow instead of border so the text isn't offset */
|
||||
}
|
||||
/* /1* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect *1/ */
|
||||
#tags button:hover {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
/* box-shadow: inset 0 -1px #d5c4a1; */
|
||||
box-shadow: inset 0 0;
|
||||
}
|
||||
#tags button.occupied {
|
||||
font-weight: 400;
|
||||
color: @base05;
|
||||
}
|
||||
#tags button.focused {
|
||||
font-weight: 400;
|
||||
color: @base0D;
|
||||
}
|
||||
#tags button.urgent {
|
||||
color: @base0C;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#battery,
|
||||
#cpu,
|
||||
#memory,
|
||||
#disk,
|
||||
#temperature,
|
||||
#backlight,
|
||||
#network,
|
||||
#pulseaudio,
|
||||
#tray,
|
||||
#mode,
|
||||
#idle_inhibitor,
|
||||
#mpd,
|
||||
#custom-archupdates,
|
||||
#custom-wireguard,
|
||||
#custom-events,
|
||||
#custom-vidl,
|
||||
#custom-media {
|
||||
padding: 0 10px;
|
||||
margin: 0 5px;
|
||||
color: @base05;
|
||||
background-color: @base01;
|
||||
}
|
||||
|
||||
/* If workspaces is the leftmost module, omit left margin */
|
||||
.modules-left > widget:first-child > #tags {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* If workspaces is the rightmost module, omit right margin */
|
||||
.modules-right > widget:last-child > #tags {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#battery.charging, #battery.plugged {
|
||||
background-color: @base02;
|
||||
}
|
||||
|
||||
#battery.warning {
|
||||
background-color: @base09;
|
||||
color: @base00;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
to {
|
||||
background-color: @base08;
|
||||
color: @base00;
|
||||
}
|
||||
}
|
||||
|
||||
#battery.critical:not(.charging) {
|
||||
color: @base05;
|
||||
background-color: @base00;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
animation-timing-function: linear;
|
||||
animation-iteration-count: infinite;
|
||||
animation-direction: alternate;
|
||||
}
|
||||
|
||||
#cpu.warning {
|
||||
color: @base00;
|
||||
background-color: @base0A;
|
||||
}
|
||||
#cpu.critical {
|
||||
color: @base05;
|
||||
background-color: @base08;
|
||||
}
|
||||
|
||||
#custom-archupdates.empty {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#custom-wireguard.disconnected {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#temperature.critical {
|
||||
background-color: @base08;
|
||||
}
|
||||
|
||||
#tray > .passive {
|
||||
-gtk-icon-effect: dim;
|
||||
}
|
||||
|
||||
|
||||
#tray > .needs-attention {
|
||||
-gtk-icon-effect: highlight;
|
||||
}
|
||||
|
||||
#mpd.disconnected {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
@import "/home/marty/.local/share/waybar/colorscheme.css";
|
||||
Loading…
Add table
Add a link
Reference in a new issue