dwm (Русский)
dwm — это динамический оконный менеджер для Xorg. Он может управлять окнами в плиточном, плавающем и полноэкранном режимах, а также во многих других при помощи дополнительных, необязательных патчей. Режимы могут меняться динамически, оптимизируя рабочую среду под ваши задачи. dwm очень лёгкий и быстрый, написан на языке программирования C с целью оставаться в пределах 2000 строк исходного кода. В него включена поддержка multihead для xrandr и Xinerama.
Установка
dwm может быть установлен через пакет dwmAUR. Выполните все необходимые изменения до компиляции и установки; см. makepkg.
Настройка
dwm конфигурируется во время компиляции путём редактирования некоторых его исходных файлов, в частности config.h. Более подробное руководство по этим файлам см. во включённом в пакет и хорошо написанном config.def.h, а также в разделе customisation на официальном сайте dwm.
На официальном сайте доступно довольно много патчей, которые могут добавить дополнительный функционал в dwm. Эти патчи вносят изменения напрямую в файл dwm.c, а при необходимости — и в config.h. Подробнее о применении патчей см. Патчинг пакетов.
Запуск
Выберите Dwm в вашем дисплей-менеджере. Либо запустите dwm через startx — в этом случае добавьте exec dwm в файл ~/.xinitrc, а также запуск других необходимых вам программ, например:
redshift -O3500; xset r rate 300 50; exec dwm
Использование
См. руководство dwm для получения информации об использовании dwm.
Полезные приёмы
Конфигурация статусбара
Больше примеров статус-баров можно найти здесь: [1].
dwm считывает имя корневого окна и отображает его в статус-баре. Корневое окно — это окно, в котором все остальные окна рисуются и располагаются оконным менеджером. Как и любое другое окно, корневое окно имеет заголовок (имя), однако обычно он не задан, поскольку корневое окно всегда работает в фоновом режиме.
Информация, которую вы хотите, чтобы dwm отображал в статус-баре, может быть задана с помощью команды xsetroot -name "" в файле ~/.xinitrc или ~/.xprofile (если вы используете дисплей-менеджер). Например:
xsetroot -name "Thanks for all the fish!"
Динамически обновляемую информацию следует поместить в цикл, запущенный в фоновом режиме. См. пример ниже:
# Цикл статусбара while true; do xsetroot -name "$( date +"%F %R" )" sleep 1m # Обновлять каждую минуту done & # Секция автозапуск pcmanfm & exec dwm
В этом случае дата отображается в формате RFC:3339, а PCManFM запускается при старте.
Conky статусбар
Conky можно выводить в статусбар через xsetroot -name:
(conky | while read LINE; do xsetroot -name "$LINE"; done) & exec dwm
Если вы не хотите создавать слишком много процессов с помощью команды xsetroot, вы можете скомпилировать следующую программу на C:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char * argv[])
{
Display * dpy = NULL;
Window win = 0;
size_t length = 0;
ssize_t bytes_read = 0;
char * input = NULL;
dpy = XOpenDisplay(getenv("DISPLAY"));
if (dpy == NULL)
{
fprintf(stderr, "Can't open display, exiting.\n");
exit(1);
}
win = DefaultRootWindow(dpy);
while ((bytes_read = getline(&input, &length, stdin)) != EOF)
{
input[strlen(input) - 1] = '\0';
XStoreName(dpy, win, input);
XFlush(dpy);
fprintf(stderr, "Input: %s", input);
fprintf(stderr, "\nbytes read: %ld\n", bytes_read);
}
free(input);
return 0;
}
Сохраните этот файл в dwm-setstatus.c, скомпилируйте:
$ gcc dwm-setstatus.c -lX11 -o dwm-setstatus
Переместите dwm-setstatus в каталог, входящий в ваш $PATH (например, /usr/local/bin):
# mv dwm-setstatus /usr/local/bin
и запустите:
$ conky | dwm-setstatus
для этого Conky должен быть настроен на вывод текста только в консоль. Ниже приведён пример conkyrc для двухъядерного процессора, выводящий некоторые полезные данные о системе.
conky.config = {
out_to_console = true,
out_to_x = false,
background = false,
update_interval = 2,
total_run_times = 0,
use_spacer = 'none',
};
conky.text = [[
$mpd_smart :: ${cpu cpu1}% / ${cpu cpu2}% ${loadavg 1} ${loadavg 2 3} :: ${acpitemp}c :: $memperc% ($mem) :: ${downspeed eth0}K/s ${upspeed eth0}K/s :: ${time %a %b %d %I:%M%P}
]];
Для иконок и настроек цветов, см. dzen.
Перезапуск dwm
Чтобы перезапустить dwm без выхода из системы или закрытия приложений, измените или добавьте скрипт автозапуска так, чтобы он запускал dwm в цикле while, например:
while true; do
# Аудит stderror в отдельный файл
dwm 2> ~/.dwm.log
# Без аудита ошибок
#dwm >/dev/null 2>&1
done
dwm теперь можно перезапускать без закрытия других окон X вручную с помощью стандартной комбинации Mod-Shift-Q.
Рекомендуется поместить приведённый выше скрипт в отдельный файл ~/bin/startdwm и запускать его через ~/.xinitrc. Также можно запускать скрипт с помощью exec, чтобы избежать проблем с безопасностью, связанных с сохранением X-сессии после её завершения. См. Автозапуск X при входе для получения дополнительной информации.
# перезапуск dwm в случае изменения исходного файл
csum=""
new_csum=$(sha1sum $(which dwm))
while true
do
if [ "$csum" != "$new_csum" ]
then
csum=$new_csum
dwm
else
exit 0
fi
new_csum=$(sha1sum $(which dwm))
sleep 0.5
done
Привязка клавиши правый Alt к Mod4
При использовании клавиши Mod4 (клавиша Windows) в качестве MODKEY может быть удобно также задействовать правый Alt (Alt_R) как Mod4. Это позволяет выполнять неудобные комбинации одной рукой, например увеличение окна с помощью Alt_R+Enter.
Для начала узнайте какой код клавиши привязан к Alt_R:
$ xmodmap -pke | grep Alt_R
Затем добавьте следующий код в ваш скрипт автозапуска (~/.xinitrc), заменив код клавиши 113 на значение, полученное в предыдущей команде:
Перепривязка Alt_R на Super_L:
xmodmap -e "keycode 113 = Super_L"
Убедитесь что Х никак этим не взаимодействует с группой "mod1":
xmodmap -e "remove mod1 = Super_L"
После этого любые сочетания клавиш с Super_L также будут работать с клавишей Alt_R.
config.h также есть константа #define, позволяющая изменить modkey.Использование обоих Alt-клавиш как modkey в dwm
Используйте xmodmap, чтобы привязать Alt_L как дополнительный modkey в dwm (если уже используется Mod1Mask (Alt_R)).
~/.xinitrc
/usr/bin/xmodmap -e "clear mod5" /usr/bin/xmodmap -e "keycode 108 = Alt_L"
Промежутки между буквами в шрифте в статус-баре dwm
По умолчанию статусбар dwm добавляет 2 пикселя к размеру шрифта. Чтобы изменить это, внесите правки в следующую строку кода:
dwm.c
bh = dc.h = dc.font.height + 2;
Отключение фокусировки мышью
Чтобы отключить фокусировку окон с помощью мыши, закомментируйте следующую строку в определении структурного обработчика:
dwm.c
[EnterNotify] = enternotify,
Учтите, что это изменение может привести к некоторым неудобствам: первый клик по неактивному окну будет только фокусировать его. Чтобы взаимодействовать с содержимым окна (кнопками, полями и т. д.), потребуется нажать ещё раз.
Также, если у вас несколько мониторов, вы можете заметить, что переключение фокуса с клавиатуры не сможет перенести фокус на другой монитор, если он был активирован мышью.
Плавающий режим для некоторых окон
Для некоторых окон, например диалоговых, нет смысла использовать плиточный режим — они должны быть плавающими. Например, чтобы сделать окно настроек Firefox плавающим, добавьте следующее правило в массив в config.h:
{ "Firefox", NULL, "Firefox Preferences", 1 << 8, True, -1 },
Вы можете использовать xprop чтобы получить настройки других окон.
xprop | awk '
/^WM_CLASS/{sub(/.* =/, "instance:"); sub(/,/, "\nclass:"); print}
/^WM_NAME/{sub(/.* =/, "title:"); print}'
В дальнейшем информация может быть найдена на сайте dwm [2].
Использоване Tilda с dwm
Tilda работает лучше всего, когда добавлена ко всем тегам и настроена как плавающее окно. Для этого добавьте следующее правило в массив в config.h:
{ "Tilda", NULL, NULL, 0, True, -1 },
Запустите tilda c аругментом -C:
$ tilda -C
Теперь вы можете настроить Tilda. Рекомендуемые параметры:
Font: Clean 9 Appearance: Height: 50%, Width: 70%, Centered Horizontally Extras: Enable Transparency Level 15 Animated Pulldown: 1500 usec, Orientation: Top Colors: Built-in Scheme "Green on Black" Scrolling: Scrollbar is on the left, 2000 lines scrollback Key Binding: F9
Важно включить анимацию pulldown, иначе Tilda будет постоянно «прыгать» вниз при каждом открытии. Возможно, это проблема самой dwm.
Скриншоты
Установите пакет scrot. Создайте два последующих скрипта:
/path/to/scripts/screenshot.sh
#!/bin/sh mkdir -p /path/to/pics && scrot /path/to/pics/%m-%d-%Y-%H%M%S.png
для создания скриншота и
/path/to/scripts/screenshotsel.sh
#!/bin/sh mkdir -p /path/to/pics && scrot /path/to/pics/%m-%d-%Y-%H%M%S.png --select --line mode=edge
для создания скриншота в выделенной области.
Выдайте им права исполняемого файла. В config.h добавьте:
static const Key keys[] = {
...
{ 0, XK_Print, spawn, SHCMD("/path/to/scripts/screenshot.sh") },
{ ShiftMask, XK_Print, spawn, SHCMD("/path/to/scripts/screenshotsel.sh") },
...
};
Это привязывает клавишу Print к созданию скриншота, а Shift + Print — к созданию скриншота выбранной области.
Привязка мультимедийных клавиш
Добавьте в начало config.h,
#include <X11/XF86keysym.h>
Это позволит использовать мультимедийные клавиши. Теперь можно привязывать к ним обычные действия.
Смена громкости
Установите пакет pipewire. Затем добавьте в config.h следующие команды для управления громкостью:
static const char *up_vol[] = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "+10%", NULL };
static const char *down_vol[] = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "-10%", NULL };
static const char *mute_vol[] = { "pactl", "set-sink-mute", "@DEFAULT_SINK@", "toggle", NULL };
...
static const Key keys[] = {
...
{ 0, XF86XK_AudioMute, spawn, {.v = mute_vol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = down_vol } },
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = up_vol } },
...
};
Смена яркости
Установите пакет brightnessctl. Затем добавьте в config.h команды для управления яркостью:
static const char *brighter[] = { "brightnessctl", "set", "10%+", NULL };
static const char *dimmer[] = { "brightnessctl", "set", "10%-", NULL };
...
static const Key keys[] = {
...
{ 0, XF86XK_MonBrightnessDown, spawn, {.v = dimmer } },
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brighter } },
...
};
Автозапуск
Доступен патч. который запускает ~/.dwm/autostart_blocking.sh и ~/.dwm/autostart.sh & перед входом в основной цикл обработчика. Может быть использован один или оба файла.
Устранение неполадок
Исправление некорректного поведения приложений Java
См. Серое окно, приложения не меняют размер с оконным менеджером, меню сразу закрываются.
Исправление пробелов вокруг окон терминала
Если за пределами терминального окна видны пустые области, скорее всего, это связано со шрифтом терминала. Либо настройте размер шрифта так, чтобы он заполнял пространство, либо измените значение resizehints на 0 в config.h.
Это приведёт к тому, что dwm будет игнорировать запросы на изменение размера всех клиентских окон, а не только терминалов. Недостатком такого обходного пути являются возможные артефакты перерисовки, такие как призрачные линии и преждевременные переносы строк.
Если вы используете терминал st, вы можете применить патч anysize и перекомпилировать st.
Формирование арабских букв
Статусбар dwm не поддерживает формирование букв. Однако вы можете использовать такие инструменты, как fribidi, для преобразования текста в Unicode Arabic Presentation Form-B.
xsetroot -name "لِخَـوْلَةَ أطْـلالٌ بِبُرْقَةِ ثَهْمَـدِ"
используйте:
xsetroot -name "$(echo "لِخَـوْلَةَ أطْـلالٌ بِبُرْقَةِ ثَهْمَـدِ" | fribidi --nopad)"
См. также
- Официальный веб-сайт dwm
- Видео-введение в dwm
- dmenu — лёгкий и простой лаунчер приложений от разработчиков dwm
- Тред dwm на форуме
- Тред взлома dwm
- Тред обоев на форуме
- Похвастайтесь своей конфигурацией dwm
- dwl — форк dwm для Wayland