This commit is contained in:
jay
2026-03-22 20:46:20 +08:00
parent a4faab3db1
commit 35abfa07bc
17 changed files with 603 additions and 216 deletions
+119
View File
@@ -0,0 +1,119 @@
$bg: #1e1e2e;
$fg: #cdd6f4;
$blue: #89b4fa;
$surface: #313244;
$crust: #11111b;
$yellow: #f9e2af;
* {
font-family: "sans-serif";
font-size: 14px;
}
window {
background-color: transparent;
}
button {
all: unset;
}
.main-container {
background-color: $bg;
color: $fg;
border-radius: 8px;
padding: 2px 5px;
margin: 1px;
}
.ws-focused {
background-color: $blue;
color: $crust;
padding: 0 8px;
border-radius: 6px;
font-weight: bold;
}
.ws-inactive {
color: #cdd6f4;
padding: 0 8px;
border-radius: 6px;
border: 1px solid #ffffff;
}
.ws-inactive:hover {
background-color: $surface;
border-radius: 6px;
}
.date-time {
padding: 0 10px;
}
.date-time:hover {
background-color: $surface;
border-radius: 6px;
}
.volume-widget, .brightness-widget {
padding: 0 5px;
}
.volume-widget button:hover, .brightness-widget button:hover {
background-color: $surface;
border-radius: 6px;
}
.popup-box {
background-color: $bg;
color: $fg;
padding: 15px;
border: 1px solid $blue;
border-radius: 8px;
}
.vol-bar trough, .br-bar trough {
background-color: $surface;
border-radius: 10px;
min-height: 4px;
}
.vol-bar highlight {
background-color: $blue;
border-radius: 10px;
}
.br-bar highlight {
background-color: $yellow;
border-radius: 10px;
}
.caffeine {
padding: 0 5px;
}
.caffeine-on {
color: $yellow;
font-weight: bold;
}
.caffeine-off {
color: $fg;
opacity: 0.6;
}
.tray-container {
padding-left: 10px;
}
.calendar-box {
background-color: $bg;
color: $fg;
padding: 15px;
border: 1px solid $blue;
border-radius: 12px;
}
calendar {
padding: 5px;
}
+87
View File
@@ -0,0 +1,87 @@
(defpoll time :interval "1s" "date '+%Y/%m/%d %H:%M:%S'")
(defpoll inhibit_status :interval "1s" "[ -f /tmp/eww-inhibit.pid ] && echo 'on' || echo 'off'")
(defpoll vol :interval "1s" :initial "0" "bash ~/.config/eww/scripts/volume.sh get")
(defpoll vol_icon :interval "1s" :initial "🔉" "bash ~/.config/eww/scripts/volume.sh icon")
(defpoll br :interval "1s" :initial "50" "bash ~/.config/eww/scripts/brightness.sh get")
(defpoll br_icon :interval "1s" :initial "☀️" "bash ~/.config/eww/scripts/brightness.sh icon")
(deflisten workspaces :initial "[]" "bash ~/.config/eww/scripts/get-workspaces.sh")
(defwidget workspaces_widget []
(box :class "workspaces" :orientation "h" :space-evenly false :spacing 5
(for ws in workspaces
(button :onclick "swaymsg workspace ${ws.name}"
:class {ws.focused ? "ws-focused" : "ws-inactive"}
"${ws.name}"))))
(defwidget date_widget []
(box :class "date-time"
(button :onclick "bash ~/.config/eww/scripts/toggle-window.sh calendar"
time)))
(defwidget volume_widget []
(box :class "volume-widget"
(button :onclick "bash ~/.config/eww/scripts/toggle-window.sh volume_popup"
:onrightclick "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
"${vol_icon} ${vol}%")))
(defwidget brightness_widget []
(box :class "brightness-widget"
(button :onclick "bash ~/.config/eww/scripts/toggle-window.sh brightness_popup"
"${br_icon} ${br}%")))
(defwidget caffeine_widget []
(box :class "caffeine"
(button :onclick "bash ~/.config/eww/scripts/toggle-inhibit.sh"
:class {inhibit_status == "on" ? "caffeine-on" : "caffeine-off"}
{inhibit_status == "on" ? "☕" : "🌙"})))
(defwidget tray_widget []
(box :halign "end" :class "tray-container" :space-evenly false :spacing 10
(brightness_widget)
(volume_widget)
(caffeine_widget)
(systray :orientation "h" :spacing 5 :icon-size 20 :prepend-new true)))
(defwidget bar_layout []
(box :class "main-container"
(centerbox :orientation "h"
(workspaces_widget)
(date_widget)
(tray_widget))))
(defwindow bar
:monitor "eDP-1"
:geometry (geometry :x "0%" :y "0%" :width "99%" :height "30px" :anchor "top center")
:stacking "fg"
:exclusive true
:focusable false
(bar_layout))
(defwindow calendar
:monitor "eDP-1"
:geometry (geometry :x "0%" :y "15px" :width "250px" :height "250px" :anchor "top center")
:stacking "fg"
:focusable false
(box :class "calendar-box"
(calendar)))
(defwindow volume_popup
:monitor "eDP-1"
:geometry (geometry :x "15px" :y "15px" :width "300px" :height "60px" :anchor "top right")
:stacking "fg"
:focusable false
(box :class "popup-box" :space-evenly false :spacing 15
(button :onclick "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" vol_icon)
(scale :class "vol-bar" :min 0 :max 101 :value {vol == "" ? 0 : vol} :width 150 :onchange "wpctl set-volume @DEFAULT_AUDIO_SINK@ {}%")
(label :text "${vol}%")))
(defwindow brightness_popup
:monitor "eDP-1"
:geometry (geometry :x "15px" :y "15px" :width "300px" :height "60px" :anchor "top right")
:stacking "fg"
:focusable false
(box :class "popup-box" :space-evenly false :spacing 15
(label :text br_icon)
(scale :class "br-bar" :min 0 :max 101 :value {br == "" ? 0 : br} :width 150 :onchange "brightnessctl s {}%")
(label :text "${br}%")))
@@ -0,0 +1,8 @@
#!/bin/bash
if ! eww ping >/dev/null 2>&1; then
eww daemon
fi
eww close-all
eww open bar --screen 'eDP-1'
@@ -0,0 +1,18 @@
#!/bin/bash
# 獲取目前亮度百分比
get_brightness() {
brightnessctl -m | awk -F, '{print substr($4, 0, length($4)-1)}'
}
case $1 in
get)
get_brightness
;;
icon)
BR=$(get_brightness)
if [ "$BR" -gt 66 ]; then echo "☀️";
elif [ "$BR" -gt 33 ]; then echo "🌤️";
else echo "🔅"; fi
;;
esac
@@ -0,0 +1,13 @@
#!/bin/bash
# 需安裝 jq
get_workspaces() {
swaymsg -t get_workspaces | jq -c 'sort_by(.num)'
}
# 初始輸出
get_workspaces
# 監聽事件並更新
swaymsg -t subscribe '["workspace"]' -m | while read -r line; do
get_workspaces
done
@@ -0,0 +1,15 @@
#!/bin/bash
# 定義 PID 檔案路徑
PID_FILE="/tmp/eww-inhibit.pid"
if [ -f "$PID_FILE" ]; then
# 讀取 PID 並殺掉程序
PID=$(cat "$PID_FILE")
kill "$PID" 2>/dev/null
rm "$PID_FILE"
else
# 啟動並記錄 PID
systemd-inhibit --what=idle --mode=block sleep infinity &
echo $! > "$PID_FILE"
fi
@@ -0,0 +1,24 @@
#!/bin/bash
# 目標視窗名稱
TARGET=$1
# 獲取目前所有已開啟的視窗名稱 (提取冒號前文字並去空格)
OPENED_WINDOWS=$(eww active-windows | cut -d: -f1 | tr -d ' ')
# 所有受管理的彈出視窗清單
MANAGED_WINDOWS=("calendar" "volume_popup" "brightness_popup")
# 遍歷目前已開啟的視窗
for win in $OPENED_WINDOWS; do
# 檢查該視窗是否在受管名單內,且不是目標視窗
# 我們不關閉 "bar" 視窗
if [[ " ${MANAGED_WINDOWS[@]} " =~ " ${win} " ]] && [ "$win" != "$TARGET" ]; then
eww close "$win"
fi
done
# 如果有目標視窗,則切換其顯示狀態
if [ -n "$TARGET" ]; then
eww open --toggle "$TARGET"
fi
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# 獲取預設輸出裝置的音量資訊 (輸出範例: Volume: 0.50 [MUTED])
GET_VOL=$(wpctl get-volume @DEFAULT_AUDIO_SINK@)
# 提取數值並轉換為百分比 (0-100)
# 使用 printf %.0f 將小數四捨五入為整數
VOL=$(echo "$GET_VOL" | awk '{print $2 * 100}' | xargs printf "%.0f")
if [ "$1" == "get" ]; then
echo "$VOL"
elif [ "$1" == "icon" ]; then
# 檢查是否含有 [MUTED] 字樣
if echo "$GET_VOL" | grep -q "\[MUTED\]"; then
echo "🔇"
else
if [ "$VOL" -gt 60 ]; then echo "🔊";
elif [ "$VOL" -gt 30 ]; then echo "🔉";
else echo "🔈"; fi
fi
fi