eww: Added bar widget
This commit is contained in:
parent
fca97c277e
commit
799fdb14fa
13 changed files with 387 additions and 1 deletions
63
bar/eww/bar.scss
Normal file
63
bar/eww/bar.scss
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
.bar {
|
||||||
|
* {
|
||||||
|
color: #a4acc5;
|
||||||
|
font-family: "JetBrainsMono Nerd Font", "Font Awesome 6 Free";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
margin: 0px 14px 0px 10px;
|
||||||
|
padding: 0px 10px 0px 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: #181926;
|
||||||
|
|
||||||
|
& > * + * {
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.time {
|
||||||
|
color: #c8906e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.connectivity {
|
||||||
|
color: #c7b68e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bluetooth {
|
||||||
|
color: #6e91ca;
|
||||||
|
}
|
||||||
|
|
||||||
|
.volume {
|
||||||
|
color: #6e91ca;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mic {
|
||||||
|
color: #a286c8;
|
||||||
|
}
|
||||||
|
|
||||||
|
& * {
|
||||||
|
.normal {
|
||||||
|
color: #86b985;
|
||||||
|
}
|
||||||
|
.warning {
|
||||||
|
color: #be8d3e;
|
||||||
|
}
|
||||||
|
.critical {
|
||||||
|
color: #cb535e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspaces {
|
||||||
|
.workspace-entry {
|
||||||
|
margin: 0px 3px 0px 3px;
|
||||||
|
padding: 0px 8px 0px 8px;
|
||||||
|
|
||||||
|
&.current {
|
||||||
|
background: #326bb9;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
210
bar/eww/bar.yuck
Normal file
210
bar/eww/bar.yuck
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
; Static vars
|
||||||
|
(defvar GIGA 1073741824)
|
||||||
|
|
||||||
|
(defpoll time :interval "10s"
|
||||||
|
`date +" %H:%M %a, %b %d"`)
|
||||||
|
|
||||||
|
(defpoll power_profile :interval "10s" :initial "" "~/.config/eww/scripts/power_profile")
|
||||||
|
(defpoll gpu_status :initial "active" :interval "2s" "cat /sys/bus/pci/devices/0000:01:00.0/power/runtime_status")
|
||||||
|
(defpoll refresh_rate :interval "10s" :initial "165" "~/.config/eww/scripts/refresh_rate")
|
||||||
|
|
||||||
|
|
||||||
|
(deflisten connectivity :initial '{"status": "down"}' "~/.config/eww/scripts/get-connectivity wlan0")
|
||||||
|
(deflisten bluetoothinfo :initial '{"count": 0}' "~/.config/eww/scripts/get-bluetooth-info")
|
||||||
|
(deflisten workspaces :initial "[]" "~/.config/eww/scripts/hypr/get-workspaces")
|
||||||
|
(deflisten current_workspace :initial "{\"id\": 1, \"title\": \"...\"}" "~/.config/eww/scripts/hypr/get-active-workspace")
|
||||||
|
(deflisten window_title :initial "{\"id\": 1, \"title\": \"...\"}" "~/.config/eww/scripts/hypr/get-window-title")
|
||||||
|
|
||||||
|
(deflisten volume :initial "{}" "~/.config/eww/scripts/get-volume")
|
||||||
|
|
||||||
|
(defwidget container [?nopadding]
|
||||||
|
(box
|
||||||
|
:class "container"
|
||||||
|
:style "padding: ${nopadding == true ? "0px" : "0px 10px 0px 10px"}"
|
||||||
|
:orientation "horizontal"
|
||||||
|
:halign "end"
|
||||||
|
:space-evenly false
|
||||||
|
(children))
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget time []
|
||||||
|
(label
|
||||||
|
:class "time"
|
||||||
|
:text time)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget connectivity []
|
||||||
|
(label
|
||||||
|
:class "connectivity"
|
||||||
|
:text " ${connectivity.status == "down" ? "down" : connectivity.ssid}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget bluetooth []
|
||||||
|
(eventbox
|
||||||
|
:onclick "bash -c 'blueman-manager &> /dev/null &'"
|
||||||
|
(label
|
||||||
|
:class "bluetooth"
|
||||||
|
:text " ${bluetoothinfo.count > 0 ? bluetoothinfo.count : bluetoothinfo.power}")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget workspaces [monitor]
|
||||||
|
(eventbox :onscroll "bash ~/.config/eww/scripts/hypr/change-active-workspace {} ${current_workspace}" :class "workspaces"
|
||||||
|
(box :space-evenly true
|
||||||
|
(label :text "${workspaces}${current_workspace}" :visible false)
|
||||||
|
(for workspace in workspaces
|
||||||
|
(eventbox :onclick "hyprctl dispatch workspace ${workspace.id}" :visible "${workspace.monitor == monitor}"
|
||||||
|
(box :class "workspace-entry ${workspace.id == current_workspace ? "current" : ""}"
|
||||||
|
(label :text "${workspace.id}")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget activewindow []
|
||||||
|
(label :text "${window_title ?: "..."}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget ram []
|
||||||
|
(label
|
||||||
|
:text " ${round(EWW_RAM.used_mem/GIGA, 1)}G/${round(EWW_RAM.total_mem/GIGA, 1)}G"
|
||||||
|
:class "${EWW_RAM.used_mem >= EWW_RAM.total_mem * 0.9 ? "critical" : EWW_RAM.used_mem >= EWW_RAM.total_mem * 0.6 ? "warning" : ""}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget cpu []
|
||||||
|
(label
|
||||||
|
:text " ${round(EWW_CPU.avg, 0)}%"
|
||||||
|
:class "${EWW_CPU.avg >= 90 ? "critical" : EWW_CPU.avg >= 60 ? "warning" :""}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget temp []
|
||||||
|
(label
|
||||||
|
:text " ${EWW_TEMPS.ACPITZ_TEMP1}°C"
|
||||||
|
:class "${EWW_TEMPS.ACPITZ_TEMP1 >= 90 ? "critical" : EWW_TEMPS.ACPITZ_TEMP1 >= 70 ? "warning" : ""}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defvar PP_STATE '{"Quiet": "normal", "Balanced": "warning", "Performance": "critical"}')
|
||||||
|
(defwidget powerprofile []
|
||||||
|
(button :onclick "~/.config/eww/scripts/power_profile next"
|
||||||
|
(label
|
||||||
|
:text " ${power_profile}"
|
||||||
|
:class "${PP_STATE[power_profile]}")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defvar GPU_ICON '{"active": "", "suspended": "", "resuming": ""}')
|
||||||
|
(defvar GPU_STATE '{"active": "warning", "suspended": "normal", "resuming": "warning"}')
|
||||||
|
(defwidget gpustatus []
|
||||||
|
(label
|
||||||
|
:text "${GPU_ICON[gpu_status]} "
|
||||||
|
:class "${GPU_STATE[gpu_status]}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget refreshrate []
|
||||||
|
(button :onclick "~/.config/eww/scripts/refresh_rate toggle"
|
||||||
|
(label
|
||||||
|
:text "${refresh_rate}Hz"
|
||||||
|
:class "${refresh_rate == "60" ? "normal" : "warning"}")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget battery []
|
||||||
|
(label
|
||||||
|
:text "${EWW_BATTERY.BAT0.status == "Discharging" ? "" : ""} ${EWW_BATTERY.BAT0.capacity}%"
|
||||||
|
:class "${EWW_BATTERY.BAT0.capacity <= 15 ? "critical" : EWW_BATTERY.BAT0.capacity <= 40 ? "warning" : "normal"}")
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget volume []
|
||||||
|
(eventbox
|
||||||
|
:onclick "pamixer -t"
|
||||||
|
:onscroll "echo {} | sed 's/up/-i/g; s/down/-d/g' | xargs -I{} pamixer {} 1"
|
||||||
|
(label
|
||||||
|
:text "${volume.speaker == "Muted" ? "" : ""} ${volume.speaker}"
|
||||||
|
:class "volume"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget mic []
|
||||||
|
(eventbox
|
||||||
|
:onclick "pamixer --default-source -t"
|
||||||
|
:onscroll "echo {} | sed 's/up/-i/g; s/down/-d/g' | xargs -I{} pamixer --default-source {} 1"
|
||||||
|
(label
|
||||||
|
:text "${volume.mic == "Muted" ? "" : ""} ${volume.mic}"
|
||||||
|
:class "mic"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget leftstuff [monitor]
|
||||||
|
(box
|
||||||
|
:space-evenly false
|
||||||
|
(container
|
||||||
|
(time)
|
||||||
|
(connectivity)
|
||||||
|
(label :text "") ; Else container spacing rule doesn't apply
|
||||||
|
(bluetooth)
|
||||||
|
)
|
||||||
|
|
||||||
|
(container
|
||||||
|
:nopadding true
|
||||||
|
(workspaces :monitor monitor)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget centerstuff []
|
||||||
|
(container
|
||||||
|
(activewindow)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget rightstuff []
|
||||||
|
(box
|
||||||
|
:space-evenly false
|
||||||
|
:halign "end"
|
||||||
|
(container
|
||||||
|
(ram)
|
||||||
|
(cpu)
|
||||||
|
(temp)
|
||||||
|
(powerprofile)
|
||||||
|
(box :space-evenly false
|
||||||
|
(gpustatus)
|
||||||
|
(refreshrate)
|
||||||
|
)
|
||||||
|
(battery)
|
||||||
|
)
|
||||||
|
(container
|
||||||
|
(volume)
|
||||||
|
(label :text "") ; Else container spacing rule doesn't apply
|
||||||
|
(mic)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwidget barwidget [monitor]
|
||||||
|
(centerbox
|
||||||
|
:class "bar"
|
||||||
|
:orientation "horizontal"
|
||||||
|
(leftstuff :monitor monitor)
|
||||||
|
(centerstuff)
|
||||||
|
(rightstuff)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(defwindow bar [?monitor]
|
||||||
|
:namespace "eww.bar"
|
||||||
|
:monitor "${monitor ?: 0}"
|
||||||
|
:geometry (geometry
|
||||||
|
:x "0%"
|
||||||
|
:y "8px"
|
||||||
|
:width "100%"
|
||||||
|
:height "38px"
|
||||||
|
:anchor "top center")
|
||||||
|
:stacking "fg"
|
||||||
|
:focusable false
|
||||||
|
:exclusive true
|
||||||
|
(barwidget :monitor "${monitor ?: 0}")
|
||||||
|
)
|
|
@ -1,4 +1,4 @@
|
||||||
* {
|
@import "./bar.scss" * {
|
||||||
all: unset;
|
all: unset;
|
||||||
font-family: "FiraCode Nerd Font";
|
font-family: "FiraCode Nerd Font";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
(include "./bar.yuck")
|
||||||
|
|
||||||
(defpoll bots
|
(defpoll bots
|
||||||
:initial `[]`
|
:initial `[]`
|
||||||
:interval "3s"
|
:interval "3s"
|
||||||
|
|
12
bar/eww/scripts/get-bluetooth-info
Executable file
12
bar/eww/scripts/get-bluetooth-info
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
info (){
|
||||||
|
power=$(bluetoothctl show | grep Powered | awk '{print $2}' | sed 's/yes/on/g; s/no/off/g')
|
||||||
|
count=$(bluetoothctl devices Connected | wc -l)
|
||||||
|
echo "{\"power\": \"${power}\", \"count\": \"${count}\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
info
|
||||||
|
dbus-monitor "interface=org.blueman.Applet" | while read -r line; do
|
||||||
|
info
|
||||||
|
done
|
18
bar/eww/scripts/get-connectivity
Executable file
18
bar/eww/scripts/get-connectivity
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/dash
|
||||||
|
|
||||||
|
if=$1
|
||||||
|
|
||||||
|
status (){
|
||||||
|
status=$(cat /sys/class/net/wlan0/operstate)
|
||||||
|
|
||||||
|
if [ "$status" != "down" ]; then
|
||||||
|
ssid=$(iw dev wlan0 link | grep SSID | awk '{print $2}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "{\"status\": \"$status\", \"ssid\": \"$ssid\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
status
|
||||||
|
iwevent 2> /dev/null | while read -r line; do
|
||||||
|
status
|
||||||
|
done
|
12
bar/eww/scripts/get-volume
Executable file
12
bar/eww/scripts/get-volume
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
volume (){
|
||||||
|
vol=$(pamixer --get-volume-human)
|
||||||
|
mic_vol=$(pamixer --default-source --get-volume-human)
|
||||||
|
echo "{\"speaker\": \"${vol^}\", \"mic\": \"${mic_vol^}\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
volume
|
||||||
|
pactl subscribe | grep --line-buffered "'change'" | while read -r line; do
|
||||||
|
volume
|
||||||
|
done
|
22
bar/eww/scripts/hypr/change-active-workspace
Executable file
22
bar/eww/scripts/hypr/change-active-workspace
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/dash
|
||||||
|
function clamp {
|
||||||
|
min=$1
|
||||||
|
max=$2
|
||||||
|
val=$3
|
||||||
|
python -c "print(max($min, min($val, $max)))"
|
||||||
|
}
|
||||||
|
|
||||||
|
direction=$1
|
||||||
|
current=$2
|
||||||
|
if test "$direction" = "down"
|
||||||
|
then
|
||||||
|
target=$(clamp 1 10 $(($current+1)))
|
||||||
|
echo "jumping to $target"
|
||||||
|
hyprctl dispatch workspace $target
|
||||||
|
elif test "$direction" = "up"
|
||||||
|
then
|
||||||
|
target=$(clamp 1 10 $(($current-1)))
|
||||||
|
echo "jumping to $target"
|
||||||
|
hyprctl dispatch workspace $target
|
||||||
|
fi
|
||||||
|
|
6
bar/eww/scripts/hypr/get-active-workspace
Executable file
6
bar/eww/scripts/hypr/get-active-workspace
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/dash
|
||||||
|
|
||||||
|
hyprctl monitors -j | jq '.[] | select(.focused) | .activeWorkspace.id'
|
||||||
|
|
||||||
|
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - |
|
||||||
|
stdbuf -o0 awk -F '>>|,' -e '/^workspace>>/ {print $2}' -e '/^focusedmon>>/ {print $3}'
|
4
bar/eww/scripts/hypr/get-window-title
Executable file
4
bar/eww/scripts/hypr/get-window-title
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/dash
|
||||||
|
hyprctl activewindow -j | jq --raw-output .title
|
||||||
|
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 awk -F '>>|,' '/^activewindow>>/{print $3}'
|
||||||
|
|
11
bar/eww/scripts/hypr/get-workspaces
Executable file
11
bar/eww/scripts/hypr/get-workspaces
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/dash
|
||||||
|
|
||||||
|
spaces (){
|
||||||
|
hyprctl workspaces -j | jq -c 'map({id: .id, windows: .windows, monitor: .monitorID})'
|
||||||
|
}
|
||||||
|
|
||||||
|
spaces
|
||||||
|
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
|
||||||
|
spaces
|
||||||
|
done
|
||||||
|
|
10
bar/eww/scripts/power_profile
Executable file
10
bar/eww/scripts/power_profile
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/dash
|
||||||
|
|
||||||
|
if [ "$1" = "next" ]; then
|
||||||
|
asusctl profile -n
|
||||||
|
profile=$(asusctl profile -p | sed s:'Active profile is '::)
|
||||||
|
eww update power_profile="$profile"
|
||||||
|
else
|
||||||
|
asusctl profile -p | sed s:'Active profile is '::
|
||||||
|
fi
|
||||||
|
|
16
bar/eww/scripts/refresh_rate
Executable file
16
bar/eww/scripts/refresh_rate
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/dash
|
||||||
|
refresh_rate=$(hyprctl -j monitors | jq '.[0].refreshRate | round')
|
||||||
|
|
||||||
|
if [ "$1" = "toggle" ]; then
|
||||||
|
if [ "$refresh_rate" = "60" ]; then
|
||||||
|
hyprctl keyword monitor eDP-1,2560x1440@165,auto,1
|
||||||
|
refresh_rate=165
|
||||||
|
else
|
||||||
|
hyprctl keyword monitor eDP-1,2560x1440@60,auto,1
|
||||||
|
refresh_rate=60
|
||||||
|
fi
|
||||||
|
eww update refresh_rate="$refresh_rate"
|
||||||
|
else
|
||||||
|
echo "$refresh_rate"
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in a new issue