DWM: тайлинг — наше всё

Чем можно заняться линуксоиду, у которого в системе всё, решительно всё работает? Конечно же, довести до ума свой оконный менеджер. Или попробовать новый.

К примеру, dwm — динамический фреймовый оконный менеджер. Написан на языке C. Настройка производится посредством правки заголовочного файла, для чего необходимо иметь исходники dwm. Если вас не пугает перспектива потратить час-другой на настройку этой штуки под свои нужды, то давайте приступим.

Где взять?

Если ваш дистрибутив — ArchLinux, ставьте вместе с автором сего поста abs — это наилучшее решение, так вы будете иметь возможность внести свои правки в конфигурационный файл dwm - сделать всё по-своему, а затем установить то, что получилось. Обладатели других дистрибутивов могут найти исходники dwm и загрузить их. Например, с сайта dwm.suckless - вкладка downloads.

Метода арча:

$ sudo pacman -S abs
$ sudo vim /etc/abs.conf

Здесь поменяем каталог /var/abs на какой-нибудь другой. Можно оставить по-умолчанию, но тогда все исходники лягут в директорию /var, что не есть хорошо, если под содержащий её раздел выделено мало места.

Пример настройки:

# /etc/abs.conf
# the top-level directory of all your PKGBUILDs

[ "$ABSROOT" = "" ] && ABSROOT="/home/user/abs/"

Синхронизируем дерево abs:

$ sudo abs
==> Starting ABS sync...
receiving file list ... done
./
community/python-memcached/PKGBUILD
core/
multilib/
multilib/binutils-multilib/
multilib/binutils-multilib/PKGBUILD
multilib/binutils-multilib/binutils.install

Если вам не нужна вся коллекция abs, можно получить только dwm:

$ sudo abs community/dwm/

Отлично. Теперь находим dwm и начинаем разбираться с его настройкой. Перейдите в нужную директорию

$ cd /home/user/abs/community/dwm

Вносим нужные правки (об этом ниже) и собираем пакет для установки. Но постойте-ка! Мы ведь нарушим целостность файла, изменив его, соответственно, не пройдём проверку на контрольные суммы. Что ж, давайте отключим эту проверку. Итак, установка:

$ sudo makepkg --skipchecksums --asroot

Добавьте в ваш .xinitrc запись

# .xinitrc

exec dwm

И входите по startx - добро пожаловать!

Можно приступать к настройке, но... прежде позвольте разжечь ваш аппетит. Давайте посмотрим, что мы можем получить в итоге. Прежде всего тайловые wm проповедуют принцип "ничего лишнего":

dwm

Как настроить ?

Посмотрим, что можно изменить в файле config.h

В первую очередь это шрифт. Здесь нужно чуть изменить настройки, поскольку в противном случае в статус-баре будут забавные "кракозябры" вместо кириллицы.

Для определения поддержки тем или иным шрифтом кириллицы, используйте утилиту xfontsel.

static const char font[]= "-*-dejavu sans-medium-r-*-*-8-*-*-*-*-*-*-ru";

Вам может потребоваться явно указать пути к шрифтам в файле /etc/X11/xorg.conf:

Section "Files"
    FontPath "/usr/share/fonts/local"
    FontPath "/usr/share/fonts/misc"
    FontPath "/usr/share/fonts/cyrillic"
EndSection

Далее идёт настройка цветов статус-бара:

static const char normbordercolor[] = "#8181ff";
static const char normbgcolor[]     = "#222222";
static const char normfgcolor[]     = "#bbbbbb";
static const char selbordercolor[]  = "#4e4eff";
static const char selbgcolor[]      = "#606060";
static const char selfgcolor[]      = "#eeeeee";
static const unsigned int borderpx  = 1;
static const unsigned int snap      = 32;
static const Bool showbar           = True;
static const Bool topbar            = True;
  • normbordercolorp[] = цвет границ окна
  • normbgcolor[] = цвет фона
  • normfgcolor[] = цвет текста в статус-баре
  • selbordercolor[] = цвет границ активного окна
  • selbgcolor[] = цвет фона заголовка окна
  • selfgcolor[] = цвет текста заголовка окна
  • borderpx = ширина границ окна

Настроим как нам нравится наши теги (это что-то вроде рабочих столов в других менеджерах окон)

static const char *tags[] = { "term", "chat", "www", "media", "work" };

Теперь вместо цифр мы имеем человекопонятные обозначения для каждого тега.

Как и во всех — мне известных — оконных менеджерах, dwm использует клавишу-модификатор. По умолчанию это Mod1Mask — то есть клавиша Alt. Чтобы изменить её на клавишу super (там, где лого windows) — изменим запись #define MODKEY:

/* key definitions */
#define MODKEY Mod4Mask
#define TAGKEYS(KEY,TAG)
{ MODKEY,                       KEY,      view,       {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask,           KEY,      toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask,             KEY,      tag,        {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,  {.ui = 1 << TAG} },

Настройка горячих клавиш. Из приведённого ниже кода ясно, что нажатие клавиши-модификатора + p вызовет dmenu, нажатие клавиши-модификатора + Return (Enter) вызовет эмулятор терминала, ну и так далее. В принципе, стандартные обозначения вполне даже удобны и вряд ли вам захочется их менять. Мы вернёмся к этому чуть позже, далее будет приведён более полный перечень горячих клавиш.

static Key keys[] = {
/* modifier           key       function        argument */
{ MODKEY,             XK_p,      spawn,        {.v = dmenucmd } },
{ MODKEY,             XK_Return, spawn,        {.v = termcmd } },
{ MODKEY,             XK_b,      togglebar,    {0} },
{ MODKEY,             XK_j,      focusstack,   {.i = +1 } },
{ MODKEY,             XK_k,      focusstack,   {.i = -1 } },
}

Настройка правил для приложений

static const Rule rules[] = {
/* class      instance    title   tags mask   isfloating   monitor */
{ "Gimp",     NULL,       NULL,   0,          True,        -1 },
{ "Firefox",  NULL,       NULL,   1 << 2,     False,       -1 },
};

~0 - приложение будет запускаться сразу на всех тегах. Это может быть удобно для какого-нибудь док-бара, трея и прочих

  • 1 << 0 — запуск на первом теге
  • 1 << 2 — запуск на третьем теге
  • 1 << 3 — запуск на четвертом теге и так далее

isfloating указывает на то, будут ли окна приложения плавающими

Расположение окон. Горячие клавиши

По умолчанию DWM поддерживает три режима расположения окон:

  • плиточный []=,
  • монокль [M],
  • плавающий ><>.

Как правило, этого достаточно.

По умолчанию при запуске dwm отображается плиточный режим окон. Чтобы поставить вместо него свой любимый режим, просто найдите нижеуказанные строки и поставьте нужный режим на первое место:

static const Layout layouts[] = {
/* symbol     arrange function */
{ "><>",      NULL },
{ "[]=",      tile },
{ "[M]",      monocle },
};
dwm tiling manager

Сочетание горячих клавиш с модификацией MODKEY у нас получилось таким:

  • Super + M - монокль
  • Super + T - плитка
  • Super + F - плавающие окна
  • Super + N - перейти на тег, N - номер тега
  • Super + p - dmenu, если установлено
  • Super + Shift + q - выход из dwm
  • Super + Shift + N - перенести окно на соответствующий тег
  • Super + Shift + C - закрыть окно
  • Super + K - переход на неактивное окно
  • Super + J - то же самое, в общем перемещение между окнами
  • Alt + Tab - переход на следующий/предыдущий тег

Дополнительные плюшки и запуск

У dwm нет каких-либо специальных настроек для запуска приложений. Всё, что запускает openbox из файла autostart, прописывается просто в .xinitrc

Например:

nitrogen --restore
xmodmap ~/.xmodmaprc
conky | while read -r; do xsetroot -name "$REPLY"; done &
# и прочее...

Естественно, если вы пожелаете отображать информацию из conky, нужно будет сделать его покороче ;) Так, чтобы он вмещался в статус-бар dwm.

# .conkyrc

out_to_x no
out_to_console yes
background no
update_interval 100
total_run_times 0
TEXT
CPU ${cpu cpu0}% :: Mem $mem :: HDD ${fs_used} :: ${totaldown eth0} / ${totalup eth0} :: ${time %d:%m:%H:%M}

Вот, пожалуй, и всё. Пусть dwm принесёт вам немало радостных минут, позволит забыть о мыши и в целом сделает вашу работу за компьютером удобнее. Настройки wdm автора можно найти на github вместе с инструкцией по применению ;)