dwm (Русский)

Перевод
этой статьи или раздела не отражает оригинальное содержание.
Причина:
Очень много орфографических и пунктуационных ошибок. (
Discuss
)
Related articles
dmenu
dwl
Window manager
dwm
— это динамический оконный менеджер для
Xorg
. Он может управлять окнами в плиточном, плавающем и полноэкранном режимах, а также во многих других при помощи дополнительных, необязательных патчей. Режимы могут меняться динамически, оптимизируя рабочую среду под ваши задачи. dwm очень лёгкий и быстрый, написан на языке программирования C с целью оставаться в пределах 2000 строк исходного кода. В него включена поддержка
multihead
для
xrandr
и Xinerama.
Установка
dwm может быть
установлен
через пакет
dwm
AUR
. Выполните все необходимые
изменения
до
компиляции и установки; см.
makepkg
.
Tip
Установить dwm можно также, следуя руководству
Upstream instructions
, однако в этом случае файлы будут установлены без отслеживания их
pacman
.
Настройка
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]
.
Note
Для следующих инструкций необходим пакет
xorg-xsetroot
.
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
запускается при старте.
Note
Не рекомендуется устанавливать интервал обновления равным нулю или полностью убирать команду
sleep
, так как это приведёт к высокому использованию ЦП (вы можете проверить эффект с помощью
top
и
powertop
).
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
.
Note
В файле
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