LINUX.ORG.RU

Sway и другие WM: улучшаем QoL

 ,


3

4

Всем привет. В этой статье я хотел бы поделиться набором рецептов, которые позволяют реализовать некоторые мелкие фичи в 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 отправит выбранный файл на смартфон.

Заключение

Вообще я мог написать еще о таймерах, о просмотре картинок в терминале, и о синхронизации календаря, и вообще еще много о чем. Но это - тема следующих выпусков.

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 1)

Статья полезная. Но это что, в Wayland даже менеджер буфера обмена так часто падает, что ему нужен супервизор?

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Дело не в падениях, а в том что всё запущенное просто из конфига после завершения работы WM останется висеть в памяти, если его вручную не прибить.

А если sway был запущен просто из баша (или из zsh, в моём случае), то оно ещё и начнёт спамить ошибками в консоль, так что ты ей пользоваться не сможешь.

Прибить один супервизор намного удобнее.

Плюс возможность вручную останавливать и перезапускать сервисы.

Lrrr ★★★★★
() автор топика

реализовать некоторые мелкие фичи в WM

Ну тогда я бы начал с переключения раскладки и автомонтирования внешних носителей. Это явно из Top 5 (если не Top 3) того, с чем в первую очередь сталкиваются пытающие переезжать с DE на WM.

А тема годная, одобряю.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

@Lrrr, не хочешь добавить в статью пару абзацев про то, как ты в WM делаешь то, про что я написал в предыдущем комментарии? Не то, чтобы это сильно критично, но на мой взгляд, придало бы ей более завершённый вид…

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

не пользуюсь никаким отдельным софтом для переключения раскладки, просто задал их в конфиге как указано в мане и все.

Сетевые шары монтирую через autofs, но во-первых не уверен что это лучший способ (в openrc и alpine есть какие-то свои скрипты, в которых я ещё не разбирался), во-вторых это в любом случае не актуально для систем с systemd, в которых из коробки есть свой automount.

Lrrr ★★★★★
() автор топика

s6

До свидания. Без systemd не котируется.

ox55ff ★★★★★
()

зато дешево, надежно и практично (ц)

z0idator
()

По сути всё что они делают - это читают каталог /usr/share/applications и парсят имеющиеся там файлы Desktop Entry

Этого вроде как и надо, вот лаунчеры и запускают десктоп файлы. На примере rofi, этим функционал лаунчера не ограничивается. Можно и фьюзи, причем это работает ничем не хуже, чем в терминале и к тому же сохраняется история команд.

Для погоды тоже пользуюсь этим сервисом, но для панели не использую.

nnn

Так и не привык

dmitry237 ★★★★★
()

А выводит календарь в бар? У меня есть дата и часы. Все никак лапы не дойдут выводить календарь по нажатию на дату.

Хоббит выше про топ писал. Я бы добавил ещё, настройки звука в баре.

Tesler
()

wlsunset

К сожалению, на свежих релизах sway оно сломано и, судя по отсутствию активности, Саймон чинить это не особо торопится.

SkyMaverick ★★★★★
()
Ответ на: комментарий от Tesler

У меня настроен показ календаря по хоткею, независимо от панели. Про это (а также про его синхронизацию) хотел отдельную статью написать.

Громкость звука смотрю на ЦАПе, регулирую физической крутилкой на нём же. Т.е. желательно, чтобы на программном уровне она всегда была 100%.

Lrrr ★★★★★
() автор топика

В wlr портал только добавили toplevel capture, релиза ещё не было, а в кедах давно работает.

Merionet
()

swaykbdd

я навайбкодил сохранение раскладок в файл. никуда не выкладывал, это не трудно сделать самому. теперь проблема раскладок решена и раскладки запоминаются между перезагрузками

Тут даже ничего конфигурировать не надо, просто запускаем сервис:

все-таки надо конфигурировать, если хотите чтобы еще и табы запоминал в файрфоксе и телеге например

swaykbdd -a «chromium,firefox-developer-edition,org.telegram.desktop»

ripgrep
()
Ответ на: комментарий от amd_amd

Я тоже так считаю. Но люди разные. Некоторым удобны вещи, которые кажутся дико неудобными другим.

Мне вот помимо самопроизвольной смены раскладки просто из-за переключения окна ещё «Ночной свет» из перечисленного не близок. Только раздражают «неправильные» цвета, и всё. Но многим людям нравится — говорят, меньше глаза и мозг устают. И я не думаю, что они врут — наверняка и правда у них так. Кто-то вообще светлыми темами пользуется на постоянку, и у них глаза не вытекают.

Или вот «меню пуск» куча народу называет удобным, хотя как по мне — штука странная, и ввод названия программы или части названия с автодополнением любого рода (с fzf или нет — дело вкуса) гораздо удобнее и даже в чём-то понятнее. Здесь, впрочем, может просто синдром утёнка роль играть, как и с любовью к плавающим окнам, от которых объективной пользы мало, по сравнению с тайлингом и его автоматичностью.

К чему я всё это?.. К тому, что пора уже осознать, что удобство — штука очень относительная и индивидуальная, и что удобно одному, для другого — извращение. И это нормально — так и жить интереснее, чем если бы все люди были как под копирку. И хорошо, что системы на базе GNU/Linux позволяют любые «извращения», удобные конкретному пользователю, а не пытаются всех отформатировать под один интерфейс, «удобный в среднем для всех», но на деле не удобный ни для кого.

CrX ★★★★★
()
Ответ на: комментарий от amd_amd

Наоборот удобно, например, когда тебя открыт терминал где ты пишешь все по-английски и почта где всё по-русски.

ptah_alexs ★★★★★
()

Запуск сервисов

Ну это излишнее. Хватит запуска через exec, а в случае чего запуска через лаунчер или в терминале с disown.

История буфера обмена

Есть ещё такая штука как wl-clip-persist, истории не даёт, но сохраняет буфер при закрытии окна.

Скрытие уведомлений во время записи экрана

Я для созвонов по хоткею убираю: уведомления и статусную панель. Собеседник видит только окна.

Есть ещё такие прикольные штуки как:

wayland-pipewire-idle-inhibit - блочит события простоя, если через pipewire гонится звук. Тоже для созвонов или просмотра фильмов.

sworkstyle - рисует иконки окон на каждом рабочем столе в статусной панели.

trulydeclarative
()
Последнее исправление: trulydeclarative (всего исправлений: 1)
Ответ на: комментарий от ptah_alexs

Наоборот удобно

так на винде раньше было, но теперь даже эти одумались

amd_amd ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.