Jump to content

dwm (Русский)

From ArchWiki

Перевод этой статьи или раздела не отражает оригинальное содержание.

Причина: Очень много орфографических и пунктуационных ошибок. (Discuss)

dwm — это динамический оконный менеджер для Xorg. Он может управлять окнами в плиточном, плавающем и полноэкранном режимах, а также во многих других при помощи дополнительных, необязательных патчей. Режимы могут меняться динамически, оптимизируя рабочую среду под ваши задачи. dwm очень лёгкий и быстрый, написан на языке программирования C с целью оставаться в пределах 2000 строк исходного кода. В него включена поддержка multihead для xrandr и Xinerama.

Установка

dwm может быть установлен через пакет dwmAUR. Выполните все необходимые изменения до компиляции и установки; см. 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)"

См. также