В рубрику "на третий день индеец Соколиный Глаз заметил, что..."
Опубликовано: 2024-10-10
Категория: OpenBSD
Теги: i3 хауту 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, где все эти проблемы благополучно и изкоробочно решены!
=> Вики polybar: описание модуля xworkspaces | Вики polybar: описание модуля 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 = | ...
И теперь всё работает как и было желанно!
text/gemini;
This content has been proxied by September (ba2dc).