Тайловый оконный менеджер Dwm

Опубликовано admin - чт, 01/13/2022 - 16:18

Dwm — динамический оконный менеджер для X. Он управляет окнами в тайловом (мозаичном), моноклевом и плавающем режимах. Все режимы можно применять динамически, оптимизируя среду для используемого приложения и выполняемой задачи.

Динамический оконный менеджер dwm
 

Содержание

Особенности

В dwm отсутствует концепция рабочих столов, она заменена идеей тегов. Окна сгруппированы по тегам. Каждое окно может быть помечено одним или несколькими тегами. При выборе определенных тегов отображаются все окна с этими тегами. Пользователь может управлять совокупностью тегов, отображаемых в определённый момент на экране.

Dwm является эффективной рабочей средой, так как в нём отсутствует необходимость перемещения окон по рабочему столу. Система управления рабочим пространством в нём реализована в виде неперекрывающихся фреймов. Левый фрейм является мастером, а правый — стеком.

Режимы работы

В тайловом режиме окнами управляют в мастер фрейме и стеке. Основной фрейм содержит окно, которое в настоящее время требует наибольшего внимания, тогда как фрейм стека содержит все остальные окна.

Тайловый оконный менеджер dwm, развернутые приложения
 

В режиме монокля все окна увеличены до размера экрана.

В плавающем режиме окна можно изменять размер и свободно перемещать.

Диалоговые окна всегда являются плавающими, независимо от применяемого режима работы.

Каждый экран содержит небольшую строку состояния, в которой отображаются все доступные теги, макет, количество видимых окон, заголовок окна в фокусе и текст, считанный из свойства имени корневого окна, если экран сфокусирован. Плавающее окно обозначается пустым квадратом, а развернутое плавающее окно обозначается закрашенным квадратом перед заголовком окна. Выбранные теги обозначаются другим цветом. Теги сфокусированного окна обозначаются закрашенным квадратом в верхнем левом углу. Теги, которые применяются к одному или нескольким окнам, обозначаются пустым квадратом в верхнем левом углу.

Dwm рисует небольшую настраиваемую рамку вокруг окон, чтобы указать состояние фокуса.

Отличия от других тайловых оконных менеджеров

  • dwm намного меньше, быстрее и проще остальных оконных менеджеров.
  • dwm не имеет интеграции с Lua, поддержки 9P, конфигурации на основе оболочки, удаленного управления и поставляется без каких-либо дополнительных инструментов.
  • dwm — это только один двоичный файл, и его исходный код невелик.
  • dwm не различает слои: нет плавающего или тайлового слоя. Независимо от того, находятся ли клиенты выбранных в данный момент тегов в тайловом режиме, вы можете переставлять их на лету. Однако всплывающие окна и окна фиксированного размера всегда плавают.
  • dwm настраивается путем редактирования исходного кода, что делает его чрезвычайно быстрым и безопасным — он не обрабатывает никакие входные данные, которые неизвестны во время компиляции, за исключением заголовков окон и текста состояния, считываемых из имени корневого окна. Вам не нужно изучать Lua / sh / ruby ​​или какой-то странный формат файла конфигурации (например, файлы ресурсов X).
  • Поскольку dwm настраивается путем редактирования исходного кода, создавать из него двоичные пакеты бессмысленно. Благодаря этому его пользовательская база остается небольшой и элитарной. Никаких новичков, задающих глупые вопросы. Однако есть некоторые дистрибутивы, которые предоставляют бинарные пакеты.
  • dwm читает из имени корневого окна, чтобы напечатать произвольный текст статуса (например, дату, нагрузку, заряд батареи).
  • dwm создает представление для каждого экрана Xinerama.

Меню

Dmenu — это динамическое меню для X, изначально разработанное для dwm. Dwm эффективно управляет большим количеством пунктов меню. dmenu читает со стандартного ввода список значений разделенных символами новой строки "\n", выводит их в виде горизонтального меню, по которому можно перемещаться стрелочками (автодополение тоже работает), и выводит выбранный элемент на stdout.

Установка

В некоторые дистрибутивы Linux включены сборки dwm и dmenu, но удобнее, думаю, установить их по классической методе.

Архив с последней версией dwm https://dl.suckless.org/dwm/dwm-6.2.tar.gz

Архив с последней версией dmenu https://dl.suckless.org/tools/dmenu-5.0.tar.gz

По умолчанию dwm устанавливается в /usr/local/bin

oleg@mobile:~:$ ls -l /usr/local/bin
итого 2380
-rwxr-xr-x 1 oleg users 2287395 ноя 29 19:43 composer*
-rwxr-xr-x 1 root root    43416 июл 12  2021 dmenu*
-rwxr-xr-x 1 root root      240 июл 12  2021 dmenu_path*
-rwxr-xr-x 1 root root       58 июл 12  2021 dmenu_run*
lrwxrwxrwx 1 root root       52 ноя 30 07:50 drush -> /home/oleg/.config/composer/vendor/drush/drush/drush*
-rwxr-xr-x 1 root root    61880 авг 17 20:05 dwm*
-rwxr-xr-x 1 oleg users     843 авг 27 09:20 n2dissite*
-rwxr-xr-x 1 oleg users    1080 авг 27 09:23 n2ensite*
-rwxr-xr-x 1 root root    17080 июл 12  2021 stest*
oleg@mobile:~:$

После распаковки архива со свежим релизом можно подправить файл config.mk, в нем задается путь для установки

...	
PREFIX = /usr/local
...

Отредактировав путь можно, например, установить dwm в свой домашний каталог

...
PREFIX = /home/vasya/Programs
...

Даётся команда

make

Самые нетерпеливые могут сразу выполнить

make install

Для терпеливых

После команды make в каталоге с dwm появляется файл config.h, полученный копированием config.default.h. Его следует отредактировать под свои нужды. Файл config.h отлично прокомментирован.

Значения параметров

BORDERPX
Ширина границы окна, в dwm у окон нет заголовков.
FONT
Шрифт используемый в панели. в dwm есть панель, на которой отображается заголовок активного окна, названия тэгов и текст со стандартного ввода
NORMBORDERCOLOR
Цвет границ неактивных окон
NORMBGCOLOR
Фон панели
NORMFGCOLOR
Текст панели
SELBORDERCOLOR
Цвет границ активного окна
SELBGCOLOR
Фон заголовка окна в панели
SELFGCOLOR
Текст заголовка окна в панели
TOPBAR
Расположение панели: вверху или внизу?

Далее задаются имена тегов и в конце обязательно должен быть NULL

...	
#define TAGS \
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL };
...

Цифры в названиях тегов можно поменять на что-либо осмысленное.

Завершает конфиг описание модификатора и список горячих клавиш

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

ShiftMask
Зажатая клавиша
Shift ControlMask
Зажатая клавиша
Control ShiftMask
Зажатая клавиша
Shift ControlMask
Зажатая клавиша Control

Например

...
{ MODKEY|ControlMask|ShiftMask,	XK_9,		toggletag,	"8" }, \
...

такая строка означает зажатие Alt+Control+Shift+9.

spawn
Запуск внешней программы
setlayout
Переключить режим
incmasterw
Увеличить/уменьшить ширину MASTER-области
incnmaster
Увеличить/уменьшить количество окон в MASTER-области
focusclient
Передать фокус следующему/предыдущему окну
togglemax
Развернуть на весь экран
zoom
Перенести окно в MASTER-область
togglefloating
Переключатель плавающее/tiled для отдельного окна
killclient
Закрыть окно
view
Сделать тег-аргумент текущим видом
toggleview
Добавить/удалить тэг-аргумент в текущий вид
tag
Выставить окну тег-аргумент
toggletag
Добавить/удалить тэг-аргумент клиенту
quit
выход

После редактирования файла config.h терпеливые могут дать команду

install

Настройка

При появлении желания изменить что-либо в настройках редактируется файл config.h и даётся команда

make clean install

Фрагмент моего config.h

/* See LICENSE file for copyright and license details. */

/* appearance */
static const unsigned int borderpx  = 1;        /* border pixel of windows */
static const unsigned int snap      = 32;       /* snap pixel */
static const int showbar            = 1;        /* 0 means no bar */
static const int topbar             = 1;        /* 0 means bottom bar */
static const char *fonts[]          = { "-*-terminus-medium-*-*-*-16-*-*-*-*-*-iso10646-*" };
static const char dmenufont[]       = "monospace:size=10";
static const char col_gray1[]       = "#222222";
static const char col_gray2[]       = "#444444";
static const char col_gray3[]       = "#bbbbbb";
static const char col_gray4[]       = "#eeeeee";
static const char col_cyan[]        = "#005577";
static const char *colors[][3]      = {
        /*               fg         bg         border   */
        [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
        [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
};

/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };

static const Rule rules[] = {
        /* xprop(1):
         *      WM_CLASS(STRING) = instance, class
         *      WM_NAME(STRING) = title
         */
        /* class      instance    title       tags mask     isfloating   monitor */
        { "Sakura",     NULL,       NULL,       1 << 0,       0,           -1 },
        { "Geany",      NULL,       NULL,       1 << 1,       0,           -1 },
        { "Gimp",       NULL,       NULL,       1 << 2,       1,           -1 },
        { "Chromium",   NULL,       NULL,       1 << 3,       0,           -1 },
        { "Claws-mail", NULL,       NULL,       1 << 4,       0,           -1 },
};
...

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

По умолчанию в качестве клавиши-модификатора Mod используется Alt

...
/* key definitions */
#define MODKEY Mod1Mask
...

На мой взгляд целесообразнее поменять её на Win, так как при этом выполнение клавиатурных команд будет обходиться без скручивания пальцев винтом.

..
/* key definitions */
#define MODKEY Mod4Mask
..

Мой .xinitrc

#!/bin/sh

#Dinamic window manager
while true
    do
        xsetroot -name "Бат:$(eval echo `grep remain /proc/acpi/battery/BAT1/state|cut -d ' ' -f 8`*100/4400 | bc) Звук:$(amixer -c 0 sget Master |awk '/Mono:/ {print($6$4)}') `skb 1` $(date '+%a %e %B %Y %H:%M:%S')"
        sleep 2
    done &
    #Autostart section
    sakura &
        sleep 2
    geany &
        sleep 2
    chromium &
        sleep 2
    claws-mail &
    fbsetbg -f ~/backgrounds/seattle_1280x1024.jpg &
exec dwm

Отсюда явствует то, что в статусной строке показываются: батарея, звук, локаль, дата. При старте запускаются приложения, перечисленные в config.h.

Тайловый оконный менеджер dwm, вид с обоями рабочего стола
В качестве обоев используется фото штормового Сиэтла

Заключение

Тайловый оконный менеджер dwm мал, быст, стабилен, легко настраиваем. Я пользуюсь им более 10 лет и меня он вполне устраивает.

Менеджер очень удобен при работе на лаптопах с небольшим экраном, так как статусная строка почти не занимает экранного места.

Сложности возникают у пользователей не умеющих пользоваться клавиатурой, так как менеджер рассчитан на использование клавиатурных команд. Научиться слепой печати за 3 недели может лишь тот, кто видел компьтер лишь на картинке. Все остальные могут лишь переучиваться. Я сам переучивался в конце 1990-х и знаю насколько это трудно.