Linux: polybar – статус-бар, пример настройки и использования в Openbox вместе с tint2

By | 10/05/2018
 

С момента установки первого Arch Linux – я пользуюсь Openbox WM и tint2 для отображения панелей.

Но tint2, как где-то писали – “Капризна, как школьница“.

В целом он отлично работает, но вот трей отрисовывает значки запущенных приложений достаточно криво:

Потому, после установки Arch в очередной раз (дома менял диск на SSD, переустанавливал систему) – решил поискать другие варианты.

Попробовал polybar – очень понравился по функционалу и настройкам, попробую использовать его.

Основной недостаток polybar – отсутствие панели задач с запущенными приложениями, taskbar, потому – скомбинирую его с tint2 – часть экрана будет под таскбар от tint2, часть – под трей от polybar.

Установка

Устанавливаем:

yaourt -S polybar

Для проверки – запускаем тестовую панель:

install -Dm644 /usr/share/doc/polybar/config $HOME/.config/polybar/config
polybar example

Настройка

ОК, теперь настроим polybar под себя.

Что хочется видеть:

  • верхную панельку:
    • часики
    • иконка звука
    • апплет батареи
    • температуру
    • CPU load и Mem usage
    • использование дисков
    • меню запуска приложений
  • нижняя панель:
    • таскбар с открытыми окнами
    • системный трей

Документация – на официальной Wiki.

Убиваем все запущенные панели tint2:

killall tint2

Создаём свой конфиг – ~/.config/polybar/setevoy-polybar.conf, пока добавляем только цвета, указание монитора, на котором его отображать, поверим вид системного трея и один модуль – date:

[colors]
background = #222
background-alt = #444
foreground = #dfdfdf
foreground-alt = #555
primary = #ffb52a
secondary = #e60053
alert = #bd2c40

[bar/top]
monitor = HDMI-1
width = 100%
height = 27
radius = 6.0
fixed-center = false

background = ${colors.background}
foreground = ${colors.foreground}

line-size = 3
line-color = #f00

border-size = 4
border-color = #00000000

padding-left = 0
padding-right = 2

module-margin-left = 1
module-margin-right = 2

font-0 = fixed:pixelsize=10;1
font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
font-2 = siji:pixelsize=10;1

modules-right = date

tray-detached = false
tray-position = right
tray-offset-x = 0
tray-offset-y = 0
tray-maxsize = 16
tray-padding = 0
tray-scale = 1

[module/date]
type = internal/date
interval = 1.0
date = %Y-%m-%d%
time = %H:%M
date-alt = %A, %d %B %Y
time-alt = %H:%M:%S
label = %date% %time%
label-font = 3

Запускаем:

polybar -c setevoy-polybar.conf top

Батарея

Добавим отображение состояния батареи.

Добавляем новый модуль, пока в минимальной конфигурации:

[module/battery]
type = internal/battery

; Use the following command to list batteries and adapters:
; $ ls -1 /sys/class/power_supply/
battery = BAT0
adapter = ADP1

И в modules-right добавляем его вызов:

...
modules-right = battery date
...

Иконки

Рядом с % заряда хочется выводить иконку, отображающую статус.

Для этого потребуется коллекция иконок, документация по шрифтам-иконкам тут>>>, по модулю batteryтут>>>.

На Arch Linux устанавливаем:

sudo pacman -S ttf-font-awesome

Проверяем:

fc-list | grep Awe
/usr/share/fonts/TTF/fa-regular-400.ttf: Font Awesome 5 Free:style=Regular
/usr/share/fonts/TTF/fa-solid-900.ttf: Font Awesome 5 Free:style=Solid
/usr/share/fonts/TTF/fa-brands-400.ttf: Font Awesome 5 Brands:style=Regular

Добавляем шрифт в конфиг:

...
font-0 = fixed:pixelsize=10;1
font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
font-2 = siji:pixelsize=10;1
font-3 = Material Icons:style=Regular
font-4 = FontAwesome 5 Free:size=10:style=Solid;3
...

Находим нужную иконку на странице https://fontawesome.com/cheatsheet, копируем её, вставляем:

...
[module/battery]
type = internal/battery
label-font = 5

; Use the following command to list batteries and adapters:
; $ ls -1 /sys/class/power_supply/
battery = BAT0
adapter = AC0

label-full = �~I~@ %percentage%

(она и в vim-е так же выглядит, наверно нужен плагин, Sublime Text тоже не отображает)

Ещё один нюанс – тут указывается label-font +1 от его индекса в списке.

Т.е. если FontAwesome указан как font-4 – то в модуле его указываем как label-font = 5. Но шрифт в модуле можно не указывать вообще – тогда Polybar будет искать иконку во всех загруженных им шрифтах.

Запускаем polybar, можно с опцией -l info, что бы вывести список загруженных шрифтов – полезно при дебаге шрифтов:

polybar -c setevoy-polybar.conf -l info top
* Loading config: setevoy-polybar.conf
* Loaded monitor HDMI-1 (1920x1080+0+0)
* Bar geometry: 1920x27+0+0
* Starting application
* Starting module/battery
* Starting module/date
* Entering event loop (thread-id=1)
* Eventqueue worker (thread-id=4)
* Configured DPI = 96x96
* Loaded font "fixed:pixelsize=10" (name=DejaVu Sans, offset=1, file=/usr/share/fonts/TTF/DejaVuSans.ttf)
* Loaded font "unifont:fontformat=truetype:size=8:antialias=false" (name=DejaVu Sans, offset=0, file=/usr/share/fonts/TTF/DejaVuSans.ttf)
* Loaded font "siji:pixelsize=10" (name=DejaVu Sans, offset=1, file=/usr/share/fonts/TTF/DejaVuSans.ttf)
* Loaded font "Material Icons:pixelsize=11" (name=Material Icons, offset=2, file=/usr/share/fonts/TTF/MaterialIcons-Regular.ttf)
* Loaded font "FontAwesome 5 Free:size=10:style=Solid" (name=Font Awesome 5 Free, offset=3, file=/usr/share/fonts/TTF/fa-solid-900.ttf)
...

И получаем иконку батареи:

Теперь добавим анимацию зарядки и разрядки.

Для отображения разряда батареи добавляем label-discharging = %time%, который будет выводить оставшееся время, animation-discharging-0-4, в котором перечисляем иконки, animation-discharging-framerate, где указывается время в мс, через которые анимация будет меняться, и затем в format-discharging – указываем <animation-discharging> и <label-discharging>.

Для указания адаптера и батереи – проверяем их имена в системе:

ls -1 /sys/class/power_supply/
ACAD
BAT1
hidpp_battery_0

Получается такой модуль:

...
[module/battery]
type = internal/battery
label-font = 5

; Use the following command to list batteries and adapters:
; $ ls -1 /sys/class/power_supply/
battery = BAT1
adapter = ACAD

label-full = �~I~@ %percentage%%

label-discharging = %time%
format-discharging = <animation-discharging> <label-discharging>

animation-discharging-0 = �~I~@
animation-discharging-1 = �~I~A
animation-discharging-2 = �~I~B
animation-discharging-3 = �~I~C
animation-discharging-4 = �~I~D
animation-discharging-framerate = 1000

Иконки для animation-discharging-{1-4} можно копировать по ссылке выше, или прямо из документации к модулю, хотя Chromium их и не отображает (может его перезапустить надо, что бы шрифты подтянул).

Запускаем, проверяем:

Аналогично делаем для процесса зарядки:

...
label-charging = %percentage%%
format-charging = <animation-charging> <label-charging>

animation-charging-0 = �~I~D
animation-charging-1 = �~I~C
animation-charging-2 = �~I~B
animation-charging-3 = �~I~A
animation-charging-4 = �~I~@
animation-charging-framerate = 1000

Форматирование даты и Action

Добавим иконки и форматирование для даты.

...
[module/date]
type = internal/date
interval = 1
time =  %d/%m/%Y |  %H:%M:%S
format-prefix-foreground = ${colors.foreground-alt}
label = %time%
format = %{A1:zenity --calendar:} <label> %{A}
...

В format добавляем вызов календаря zenity по клику левой кнопкой мышки, используя Action.

В time задаём формат вывода – дату | время, а потом выводим %time% в format.

Результат:

Правда – календарь открывается в окне с konsole… То ли баг, то ли особенность zenity или самого polybar – можно поискать другой календарик, попробовать. Пока оставлю так.

Volume

Модуль звука я просто спионерил отсюда>>> (см. больше ссылок на примеры в конце поста), выглядит приятно:

Filesystem

Выводим информацию о смонтированных разделах и свободном месте на них, используя модуль filesystem:

...
[module/filesystem]
type = internal/fs
interval = 25

mount-0 = /
mount-1 = /home

label-mounted =  %mountpoint% free: %percentage_free%% of %total%
label-mounted-padding = 1

CPU/Memory

Добавляем модули для отображения CPU и памяти, рисуем ramp для наглядности:

...
[module/cpu]
; https://github.com/guisilvano/dotfiles/blob/master/polybar/config#L178
format-label = internal/cpu

format = <label> <ramp-load>

ramp-load-0 = ▁
ramp-load-1 = ▂
ramp-load-2 = ▃
ramp-load-3 = ▄
ramp-load-4 = ▅
ramp-load-5 = ▆
ramp-load-6 = ▇
ramp-load-7 = █

type = internal/cpu
interval = 2
label = " %percentage:2:2%%"

[module/memory]
type = internal/memory
interval = 2

label = " %percentage_used%%"
format = <label> <ramp-used>

ramp-used-0 = ▁
ramp-used-1 = ▂
ramp-used-2 = ▃
ramp-used-3 = ▄
ramp-used-4 = ▅
ramp-used-5 = ▆
ramp-used-6 = ▇
ramp-used-7 = █

Тут есть проблема – когда % CPU становится двумя цифрами, а не одной – то иконка смещается:

Это можно попробовать решить задав минимальный и максимальный размер, см. форматирование:

...
type = internal/cpu
interval = 2
label = " %percentage:2:2%%"
...

WiFi

Добавляем отображение подключения к WiFi.

Находим интерфейс:

ip a s | grep wlp
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

Добавляем модуль:

...
[module/wlan]
type = internal/network
interface = wlp2s0
interval = 3.0

format-connected-padding = 1
format-disconnected-padding = 1

format-connected = <label-connected>

label-connected = %essid%
label-disconnected = 

Температура

Тут в warn-temperature задаём значение, при достижении которого цвет будет меняться на красный (label-warn-foreground):

...
[module/temperature]
type = internal/temperature
warn-temperature = 70

units = true

format = <label>
format-warn = <label-warn>

label = TEMP %temperature-c%
label-warn = TEMP %temperature-c%
label-warn-foreground = #f00

Menu

Очень интересный модуль, недостаток – нельзя использовать больше одного, поэтому всё добавляется в подменюшки.

У меня получился следующим:

...
[module/menu]
type = custom/menu

format = <label-toggle> <menu>

label-open = " Apps "
label-close = "  "

menu-0-0 = " Browsers "
menu-0-0-exec = menu-open-1
menu-0-1 = " Chats "
menu-0-1-exec = menu-open-2
menu-0-2 = " Power "
menu-0-2-exec = menu-open-3

menu-1-0 = " Chromium "
menu-1-0-exec = chromium &
menu-1-1 = " Firefox"
menu-1-1-exec = firefox &

menu-2-0 = " Skype "
menu-2-0-exec = skypeforlinux &
menu-2-1 = " Slack "
menu-2-1-exec = slack &
menu-2-2 = " Viber "
menu-2-2-exec = viber &
menu-2-3 = " Telegram"
menu-2-3-exec = telegram-desktop &

menu-3-0 = " shutdown "
menu-3-0-exec = shutdown -P now
menu-3-1 = " restart "
menu-3-1-exec = shutdown -r now
menu-3-2 =  " cancel"

Добавляем его в левую часть панели:

...
modules-right = cpu memory filesystem wlan volume temperature battery date
modules-left = menu
...

Script

Последним хочется вывести имя хоста, используем script модуль:

...
[module/hostname]
type = custom/script
exec = echo $HOSTNAME
format = <label>

systray от polybar + taskbar от tint2

Т.к. polybar не умеет taskbar в Openbox – закостылим.

Идея в том, что бы запустить внизу панель tint2 с таскабаром, и одновременно там же – polybar с отображением раскладки и системного трея.

Выделим 90% под taskbar tint2, и 10% – под трей polybar-а.

Конфиг нижней панели tint2 выглядит так:

...
#-------------------------------------
# Panel
panel_items = T
panel_size = 100% 32
panel_margin = 0 0
panel_padding = 4 2 4
panel_background_id = 1
...

Меняем его на:

...
#-------------------------------------
# Panel
panel_items = T
#panel_size = 100% 32
panel_size = 90% 32
panel_margin = 0 0
panel_padding = 4 2 4
panel_background_id = 1
wm_menu = 0
panel_dock = 0
panel_position = bottom left horizontal
...

В конфиг polybar добавляем модуль для отображения раскладки клавиатуры:

...
[module/keyboard]
type = internal/xkeyboard
blacklist-0 = num lock
blacklist-1 = scroll lock

Добавляем новый bar:

...
[bar/bottom]
monitor = HDMI-1
bottom = true
width = 10%
height = 32
radius = 0.0
fixed-center = false
override-redirect = false
;offset-x = 1700
offset-x = 90%

;tray-transparent = true
tray-detached = false
tray-position = left
tray-offset-x = 0
tray-offset-y = 0
tray-maxsize = 16
tray-padding = 0
tray-scale = 1

modules-right = keyboard
...

Указываем ему размер 10%, и смещение по оси x в 90%.

Результат:

Добавляем всё в автозапуск Openbox – ~/.config/openbox/autostart (ещё не проверял, как сработает, может надо будет очередь поменять):

...
tint2 -c /home/setevoy/.config/tint2/MY-horizontal-dark-transparent.tint2rc &
polybar -c /home/setevoy/.config/polybar/setevoy-polybar.conf bottom &
polybar -c /home/setevoy/.config/polybar/setevoy-polybar.conf top &

В целом – весьма доволен панелькой, надо будет ещё поиграться с цветами. А больше всего геморроя было со шрифтами и отображением иконок 🙂

Ещё надо поиграть со шрифтами tint2, что бы везде были одинаковые.

Дома получилось вот так:

Файлы конфигов polybar и tint2 доступны в репозитории тут>>>.

Ссылки по теме

Скрипты для polybar, ещё не пробовал

Шрифты Awesome

Примеры конфигов:

http://dotshare.it/dots/1422/

https://github.com/pseudophpt/dotfiles/blob/master/polybar-config

https://github.com/guisilvano/dotfiles/blob/master/polybar/config

https://gitlab.com/sj1k/gorice/blob/master/examples/polybar.template