Wayland. Панель Waybar
2024-11-21
·
9 мин. для прочтения
Wayland. Панель Waybar
Содержание
1 Общая информация
- Репозиторий: https://github.com/Alexays/Waybar
- Wiki: https://github.com/Alexays/Waybar/wiki
2 Конфигурация
2.1 Общая информация
- Wiki: https://github.com/Alexays/Waybar/wiki/Configuration
- Конфигурация использует формат файла JSONC и называется
config
илиconfig.jsonc
. - Каталоги для этого файла:
$XDG_CONFIG_HOME/waybar/
~/.config/waybar/
~/waybar/
/etc/xdg/waybar/
SYSCONFDIR/xdg/waybar
(еслиSYSCONFDIR
установленный во время сборки, отличается от/etc
, например/usr/local/etc
в системах BSD).
2.2 Файл конфигурации
2.2.1 Начало
2.2.2 Общие настройки
1// General
2"layer": "top",
3// Waybar position (top|bottom|left|right)
4"position": "top",
5// Waybar height (to be removed for auto height)
6"height": 30,
7// Gaps between modules (4px)
8"spacing": 4,
2.2.3 Расположение модулей
1// Modules
2"modules-left": [
3 "sway/workspaces",
4 "custom/scratchpad",
5],
6"modules-center": [
7 "sway/mode",
8 "custom/weather",
9 "custom/clipboard",
10 "idle_inhibitor",
11],
12"modules-right": [
13 "memory",
14 "cpu",
15 "temperature",
16 "battery",
17 "battery#bat1",
18 "network",
19 "backlight",
20 "wireplumber",
21 "clock",
22 "sway/language",
23 "keyboard-state",
24 "tray",
25 "custom/power",
26],
2.2.4 Конфигурация модулей
Информационные модули
Память
Процессор
Батарея
1// Battery 2"battery": { 3 "bat": "BAT0", 4 "states": { 5 "full": 100, 6 "good": 95, 7 "warning": 30, 8 "critical": 15 9 }, 10 "format": "{icon} {capacity}% ({time})", 11 "format-charging": " {icon} {capacity}% ({time})", 12 "format-full": " {icon} Full", 13 "format-time": "{H}h{M}m", 14 "interval": 30, 15 "on-click": "gnome-power-statistics", 16 "format-icons": [ 17 " ", 18 " ", 19 " ", 20 " ", 21 " " 22 ] 23},
Температура подсистем
- Задаётся для температурных зон
/sys/class/thermal/
или для показаний сенсоров/sys/class/hwmon/hwmon*/temp*_input
. - Просмотреть все типы температурных зон:
1for i in /sys/class/thermal/thermal_zone*; do echo "$i: $(<$i/type)"; done
- Если нет тепловой зоны, можно использовать сенсоры (
sensors
), чтобы найти предпочтительный источник температуры:1for i in /sys/class/hwmon/hwmon*/temp*_input; do echo "$(<$(dirname $i)/name): $(cat ${i%_*}_label 2>/dev/null || echo $(basename ${i%_*})) $(readlink -f $i)"; done
- Сама конфигурация выглядит следующим образом:
1// Themperature 2"temperature": { 3 "critical-threshold": 80, 4 "interval": 5, 5 "thermal-zone": 1, 6 "format": "{icon} {temperatureC}°C", 7 "format-icons": [ 8 "", // Icon: temperature-empty 9 "", // Icon: temperature-quarter 10 "", // Icon: temperature-half 11 "", // Icon: temperature-three-quarters 12 "" // Icon: temperature-full 13 ], 14 "tooltip": true 15},
- Задаётся для температурных зон
Отображение времени
1// Clock 2"clock": { 3 "format": " {:%H:%M %F, %a} ", 4 "format-alt": " {:%A, %B %d, %Y (%R)}", 5 "tooltip-format": "<tt><small>{calendar}</small></tt>", 6 "calendar": { 7 "mode" : "year", 8 "mode-mon-col" : 3, 9 "weeks-pos" : "right", 10 "on-scroll" : 1, 11 "format": { 12 "months": "<span color='#ffead3'><b>{}</b></span>", 13 "days": "<span color='#ecc6d9'><b>{}</b></span>", 14 "weeks": "<span color='#99ffdd'><b>W{}</b></span>", 15 "weekdays": "<span color='#ffcc66'><b>{}</b></span>", 16 "today": "<span color='#ff6699'><b><u>{}</u></b></span>" 17 } 18 }, 19 "actions": { 20 "on-click-right": "mode", 21 "on-scroll-up": "tz_up", 22 "on-scroll-down": "tz_down", 23 "on-scroll-up": "shift_up", 24 "on-scroll-down": "shift_down" 25 } 26},
Состояние клавиатуры
Сеть
1// Network 2"network": { 3 "format": "{ifname}", 4 "format-wifi": " {essid}", 5 "format-ethernet": " {ifname}", 6 "format-disconnected": "", //An empty format will hide the module. 7 "tooltip-format": "{ipaddr}/{cidr} via {gwaddr}", 8 "tooltip-format-wifi": " {essid} ({signalStrength}%)", 9 "tooltip-format-ethernet": " {ipaddr}/{cidr} via {gwaddr}", 10 "tooltip-format-disconnected": " Disconnected", 11 "max-length": 50, 12 "on-click": "nm-connection-editor" 13},
Управляемые модули
Звук
Pulseaudio
1// Sound (pulseaudio) 2"pulseaudio": { 3 "format": "{icon} {volume}% {format_source}", 4 "format-bluetooth": "{icon} {volume}% {format_source}", 5 "format-bluetooth-muted": " {format_source}", 6 "format-muted": " {format_source}", 7 "format-source": " {volume}%", 8 "format-source-muted": " ", 9 "format-icons": { 10 "headphone": " ", 11 "hands-free": " ", 12 "headset": " ", 13 "phone": " ", 14 "portable": " ", 15 "car": " ", 16 "default": [ 17 "", 18 " ", 19 " " 20 ] 21 }, 22 "scroll-step": 5, 23 "on-click": "pavucontrol", 24 "on-click-right": "blueman-manager" 25},
Pipewire
1// Sound (pipewire) 2"wireplumber": { 3 "format": "{icon}{volume}%", 4 "format-muted": " ", 5 // "on-click": "helvum", 6 "on-click": "pavucontrol", 7 "on-click-middle": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle", 8 "format-icons": ["", " ", " "], 9 "max-volume": 200, 10 // "scroll-step": 0.2, 11},
Трей
Отключение засыпания экрана
Подсветка экрана
Модули Sway
Окна Sway
Режим Sway
Рабочие столы Sway
Переключатель языка Sway
Самописные модули
Погода
1// Weather 2"custom/weather": { 3 "format": "{icon}{} ", 4 "tooltip": true, 5 "interval": 3600, 6 // accepts -c/--city <city> -t/--temperature <C/F> -d/--distance <km/miles> 7 "exec": "~/.config/sway/scripts/weather.py", 8 "return-type": "json", 9 "format-icons": { 10 "Unknown": " ", 11 "Cloudy": " ", 12 "Fog": " ", 13 "HeavyRain": " ", 14 "HeavyShowers": " ", 15 "HeavySnow": " ", 16 "HeavySnowShowers": " ", 17 "LightRain": " ", 18 "LightShowers": " ", 19 "LightSleet": " ", 20 "LightSleetShowers": " ", 21 "LightSnow": " ", 22 "LightSnowShowers": " ", 23 "PartlyCloudy": " ", 24 "Sunny": " ", 25 "ThunderyHeavyRain": " ", 26 "ThunderyShowers": " ", 27 "ThunderySnowShowers": " ", 28 "VeryCloudy": " " 29 } 30},
Скратчпад
1// Scratchpad 2"custom/scratchpad": { 3 "interval": "once", 4 "escape": true, 5 "return-type": "json", 6 "format": "{icon}", 7 "format-icons": { 8 "one": " ", 9 "many": " " 10 }, 11 "exec": "/bin/sh ~/.config/sway/scripts/scratchpad.sh", 12 "on-click": "swaymsg 'scratchpad show'", 13 "signal": 7 14},
Отключение машины
1"custom/power": { 2 "format" : "⏻ ", 3 "tooltip": false, 4 "menu": "on-click", 5 "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder 6 "menu-actions": { 7 "shutdown": "shutdown", 8 "reboot": "reboot", 9 "suspend": "systemctl suspend", 10 "hibernate": "systemctl hibernate" 11 } 12},
Буфер обмена
1// Clipboard 2"custom/clipboard": { 3 "format": " ", 4 "interval": "once", 5 "return-type": "json", 6 "on-click": "swaymsg -q exec '$clipboard'; pkill -RTMIN+9 waybar", 7 "on-click-right": "swaymsg -q exec '$clipboard-del'; pkill -RTMIN+9 waybar", 8 "on-click-middle": "swaymsg -q exec '$clipboard-del-all'", 9 "exec": "printf '{\"tooltip\":\"%s\"}' $(cliphist list | wc -l)", 10 "exec-if": "[ -x \"$(command -v cliphist)\" ] && [ $(cliphist list | wc -l) -gt 0 ]", 11 "signal": 9 12},
2.2.5 Конец
1}
3 Стили
3.1 Общая информация
- Wiki: https://github.com/Alexays/Waybar/wiki/Styling
- Стилизация выполняется с использованием формата файла CSS и файла с именем
style.css
. - Можно также использовать
style-light.css
иstyle-dark.css
соответственно, чтобы следовать системной теме. - Каталоги для этого файла:
~/.config/waybar/
;~/waybar/
;/etc/xdg/waybar/
.
- Можно указывать не конкретные цвета, а цвета из GTK-темы (https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/theme/Adwaita/_colors-public.scss).
3.2 Стилевой файл
1/* Waybar configuration */
2
3/* Keyframes */
4
5@keyframes blink-warning {
6 70% {
7 color: white;
8 }
9
10 to {
11 color: white;
12 background-color: orange;
13 }
14}
15
16@keyframes blink-critical {
17 70% {
18 color: white;
19 }
20
21 to {
22 color: white;
23 background-color: red;
24 }
25}
26
27/* Base styles */
28
29/* Reset all styles */
30* {
31 border: none;
32 border-radius: 0;
33 min-height: 0;
34 margin: 0;
35 padding: 0;
36 font-family: "Iosevka Nerd Font Propo", "Font Awesome 6 Free", "Font Awesome 6 Brands", sans-serif;
37 font-size: 14px;
38}
39
40/* The whole bar */
41window#waybar {
42 /* background: @theme_fg_color; */
43 background: @theme_base_color;
44 /* background: #323232; */
45 border-bottom: 1px solid @unfocused_borders;
46 color: @theme_text_color;
47 /* color: black; */
48 /* color: white; */
49}
50
51/* Each module */
52#battery,
53#clock,
54#cpu,
55#custom-keyboard-layout,
56#memory,
57#mode,
58#network,
59#pulseaudio,
60#temperature,
61#tray {
62 padding-left: 4px;
63 padding-right: 4px;
64}
65
66/* -----------------------------------------------------------------------------
67 * Module styles
68 * -------------------------------------------------------------------------- */
69
70#battery {
71 animation-timing-function: linear;
72 animation-iteration-count: infinite;
73 animation-direction: alternate;
74}
75
76#battery.warning {
77 color: orange;
78}
79
80#battery.critical {
81 color: red;
82}
83
84#battery.warning.discharging {
85 animation-name: blink-warning;
86 animation-duration: 3s;
87}
88
89#battery.critical.discharging {
90 animation-name: blink-critical;
91 animation-duration: 2s;
92}
93
94#clock {
95 font-weight: bold;
96}
97
98#cpu {
99 /* No styles */
100}
101
102#cpu.warning {
103 color: orange;
104}
105
106#cpu.critical {
107 color: red;
108}
109
110#memory {
111 animation-timing-function: linear;
112 animation-iteration-count: infinite;
113 animation-direction: alternate;
114}
115
116#memory.warning {
117 color: orange;
118}
119
120#memory.critical {
121 color: red;
122 animation-name: blink-critical;
123 animation-duration: 2s;
124}
125
126#mode {
127 background: #64727D;
128 border-top: 2px solid white;
129 /* To compensate for the top border and still have vertical centering */
130 padding-bottom: 2px;
131}
132
133#network {
134 /* No styles */
135}
136
137#network.disconnected {
138 color: orange;
139}
140
141#pulseaudio {
142 /* No styles */
143}
144
145#pulseaudio.muted {
146 /* No styles */
147}
148
149#custom-spotify {
150 color: rgb(102, 220, 105);
151}
152
153#temperature {
154 /* No styles */
155}
156
157#temperature.critical {
158 color: red;
159}
160
161#tray {
162 /* No styles */
163}
164
165#window {
166 font-weight: bold;
167}
168
169#workspaces button {
170 border-top: 2px solid transparent;
171 /* To compensate for the top border and still have vertical centering */
172 padding-bottom: 2px;
173 padding-left: 10px;
174 padding-right: 10px;
175 color: #888888;
176}
177
178#workspaces button.focused {
179 border-color: #4c7899;
180 color: white;
181 background-color: #285577;
182}
183
184#workspaces button.urgent {
185 border-color: #c9545d;
186 color: #c9545d;
187}
4 Вспомогательные файлы
4.1 Перезапуск Waybar
- Для перезапуска можно использовать скрипт:
4.2 Меню выключения компьютера
1<?xml version="1.0" encoding="UTF-8"?>
2<interface>
3 <object class="GtkMenu" id="menu">
4 <child>
5 <object class="GtkMenuItem" id="suspend">
6 <property name="label">Suspend</property>
7 </object>
8 </child>
9 <child>
10 <object class="GtkMenuItem" id="hibernate">
11 <property name="label">Hibernate</property>
12 </object>
13 </child>
14 <child>
15 <object class="GtkMenuItem" id="shutdown">
16 <property name="label">Shutdown</property>
17 </object>
18 </child>
19 <child>
20 <object class="GtkSeparatorMenuItem" id="delimiter1"/>
21 </child>
22 <child>
23 <object class="GtkMenuItem" id="reboot">
24 <property name="label">Reboot</property>
25 </object>
26 </child>
27 </object>
28</interface>