Polybar в i3 под OpenBSD

Опубликовано 10.10.2024 в OpenBSD

polybar

Так уж исторически повелось, что совместно с менеджером окон i3 я пользуюсь панелью (bar) под названием polybar, ибо оно имеет все, чего мне не хватает в штатном i3bar - возможность кастомизации (установкой сторонних модулей или написанием собственных скриптов), красиво декорировать (я тут стараюсь без фанатизма, так, из шрифтов с иконками кое-чего навешал), настраивать реакции на клик для виджетов и тому подобное. Не буду сейчас особо растекаться, ибо понаписал и кастомизировал я там много всего.

Сегодня о маленьком таком примере моей удивительной наблюдательности.

Вот в левой части панельки у меня традиционно болтается визуализатор рабочих столов (workspaces) этого самого оконного менеджера i3 - для чего я издревле использовал встроенный модуль polybar под названием xworkspaces. И имел он один раздражающий баг... Точнее, не он даже и не то чтобы точно баг.

В общем, так: в многозадачных операционных системах с графическим интерфейсом естественной ситуацией является потребность какой-то программы привлечь внимание пользователя в связи с каким-то событием. А окно этой программы (если она с графическим интерфейсом) или окно виртуального терминала, где выполняется программа - может быть не на виду в данный конкретный момент. Как это решить?

Есть верный способ: хочешь узнать как НЕ НАДО что-то делать - посмотри, как сделано в MacOS (воистину худшей из существующих десктопных ОС). Там активное приложение обозначит событие каким-нибудь красным кружочком на своем значке в доке, но поскольку док часто имеет настройку автоскрытия с экрана - значок приложения начнет как припадочный "подпрыгивать" в скрытом доке, показывая тебе макушку. Но этого мало: еще в верхней панели есть некое подобие трея, где значки приложений тоже могут о чем-то сигнализировать, в одном из углов экрана могут появляться всплывающие пузыри с нотификациями (как от приложений, так и системными), плюсом к этому иные приложения имеют обыкновение рисовать тебе внезапно отдельные всплывающие окошки с различной срочной информацией - в том числе модальные, блокирующие работу с прочим интерфейсом приложения, да еще перехватывающими фокус ввода. Фу! Вот описал эту помойку - и аж вкус мерзкий во рту появился...

Как это сделано в система здорового человека? В X Window System, например, издревле существует такая штука, как Urgency Hint flag - особый атрибут окна приложения, обозначающий как раз, что приложение требует внимания пользователя. В свою очередь менеджер окон/рабочих столов/десктопное окружение имеет соответствующий способ обработки события "окну проставлен urgency hint flag". В моем конкретном случае: оконный менеджер i3 умеет сигнализировать, что конкретная рабочая область (workspace), на которой расположено такое окно, смиренно просит на эту рабочую область обратить свое внимание. В свою очередь, панель (bar), где присутствуют какие-нибудь индикаторы этих самых рабочих областей (в polybar можно настроить индикацию номерами, названиями или иконками) - подсветит эту рабочую область соответствующим цветом. И всё! Не нужно никаких припадочных прыгающих значков, треев и всплывающих, заслоняя нижележащие, нотификашек - я просто знаю, что мне кто-то написал в Telegram (потому что подсвечена рабочая область, где у меня привычно открыто окно Telegram) и когда сочту для себя удобным - переключусь туда посмотреть, написали ли мне что-то умное.

Все это весьма гладко на бумаге, если бы не одно древнее и раздражавшее меня "но": как-то вот оно не так работало где-то на стыке i3 и polybar. Вот если специально, например, запустить в терминале что-то вроде sleep 5 && echo -e "\a", то оно сработает, соответствующее терминалу рабочее пространство нужным цветом окрасится. А вот если urgency hint стрельнет от, скажем, браузера или того же Telegram - то фигушки. Уж что я только не делал...

И вот не далее как Сегодня Я Узнал: оказывается, для polybar, помимо штатного модуля xworkspaces, существует давно и из коробки не менее штатный модуль i3, где все эти проблемы благополучно и изкоробочно решены!

Все, что мне потребовалось, это дописать в ~/.config/polybar/config.ini вот эти незамысловатые строки:

...

modules-left = i3

...

[module/i3]
type = internal/i3

label-mode = %mode%
label-mode-padding = 1
label-mode-background = ${colors.red}

# focused = Active workspace on focused monitor
label-focused = %index%
label-focused-background = ${colors.background-alt}
label-focused-padding = 1

# unfocused = Inactive workspace on any monitor
label-unfocused = %index%
label-unfocused-padding = 1

# visible = Active workspace on unfocused monitor
label-visible = %index%
label-visible-background = ${self.label-focused-background}
label-visible-padding = 1

# urgent = Workspace with urgency hint set
label-urgent = %index%
label-urgent-background = ${colors.alert}
label-urgent-padding = 1

# Separator in between workspaces
label-separator = |

...

И теперь всё работает как и было желанно!