DWM: Suckless переход с GNOME. Часть 2
от Senderman
В прошлой статье, мы установили DWM (Dynamic Window Manager), и настроили его до состояния, в котором с ним можно более-менее адекватно работать. В этой части мы сделаем DWM еще более красивым и удобным.
И прежде чем мы начнем, я должен рассказать, что DWM имеет 3 режима отображения окон - tiling, floating и monocle. Принцип работы первого режима вы знаете. Второй - позволяет изменять размер окон перетаскиванием мышкой за края окон, накладывать окна друг на друга, в общем, симуляция не-тайлового WM. Monocle же просто отображает активное окно на весь экран. Дополнительные режимы могут быть установлены патчами, речь о них пойдет ниже.
Пакеты
Чтобы не захламлять статью словами "Установите то, установите это", в начале я напишу список пакетов (имена пакетов здесь для Archlinux, ищите альтернативы на свои дистры), которые пригодятся нам для дальнейшей настройки.
- sddm (gdm, lightdm, lxdm) - автостарт+фикс gnome-keyring
- sxhkd - хоткеи без перекомпиляции DWM
- slock или bslock (AUR либо Github если нужна кастомизация) - локскрин
- picom - прозрачность, фикс тиринга
- acpilight или xorg-xbacklight - изменение уровня подсветки. Выберите тот пакет, который у вас работает.
- xorg-xinput - фикс работы тачпада
- noto-fonts-emoji, xft-bgra (AUR) - цветные эмодзи в статусбаре
Настройка статусбара - тык.
Патчи - тык.
Внимание! Если вы НЕ стали использовать Display Manager для запуска DWM, то, при чтении данной статьи, используйте ~/.xinitrc вместо ~/.xprofile !!!
Автостарт + фикс gnome-keyring + фикс падения DWM при использовании некоторых fn-клавишВозможно, за время работы с DWM вы заметили, что в файловых менеджерах с поддержкой GVFS (nautilus/thunar/pcmanfm) у вас перестали запоминаться пароли, либо же запоминаются, но связка ключей не анлочится при старте сессии. Можно починить руками, а можно использовать Display Manager для таких целей. В конце-концов, Linux - это многопользовательская система, и если вашим компьютером пользуется кто-то еще, он, возможно, не захочет использовать DWM.
DWM не отображается в списке сессий DM, добавим его туда сами:
/usr/share/xsessions/dwm.desktop:
Включите ваш DM в автозапуск и настройте по своему усмотрению. Так как теперь мы используем DM вместо startx, скопируйте ~/.xinitrc в ~/.xprofile и удалите оттуда запуск DWM. Добавьте в .xprofile строки
Хоткеи без перекомпиляции DWMПроверьте, есть ли у вас переменная окружения XDG_CONFIG_HOME. Если нет, добавьте в .xprofile
Удалите все spawn-хоткеи из config.h DWM, так как теперь мы используем sxhkd для этой цели
Отредактируйте файл ~/.config/sxhkd/sxhkdrc. Вот пример:
Напомню, что для того, чтобы узнать, как называется какая-либо кнопка, используйте xev из пакета xorg-xev
Добавьте в .xprofile
Внимание! Если вы НЕ используете DM, и используете sxhkd для запуска flameshot, вы так же должны запустить flameshot из .xinitrc, как было указано в первой части статьи, либо запускать sxhkd через dbus-launch!
ЛокскринЕсли вы используете slock, просто добавьте в конфиг sxhkd команду slock на удобную вам комбинацию. По-умолчанию, slock показывает серый экран, голубой экран при вводе, красный при неправильном пароле. Чтобы разблокировать экран, просто введите ваш пароль и нажмите Enter. Настройка цветов осуществляется путем редактирования config.h в исходном коде slock
bslock - продвинутый форк slock, позволяющий добавить текст на локскрин, и выводящий цвета, описанные выше, не на весь экран, а в небольшую панельку. Конфигурация осуществляется так же, как и в slock. Если у вас не отображается текст - измените значение переменной char *font_name. Доступные шрифты можно посмотреть командой bslock -f. Не забудьте добавить bslock в конфиг sxhkd
Прозрачность, фикс тирингаДобавьте в .xprofile
Если вы обнаружили у себя тиринг (смотреть в полноэкранном режиме), то запускайте picom с ключом --experimental-backends
После запуска picom, pop-up меню и контекстные меню будут слегка прозрачными. Если вам это не нравится, уберите из конца /etc/xdg/picom.conf следющие строки:
Изменение уровня подсветкиДобавьте в конфиг sxhkd
Введите команду
Создайте и отредактируйте файл /etc/udev/rules.d/backlight.rules
Если у вас acpi_video0:
Если у вас intel_backlight:
Добавьте себя в группу video
Перезапустите сессию.
Фикс работы тачпадаЕсли у вас не работает тап (нажатие ЛКМ при касании тачпада), и/или вас неустраивает "неестественное" направление скроллинга:
Введите команду xinput и найдите имя своего тачпада.
Например:
В этом случае тачпад называется "DELL09E1:00 04F3:30CB Touchpad"
Добавьте в .xprofile:
Цветные эмодзи в статусбареПо-умолчанию, в DWM прописан запрет на использование xft-bgra (цветные шрифты). Чтобы его снять, найдите в drw.c следующие строки:
и удалите их. В config.h в массив char *fonts[] пропишите используемые вами шрифты + NotoColorEmoji. Напомню, что посмотреть доступные шрифты можно комнадой fc-list. Пример:
Не забудьте пересобрать DWM.
СтатусбарВот мы и подобрались к самому интересному - статусбар!
DWM выводит справа вверху имя корневого окна. Менять его можно командой xsetroot -name текст. Можете это проверить! Реализация статусбара заключается в том, что в бесконечном цикле (со sleep, конечно же, иначе вы полностью нагрузите одно из ядер CPU) генерируется строчка, которая передается в xsetroot. Благодаря тому, что в предыдущем пункте мы включили поддержку цветных эмодзи, мы можем использовать их как значки!
В начале этого пункта будут приведены некоторые сложные примеры получения статуса сети/локали/etc, а затем я покажу, как обновлять статусбар при изменении этих параметров при нажатии на хоткеи.
Создадим в домашней директории папку со скриптами, например ~/scripts, и добавим ее в PATH в .xprofile:
Создадим скрипт bar.sh в этой папке. В начале, мы объявим компоненты нашего статусбара внутри функций, а затем вызовем все эти функции в одной строке, чтобы вывести их содержимое. Пример:
Полная версия скрипта с батареей и подсветкой выложена тут и доступна по подписке.
Даем скрипту права на исполнение (chmod +x bar.sh) и кидаем его в автозапуск в .xprofile
И тут вы спросите - но если я переключаю раскладку/изменяю громкость, то данные в статусбаре не изменятся сразу! Верно. Статусбар обновляется, когда процесс sleep внутри цикла while завершится. А если sleep получит SIGTERM, то он тоже завершится! Это мы и будем использовать для обновления статусбара.
Представляю вам refbar.sh
Этот скрипт нужно вызывать из sxhkd при комбинациях, изменяющих данные в статусбаре:
А теперь информация для тех кто использует Display Manager. SDDM, LightDM, и еще некоторые DM не прибивают все процессы пользователя при закрытии сессии, таким образом, если вы перезайдете несколько раз, то у вас будет несколько процессов bar.sh. К счастью, это фиксится путем прибивания процесса bar.sh перед запуском нового процесса bar.sh.
killbar.sh:
.xprofile:
ПатчиЕсли на данном этапе вам не хватает какого-то функционала DWM, его можно дополнить патчами вот отсюда. Чтобы установить патч, скачивайте патч под вашу версию DWM, и применяйте его командой
Советую перед тем, как патчить, выполнить вот эти команды:
Т.к. в основном патчи применяются к config.def.h. Некоторые патчи кривые, и после их применения нужно будет покопаться в коде. Я сижу на ванильном DWM, но приведу вам некоторые патчи, которые могут быть интересны:
Autostart - автостарт скриптов из ~/.dwm. Полезно если вы используете dwm+dbus
Fullgaps - добавляет промежутки между окнами и позволяет регулировать их хоткеями
Swallow - при открытии графического приложения из терминала, скрывает терминал (и возвращает его после закрытия приложения)
Systray - полноценный трей. Туда можно засунуть nm-applet, там будут значки телеги, стима, дискорда и все такое
Xresources - добавляет возможность конфигурировать DWM с помощью ~/.Xresources
И прежде чем мы начнем, я должен рассказать, что DWM имеет 3 режима отображения окон - tiling, floating и monocle. Принцип работы первого режима вы знаете. Второй - позволяет изменять размер окон перетаскиванием мышкой за края окон, накладывать окна друг на друга, в общем, симуляция не-тайлового WM. Monocle же просто отображает активное окно на весь экран. Дополнительные режимы могут быть установлены патчами, речь о них пойдет ниже.
Пакеты
Чтобы не захламлять статью словами "Установите то, установите это", в начале я напишу список пакетов (имена пакетов здесь для Archlinux, ищите альтернативы на свои дистры), которые пригодятся нам для дальнейшей настройки.
- sddm (gdm, lightdm, lxdm) - автостарт+фикс gnome-keyring
- sxhkd - хоткеи без перекомпиляции DWM
- slock или bslock (AUR либо Github если нужна кастомизация) - локскрин
- picom - прозрачность, фикс тиринга
- acpilight или xorg-xbacklight - изменение уровня подсветки. Выберите тот пакет, который у вас работает.
- xorg-xinput - фикс работы тачпада
- noto-fonts-emoji, xft-bgra (AUR) - цветные эмодзи в статусбаре
Настройка статусбара - тык.
Патчи - тык.
Внимание! Если вы НЕ стали использовать Display Manager для запуска DWM, то, при чтении данной статьи, используйте ~/.xinitrc вместо ~/.xprofile !!!
Автостарт + фикс gnome-keyring + фикс падения DWM при использовании некоторых fn-клавишВозможно, за время работы с DWM вы заметили, что в файловых менеджерах с поддержкой GVFS (nautilus/thunar/pcmanfm) у вас перестали запоминаться пароли, либо же запоминаются, но связка ключей не анлочится при старте сессии. Можно починить руками, а можно использовать Display Manager для таких целей. В конце-концов, Linux - это многопользовательская система, и если вашим компьютером пользуется кто-то еще, он, возможно, не захочет использовать DWM.
DWM не отображается в списке сессий DM, добавим его туда сами:
/usr/share/xsessions/dwm.desktop:
- [Desktop Entry]
- Encoding=UTF-8
- Name=Dwm
- Comment=Dynamic window manager
- Exec=dwm
- Icon=dwm
- Type=XSession
- eval $(gnome-keyring-daemon --start)
- export SSH_AUTH_SOCK
Хоткеи без перекомпиляции DWMПроверьте, есть ли у вас переменная окружения XDG_CONFIG_HOME. Если нет, добавьте в .xprofile
- XDG_CONFIG_HOME=~/.config
- export XDG_CONFIG_HOME
Отредактируйте файл ~/.config/sxhkd/sxhkdrc. Вот пример:
- Print
- flameshot gui
- super + r
- rofi -show drun
- super + b
- firefox
Добавьте в .xprofile
- sxhkd &
ЛокскринЕсли вы используете slock, просто добавьте в конфиг sxhkd команду slock на удобную вам комбинацию. По-умолчанию, slock показывает серый экран, голубой экран при вводе, красный при неправильном пароле. Чтобы разблокировать экран, просто введите ваш пароль и нажмите Enter. Настройка цветов осуществляется путем редактирования config.h в исходном коде slock
bslock - продвинутый форк slock, позволяющий добавить текст на локскрин, и выводящий цвета, описанные выше, не на весь экран, а в небольшую панельку. Конфигурация осуществляется так же, как и в slock. Если у вас не отображается текст - измените значение переменной char *font_name. Доступные шрифты можно посмотреть командой bslock -f. Не забудьте добавить bslock в конфиг sxhkd
Прозрачность, фикс тирингаДобавьте в .xprofile
- picom &
Если вы обнаружили у себя тиринг (смотреть в полноэкранном режиме), то запускайте picom с ключом --experimental-backends
После запуска picom, pop-up меню и контекстные меню будут слегка прозрачными. Если вам это не нравится, уберите из конца /etc/xdg/picom.conf следющие строки:
- tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
- popup_menu = { opacity = 0.8; }
- dropdown_menu = { opacity = 0.8; }
Изменение уровня подсветкиДобавьте в конфиг sxhkd
- XF86MonBrightnessDown
- xbacklight -dec 10
- XF86MonBrightnessUp
- xbacklight -inc 10
- ls /sys/class/backlight
Если у вас acpi_video0:
- ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", GROUP="video", MODE="0664"
- RUN+="/bin/chgrp video /sys/class/backlight/intel_backlight/brightness"
- RUN+="/bin/chmod g+w /sys/class/backlight/intel_backlight/brightness"
- sudo gpasswd -a имя_юзера video
Фикс работы тачпадаЕсли у вас не работает тап (нажатие ЛКМ при касании тачпада), и/или вас неустраивает "неестественное" направление скроллинга:
Введите команду xinput и найдите имя своего тачпада.
Например:
- ⎡ Virtual core pointer
- ⎜ ↳ Virtual core XTEST pointer
- ⎜ ↳ DELL09E1:00 04F3:30CB Mouse
- ⎜ ↳ DELL09E1:00 04F3:30CB Touchpad
- ⎜ ↳ PS/2 Generic Mouse
Добавьте в .xprofile:
- touchpad="DELL09E1:00 04F3:30CB Touchpad"
- # Enable touchpad tap
- xinput set-prop "$touchpad" "libinput Tapping Enabled" 1
- # Enable natural touchpad scrolling
- xinput set-prop "$touchpad" "libinput Natural Scrolling Enabled" 1
Цветные эмодзи в статусбареПо-умолчанию, в DWM прописан запрет на использование xft-bgra (цветные шрифты). Чтобы его снять, найдите в drw.c следующие строки:
- FcBool iscol;
- if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
- XftFontClose(drw->dpy, xfont);
- return NULL;
- }
- static const char *fonts[] = { "Droid Sans Mono:size=10", "Noto Color Emoji:size=10" };
СтатусбарВот мы и подобрались к самому интересному - статусбар!
DWM выводит справа вверху имя корневого окна. Менять его можно командой xsetroot -name текст. Можете это проверить! Реализация статусбара заключается в том, что в бесконечном цикле (со sleep, конечно же, иначе вы полностью нагрузите одно из ядер CPU) генерируется строчка, которая передается в xsetroot. Благодаря тому, что в предыдущем пункте мы включили поддержку цветных эмодзи, мы можем использовать их как значки!
В начале этого пункта будут приведены некоторые сложные примеры получения статуса сети/локали/etc, а затем я покажу, как обновлять статусбар при изменении этих параметров при нажатии на хоткеи.
Создадим в домашней директории папку со скриптами, например ~/scripts, и добавим ее в PATH в .xprofile:
- PATH=$PATH:$HOME/scripts
- export PATH
- #!/usr/bin/bash
- layout(){
- # Получаем значение LED для текущей раскладки
- # Запустите xset -q | grep LED в терминале, чтобы посмотреть значения для каждой раскладки.
- # Значения в этом примере действительны для раскладки us,ru
- t=$(xset -q | grep LED)
- code=${t##*mask: }
- if [[ $code -eq "00000000" ]]; then
- result="EN"
- else
- result="RU"
- fi
- echo $result
- }
- # Вывод даты в формате dd.MM.YYYY HH:MM
- fdate(){
- date +"%x %H:%M"
- }
- # Текущая громкость
- volume(){
- full_str=$(amixer sget Master | grep Left: )
- state=${full_str##*\[}
- if [[ $state == "off]" ]]; then
- echo off
- else
- state=${full_str#*\[}
- echo ${state%%\]*}
- fi
- }
- # Имя текущего подключения (имя Wi-Fi либо Ethernet)
- fnet(){
- nmout=$(nmcli -t -f NAME,TYPE con show --active)
- conn=$( echo "$nmout" | grep ethernet)
- if [[ "$conn" != "" ]]; then
- act_conn="Eth"
- else
- conn=$( echo "$nmout" | grep wireless)
- if [[ "$conn" != "" ]]; then
- act_conn="${conn%:*}"
- else
- act_conn="No conn"
- fi
- fi
- echo $act_conn
- }
- # генерируем строку для статусбара и украшаем ее с помощью эмодзи
- generate_content(){
- echo "📶$(fnet)|🔈$(volume)|$(layout)|$(fdate)"
- }
- # Выводим и обновляем статусбар раз в минуту
- while true; do
- xsetroot -name "$(generate_content)"
- sleep 1m
- done
Даем скрипту права на исполнение (chmod +x bar.sh) и кидаем его в автозапуск в .xprofile
- bar.sh &
И тут вы спросите - но если я переключаю раскладку/изменяю громкость, то данные в статусбаре не изменятся сразу! Верно. Статусбар обновляется, когда процесс sleep внутри цикла while завершится. А если sleep получит SIGTERM, то он тоже завершится! Это мы и будем использовать для обновления статусбара.
Представляю вам refbar.sh
- #!/usr/bin/bash
- # look for sleep running inside bar.sh and kill it
- pid=$(pstree -lp | grep -- -bar.sh)
- pid=${pid##*bar.sh\(*sleep\(}
- pid=${pid%\)}
- kill $pid
- super + space
- refbar.sh
- XF86AudioRaiseVolume
- amixer -D pulse sset Master 5%+ unmute; refbar.sh
- XF86MonBrightnessDown
- xbacklight -dec 10; refbar.sh
А теперь информация для тех кто использует Display Manager. SDDM, LightDM, и еще некоторые DM не прибивают все процессы пользователя при закрытии сессии, таким образом, если вы перезайдете несколько раз, то у вас будет несколько процессов bar.sh. К счастью, это фиксится путем прибивания процесса bar.sh перед запуском нового процесса bar.sh.
killbar.sh:
- #!/usr/bin/bash
- # look for running bar.sh and kill it
- pid=$(pstree -lp | grep -- -bar.sh)
- pid=${pid##*bar.sh\(}
- pid=${pid%%\)*}
- kill $pid
- killbar.sh
- bar.sh &
ПатчиЕсли на данном этапе вам не хватает какого-то функционала DWM, его можно дополнить патчами вот отсюда. Чтобы установить патч, скачивайте патч под вашу версию DWM, и применяйте его командой
- patch < patchname.diff
- cp config.h config.def.h
- mv config.h config.h.bak
Autostart - автостарт скриптов из ~/.dwm. Полезно если вы используете dwm+dbus
Fullgaps - добавляет промежутки между окнами и позволяет регулировать их хоткеями
Swallow - при открытии графического приложения из терминала, скрывает терминал (и возвращает его после закрытия приложения)
Systray - полноценный трей. Туда можно засунуть nm-applet, там будут значки телеги, стима, дискорда и все такое
Xresources - добавляет возможность конфигурировать DWM с помощью ~/.Xresources