dwm. от статики к динамике


 

dwm. От статики к динамике.

"Динамикой называется раздел механики, в котором изучаются движения механических систем под действием сил" из учебника по теормеху

Наблюдение 1.Вы замечали, что у UNIX'овых манов есть интересная особенность: они ничего не объясняют человеку совершенно не знакомому с предметом? Например man dwm расскажет заинтересовавшемуся пользователю, что dwm значит dynamic window manager. Тот самый случай. Я, в меру сил, попытаюсь исправить этот недостаток.

"Это не Пьер и не Жиль, а какой-то мужик в трусах" Соня Винниченко

Во-первых, объясню чем отличается dwm от других оконных менеджеров. Тут все просто: отличается первой буквой в названии. Это "d" там неспроста. "Динамичность" означает что расположение окон по экрану происходит динамически, в зависимости от изменяющихся условий. Вообще, как мне кажется, из-за особенностей дизайна dwm служит не только оконным менеджером а еще и организатором мыслительного потока (ну и коряво же выразился). Вы, конечно, не поняли что я хочу сказать (а некоторые, возможно, подумали: еще только второй абзац, а уже фанатичный бред). Объясню: в dwm нет "концепции" рабочих столов, она заменена идеей тэгов. Каждому окну приписывается один или несколько тэгов. Пользователь во время работы создает вид - совокупность тегов, отображаемых в конкретный момент на экране. Пример: у меня есть вид с тэгом web и я читаю статью про вомбатов в wikipedia. Но тут вдруг приходит сообщение от друга Васи, я нажимаю волшебную клавишу, и добавляю в свой вид тэг im. Окно gajim'a появляется, я отвечаю и продолжаю читать про вомбатов. Или: пишу статью про dwm, хочу посмотреть как она выглядит в браузере, добавляю к тэгу main тэг web. Таким образом все что относится к текущей деятельности оказывается перед глазами.

Наблюдение 2.Классические оконные менеджеры не достойны этого гордого имени. Почему? По простой причине: окнами они не управляют, а просто перекладывают свою работу на пользователя, предоставляя ему такие средства как заголовки и кнопки в них. Замечали сколько времени уходит на перемещение окон по рабочему столу? Нет? Тогда объясните почему каждая эффективная рабочая среда (имеется в виду в первую голову vim и emacs) предлагает пользователю свою систему управления рабочим пространством, обычно реализованную в виде неперекрывающихся фреймов. То то же. Если у Вас есть достаточно времени попробуйте поработать в twm и увидите насколько это неудобно. Но далеко ли ушел от этих неудобств ваш оконный менеджер? Нет! Просто в него добавили некий уникальный для каждого набор костылей, которые поприкрыли непотребство.

"Винтовка - это праздник, все летит в пизду" Егор Летов.

Наблюдение 3. C каждым годом растет количество ядер, помещающихся в один процессор и количество мегагерц в каждом ядре. С каждым годом растет объём памяти поглощаемой приложениями, увеличивается количество кнопок и меню. Задачи же, по большей части, остаются теми же: редактирование текста, графики и мультимедиа. И если Microsoft можно подозревать в сговоре с производителями процессоров и видеокарт, то open source'ных хакеров в этом обвинять как-то.. не с руки. Anselm R. Garbe объясняет эту тенденцию стремлением создателей раздутого кода показать себя крутыми специалистами, понимающими то, что недоступно другим. Такой подход в корне неверен, и противоречит самой идее open source: "пишу один, доводим вместе". Против такого загромождения Anselm и выступает. Им был основан проект suckless.org:dedicated to software which sucks less. Кроме dwm в рамках проекта разрабатывается wmii, набор библиотек для взаимодействия по протоколу 9P, набор вспомогательных утилит, каким-либо образом полезных при использовании dwm или wmii, и wiki.

"Я покоряю города истошным воплем идиота, мне нравится моя работа, гори-гори моя звезда" БГ

Города-не города, но надеюсь кого-то мои словесные излияния заинтересовали. Так оно или не так - не знаю, но на этом от чистой теории перейду к чистой опять же практике. Получение dwm'a не составит труда, можно, конечно, как обычно положиться на пакетный менеджер своего дистрибутива. Но я бы не советовал этого делать, скорей всего там обнаружится устаревшая версия. Новые версии dwm/dmenu появляются весьма часто, примерно раз в 2 недели. На сегодняшний день это версия 4.0. Формат конфигурационного файла не менялся уже на протяжении вроде бы четырех релизов, и вроде бы устоялся. Ах, да, забыл Вас напугать.. dwm конфигурируется прямо в исходных кодах. (тут слышатся выкрики "фууу, ниасилили xml!", но автор не обращает на них внимания). На самом деле не так страшен Си как его малюют. Не страшнее FvwmScript как минимум. Поверьте, Вам не придется убивать недели и месяцы на настройку своего dwm.

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

PREFIX = /usr/local

Я лично предпочитаю устанавливать куда-нибудь в домашний каталог:

PREFIX = /home/polachok/Programs
но дело, конечно, ваше. После этого следует дать команду
make
а если не терпится, то и
make install
После этого dwm будет установлен и готов к работе, останется лишь прочитать man dwm и прописать его в качестве оконного менеджера по умолчанию.

На этом месте мы прощаемся с нетерпеливыми читателями и продолжаем разговор с более умеренными. Так вот, после команды make в каталоге с dwm появляется файл config.h (полученный копированием config.default.h). Его (как вы наверное догадались) мы и будем редактировать, а при возникновении каких-либо проблем всегда можно проделать

diff -u
с оригиналом и попробовать таким образом прояснить суть проблемы.

Файл 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 };
Честно говоря, мне совершенно непонятны причины таких вот сбивающих с толку умолчаний. Цифровые названия скорее наводят на мысль об организации работы по-старому, как с виртуальными рабочими столами. Я бы посоветовал сменить их на что-нибудь более.. осмысленное, вроде web, mail, dev и проч. Подумайте на какие отдельные классы задач можно разбить ваш рабочий процесс. Дальше идут правила размещения окон по тэгам:

#define RULES \
static Rule rule[] = { \
/* class:instance:title regex tags regex isfloating */ \
В первой и второй колонке можно использовать регулярные выражения. Вот пример из моего config.h:

{ "Gajim*", "im", True }, \
Это правило сделает все окна Gajim'a плавающими и разместит его на тэге im. Если требуется просто разместить окно на тэге в последней колонке пишется False.

Дальше видим


#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
Это способы "раскладывания" окон, я обычно их называю режимами. tile - укладывать плиткой, без перекрытий, одно или несколько окон при этом считаются главными - MASTER и занимает основную часть экрана. floating - как в традиционных wm. Здесь же можно указать символ, используемый для индикации текущего режима на панели dwm. Первый в списке режимов становится используемым по умолчанию, но вы всегда можете сменить текущий режим нажатием комбинации клавиш.
MASTERWIDTH
ширина MASTER-области в tile-режиме (изменяемо во время работы)
NMASTER
количество окон в MASTER-области (изменяемо во время работы)
SNAP
количество пикселей от границы экрана при котором плавающие окна прилипают к ней
Завершает конфиг описание модификатора и список горячих клавиш:
MODKEY
Клавиша-модификатор, по умолчанию Alt.
#define KEYS \
static Key key[] = { \
/* modifier key function argument */ \
Список горячих клавиш: модификатор, клавиша, функция, аргумент.
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
выход
Многие пользователи ion3 жалуются на якобы отсутствие в dwm "named scratchpads". Это необоснованно. Если вам требуется плавающее окно, появляющееся и исчезающее по горячей клавише создайте тэг, разместите на нем с помощью правил своё приложение, а затем добавьте в список горячих клавиш конструкцию с toggleview.

Как я уже писал немного выше dwm читает текст со стандартного ввода и способен выводить его на свою панель. Грех этой возможностью не воспользоваться, ведь таким образом пользователю даются практически неограниченные возможности добавления всяческих мониторов, вроде загрузки cpu или заряда батареи. Если Вы чувствуете в себе силы можете попробовать разобраться в этом:


echo "MPD: [`mpc | sed -n '2s/\[\(.*\)\].*/\1/;2s/playing/p/p;2s/paused/s/p;2s/stopped/t/p'`] `mpc | sed -n '1p'` `mpc | sed -n '2s/.*\]//p'|cut -d ' ' -f 2,6` | bat0: $(eval echo `grep remain /proc/acpi/battery/BAT0/state|cut -d ' ' -f 8`*100/4423 | bc) cpu0: `echo $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)/1000 | bc` | `date` `uptime | sed 's/.*://; s/,//g'`"
Если же городить подобную ахинею лениво можно воспользоваться (возможно привычным) conky, он ведь умеет выводить на консоль (man conky, опция out_to_console). Чтобы установить dwm в качестве оконного менеджера по умолчанию напишите в ~/.xinitrc или ~/.xsession что-то вроде:
 while true
do
echo `date` `uptime | sed 's/.*,//'` # или что-там у вас подается на stdin?
sleep 1
done | dwm

"Тра-та-та, тра-та-та, мы везем с собой кота. Обезьяну, попугая. Вот компания какая!" Из детской песенки

Запускать гуёвые программы из терминалок в виде:

firefox & exit
довольно тоскливо, не правда ли? Можно конечно для каждого нужного приложения прописать хоткей... Но проще и удобней воспользоваться dmenu. Ну да, dynamic menu. dmenu читает со стандартного ввода список значений разделенных символами новой строки "\n", выводит их в виде горизонтального меню, по которому можно перемещаться стрелочками (автодополение тоже работает), и выводит выбранный элемент на stdout. Все еще непонятно?

exec $(ls -lL `echo "$PATH" | tr : ' '` 2>|/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u|dmenu)
Эта штука запустит любой бинарник из $PATH и потому так и просится в config.h. Хотя, конечно, хорошо было бы организовать кэширование. Как это сделать интересующийся читатель догадается сам, а другой нам не нужен.

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