Dwm — динамический оконный менеджер для X. Он управляет окнами в тайловом (мозаичном), моноклевом и плавающем режимах. Все режимы можно применять динамически, оптимизируя среду для используемого приложения и выполняемой задачи.
Содержание
- Особенности
- Режимы работы
- Отличия от других тайловых оконных менеджеров
- Меню
- Установка
- Настройка
- Заключение
Особенности
В 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 мал, быст, стабилен, легко настраиваем. Я пользуюсь им более 10 лет и меня он вполне устраивает.
Менеджер очень удобен при работе на лаптопах с небольшим экраном, так как статусная строка почти не занимает экранного места.
Сложности возникают у пользователей не умеющих пользоваться клавиатурой, так как менеджер рассчитан на использование клавиатурных команд. Научиться слепой печати за 3 недели может лишь тот, кто видел компьютер лишь на картинке. Все остальные могут лишь переучиваться. Я сам переучивался в конце 1990-х и знаю насколько это трудно.