Всем привет. В этой статье я хотел бы поделиться набором рецептов, которые позволяют реализовать некоторые мелкие фичи в WM. Эти фичи обычно есть из коробки в DE вроде KDE, но переезжающие на WM о них особо не задумываются. Между тем их наличие повышает удобство работы. Я фокусируюсь на Sway, которым пользуюсь с момента выхода 1.0-alpha1, но большинство этих рецептов должны подойти и к другим WM, даже не обязательно использующим Wayland.
Запуск сервисов
Большинство рецептов предполагает запуск каких-то сервисов в пользовательской сессии. Но как их запускать? Если с одной стороны хочется получать их логи, автоматически перезапускать при падении, корректно завершать при завершении работы sway (например, не все откликаются на SIGTERM), и т.п. С другой - этим сервисам как правило нужен доступ к wayland-сокету, адрес которого устанавливается WM при старте.
Обычно в таких случаях используют подход «Магомед идёт к горе». Создаём специальный таргет в пользовательской сессии systemd, вручную запускаем его из конфига sway, вручную пробрасываем туда все нужные переменные, и всё вроде работает. Этот подход - именно та причина, по которой KDE и компания с каждым днем все больше завязываются на systemd. Некоторые разработчики WM пытаются от них не отставать, например официальная документация Hyprland рекомендует использовать uwsm.
Проект UWSM состоит из 9000 строк кода на питоне, и его автор сообщает о «slow-burning refactoring» с ломающими изменениями. Для такой казалось бы простой задачи.
Это не потому что разработчики uwsm - плохие программисты. Просто сам подход «Магомед идёт к горе» - неправильный. Он ведёт к переусложнению архитектуры и завязывает на фичи конкретной системы инициализации, к которой предъявляются очень высокие требования.
Правильный подход - «гора идёт к Магомеду». Запускаем портабельный супервизор прямо из конфига WM, в моём случае супервизором является s6. Так как его процесс и все его дочерние процессы являются потомками процесса WM, то они автоматически запустятся в правильном порядке и получат в окружении все нужные переменные. Запускаем s6 в конфиге sway:
exec "s6-svscan ~/.config/s6 | s6-log T n2 ~/.local/var/log/s6"
Все логи, не попавшие в индивидуальные обработчики, сгружаем в папку ~/.local/var/log/s6 с автоматическими таймстампами и ротацией.
А чтобы супервизор завершал работу при выходе из sway, запускаем последний следующим образом:
$ cat /usr/local/bin/sway-launch
#!/bin/bash
/usr/bin/sway
s6-svscanctl -t ~/.config/s6/
Всё это просто как топор и никогда не сломается. ~/.config/s6 - папка, в которой у меня хранятся конфиги сервисов (аналоги unit-файлов systemd). Они тоже просты как топор.
Запуск приложений
Обычно для запуска приложений в WM навешивают на хоткей dmenu или какой-нибудь аналог. Но зачем для этого пользоваться графическими приложениями? По сути всё что они делают - это читают каталог /usr/share/applications и парсят имеющиеся там файлы Desktop Entry.
Я предлагаю делать то же самое с помощью sway-launcher-desktop - шелл-скрипта, который запускает fzf в эмуляторе терминала. Несмотря на название, он никак не завязан ни на sway ни на wayland. Навешиваем его на хоткей в sway следующим образом:
set $menu exec foot -a app_launcher sway-launcher-desktop
for_window [app_id="app_launcher"] floating enable, border pixel 3, sticky enable
bindsym --to-code $mod+d exec $menu
благодаря чему при нажатии на $mod+d (независимо от текущей раскладки) появится плавающее окно со списком программ.
История буфера обмена
С сохранением после перезагрузки, fuzzy-поиском, и т.п. Рекомендую, cliphist. Этот софт требует запуск пользовательского сервиса. Делаем в точном соответствии с документацией и описанным выше принципом «гора идёт к Магомеду»:
$ cat ~/.config/s6/cliphist/run
#!/bin/bash
wl-paste --watch cliphist store
Индивидуальная раскладка клавиатуры для каждого окна
swaykbdd. Тут даже ничего конфигурировать не надо, просто запускаем сервис:
cat ~/.config/s6/swaykbdd/run
#!/bin/bash
swaykbdd
Уведомления UPower
Например о том, что беспроводная мышь почти разрядилась. poweralertd:
$ cat ~/.config/s6/poweralertd/run
#!/bin/bash
/usr/bin/poweralertd
Из забавного: UPower требует polkit для запуска. Polkit у меня в системе в состоянии тыквы, потому что он требует systemd-logind или elogind, которых у меня нет. Тем не менее, upower фунициклирует. Зачем ему нужна эта зависимость? Науке неизвестно.
Интеграция со смартфоном
Несмотря на название, KDE Connect прекрасно работает и без KDE:
$ cat ~/.config/s6/kdeconnect/run
#!/bin/bash
/usr/bin/kdeconnectd
После чего запускаем GUI-приложение KDE Connect при помощи sway-launcher-desktop и настраиваем там соединение со смартфоном. Синхронизация уведомлений, синхронизация буфера обмена, возможность управлять музыкой, двигать курсором мыши и черт знает что еще - крайне рекомендую.
Ночной свет
Делает цвета более холодными или более теплыми в зависимости от времени дня, чтобы глаза не уставали. Есть куча программ с такой функциональностью, я использую wlsunset:
$ cat ~/.config/s6/wlsunset/run
#!/bin/bash
wlsunset -l <lat> -L <long> 2>&1
$ cat ~/.config/s6/wlsunset/log/run
#!/bin/bash
s6-log T n2 ~/.local/var/log/wlsunset
Здесь я пишу лог (для чего требуется 2>&1) средствами s6, потому что wlsunset сообщает туда интересные мне данные о рассвете и закате:
calculated sun trajectory: dawn 04:34, sunrise 05:49, sunset 21:10, dusk 22:25
Погода без регистрации и SMS
Не все знают про https://wttr.in, а уж про то, что этот сайт умеет отдавать информацию в JSON и что его исходники доступны на github - и вовсе единицы.
$ curl 'wttr.in/Moscow?format=j1' | jq -r '.current_condition.[] | "temp|int|\(.temp_C)\nweatherdesc|string|\(.weatherDesc.[].value)\n"'
temp|int|20
weatherdesc|string|Sunny
Такой формат вывода мне нужен для интеграции с yambar - панелью, которой пользуюсь.
- script:
path: /usr/local/bin/wttr.sh
poll-interval: 3600000 # 3600 секунд
content:
- string:
font: *emoji
text: "\U0001F321" # значок термометра
- string:
font: *default
text: " {temp}"
- string:
font: *emoji
text: "\U00002103" # значок градуса Цельсия
- string:
font: *default
text: " {weatherdesc} "
Скрытие уведомлений во время записи экрана
Особенно актуально во время рабочих созвонов. Для записи экрана я пользуюсь xdg-desktop-portal-wlr + pipewire, для показа уведомлений - mako. Скрывание настраивается так:
$ cat ~/.config/xdg-desktop-portal-wlr/sway
[screencast]
exec_before=makoctl mode -a dnd
exec_after=makoctl mode -r dnd
Интересно, еще остались люди, которые думают что запись экрана не работает в wayland?
Drag-n-Drop в консоли
Например, если хотите сменить картинку в профиле на LOR (я не хочу):
$ dragon-drop ~/Pictures/maomao.jpg
После чего dragon покажет GUI-окно, из которого можно перетащить в форму в браузере то что вы указали. Больше того, эту утилиту можно интегрировать с консольным менеджером файлов nnn:
$ export NNN_PLUG="d:dragdrop;k:kdeconnect"
$ nnn
При нажатии на ;+d nnn откроет окно с этим dragon. Чтобы два раза не вставать, заодно добавил интеграцию с KDE connect - при нажатии на ;+k nnn отправит выбранный файл на смартфон.
Заключение
Вообще я мог написать еще о таймерах, о просмотре картинок в терминале, и о синхронизации календаря, и вообще еще много о чем. Но это - тема следующих выпусков.











