Настройка и использование Dwm (Динамический тайловый оконный менеджер) |
|
Дата публикации: Aug. 22, 2010, 9:13 a.m.
|
Теги: wm, dwm, |
Автор: Brainsburn |

Dwm - компактный и быстрый динамический тайловый оконный менеджер от проекта suckless.org. Разрабатывается параллельно с wmii. Отличительная черта dwm - компактность и быстрота. В этой статье я расскажу, что вам придется сделать, настроить и установить, чтобы подстроить dwm под себя. Ну и немного рассуждений и плюсах и минусах этого wm.
Почему dwm?
Попытаюсь объяснить. Основную часть своего времени вы тратите на работу
"внутри" программ. То, как эти программы выглядят и как они с вами
взаимодействуют, не зависит от оконного менеджера. По сути, от оконного
менеджера зависит то, _как_ вы попадете в нужную вам программу. В обычных
оконных менеджерах или, прошу прощения, в Windows, для того, чтобы перейти в
окно нужной программы, надо сделать такие действия:
1) Вспомнить, на каком рабочем столе вы оставили эту программу и переключиться
на него
2) Оторвать руку с клавиатуры и перенести ее на мышь.
3) Поводить мышкой по коврику, а глазами - по экрану, дабы определить
местоположение курсора
4) Тыкнуть курсором по заголовку нужного окна.
А вот, что надо сделать в dwm:
1) Переключиться одним шорткатом на тег (рабочий стол), на котором на постоянной основе
"проживает" нужная вам программа. При этом вспоминать ничего не надо - нужен
Firefox - переключаемся на тег "Web". Все просто.
2) Двумя-тремя нажатиями Alt-j перейти в окно нужной программы.
Вариант с dwm проще, вам не кажется? Если не кажется, ничего страшного - никто и не говорил, что dwm должен подходить всем. Конечно, мое доказательство удобности dwm не идеально, но я к этому и не стремился :) Просто лично для меня создает определенные трудности тот факт, что мне надо убирать руку с клавиатуры и тянуться к мыши, а потом еще и фокусировать свое внимание на курсоре. Видимо, не быть мне снайпером... Мне удобнее нажать пару клавиш вместо этого всего. Хотя, кому-то, соглашусь, не удобнее.
Еще одна полезность dwm заключается в том, что это _динамический_ тайловый
оконный менеджер. Это означает, что размеры окна автоматически будут
изменяться и окно программы будет занимать все свободное место всегда.
Вы можете забыть о необходимости менять
размер окна вручную.
Кстати, для меня было откровением, когда мне сказали, что в
Windows не работает Alt + "правый клик" для изменения размеров окна.
Там надо мышкой целиться ровно в край окна, чтобы его растянуть, представляете!
Да, я серьезно вам говорю! Не хотите, не верьте...
Так же в dwm понятие "рабочий стол" заменено понятием "тег". В принципе, одно и то же, просто у вас могут быть теги "Web", "IM", "Files" и программы могут быть настроены на запуск в определенных тегах. Можно в каком-то одном, можно в нескольких или во всех сразу. Довольно удобно.
Архив с dwm весит меньше 20кб. В dwm нету ничего лишнего. Абсолютно! Нету даже меню по правому клику мыши. В качестве утилиты для запуска программ рекомендуется использовать Ъ-вещь - dmenu. Очень мощная и удобная штука! О dmenu поговорим ниже.
Для настройки dwm надо редактировать файл config.h, а затем перекомпилировать. Это отпугивает многих, но на деле все, отнюдь, не страшно. Файл config.h очень прост, да и настройка dwm в принципе однотипна и проста, а перекомпиляция занимает буквально долю секунды.
В dwm нету панели задач - она не нужна. У вас могут возникнуть проблемы из-за отсутствия системного трея, но это - решаемая проблема. В dwm нету всплывающего меню по правому клику мыши - какое может быть меню, если фон рабочего стола вы увидите только, если ни одна программа не запущена? В dwm нету заголовков окон - опять же, за ненадобностью.
Автор dwm явно не из тех людей, которые любят писать громоздкий код. В этом я с ним согласен - код должен быть компактный, гибкий и понятный. Когда программа обвешана тучей ненужного хлама, который занимает 90% места и ресурсов, это плохо. Или, когда ICQ-клиент отжирает 150МБ, это просто ужасно.
Dwm - оконный менеджер из разряда "не для всех". Это означает, что большинству пользователей он будет не удобен. Если вы все еще читаете этот текст и не убежали с этой страницы с криками "да ну его #@%$@!", попытаюсь вас обрадовать - когда я только поставил dwm в первый раз, на настройку и приведение его к рабочему виду ушло не более 2-х часов, включая чтение документации и гугление. Это мало, особенно, если учитывать, что основной объем времени ушел уже на косметические штрихи. Например, я довольно долго экспериментировал с цветом границ окна и никак не мог выбрать между #eeeeee и #323232. Да-да, без гламура никуда.
Итак, долгая прелюдия подошла к концу и можно переходить кхм... к делу.
Установка и базовая настройка dwm
Получить исходные коды можно отсюда: http://dl.suckless.org/dwm/ . Последняя версия dwm на данный момент - 5.8.2. Так же вы можете получить самый свежий код так:
hg clone http://hg.suckless.org/dwm( я ставил dwm именно этим способом). Про установку dwm с помощью пакетного менеджера вашего дистрибутива Linux я говорить не буду. Разве что, если вы ставите dwm в Gentoo, обратите внимание на use-флаг savedconfig. Процесс сборки dwm прост, как два пальца:
$ make # make install
После выполнения make, вы обнаружите файл config.h. Это именно тот файл, редактируя который, настраивают dwm. Команда make install сделает всего ничего - скопирует бинарник dwm в /usr/local/bin и ман в /usr/local/share/man/man1/. После этого вы можете запускать и использовать dwm. Вы спрашиваете, как запустить dwm? Просто - с помощью файла ~/.xinitrc.
Все, что нужно - добавить туда строку со словом "dwm" (без кавычек). ~/.xinitrc вообще очень хороший файл и он нам еще поможет не раз.
При первом запуске вы можете обнаружить, что вам ничего не понятно. Но это заблуждение - вам _уже_ все понятно. Ну или почти все... Первый вопрос, который возник у меня - как запускать программы? На первое время сойдет сочетание Alt-Shift-Enter, которое запускает эмулятор терминала. Перемещаться между рабочими столами ака тегами можно по Alt-[1..9]. Сперва, дам список клавиатурных сочетаний, используемых в dwm, а затем, опишу процесс конфигурирования config.h.
Клавиатурные сочетания dwm
Alt-Shift-Enter - запуск терминала Alt-p - dmenu (если он установлен, конечно) Alt-(1..9) - перемещение по тегам Alt-Enter - сделать активное окно "мастером". Попробуете - поймете. Alt-j и Alt-k - перемещение между окнами программ Alt-h и Alt-l - изменение размера окна по ширине Alt-Shift-c - закрыть активное окно Alt-Shift-q - закрыть dwm Alt-t - переход в tiled режим (основной режим) Alt-m - переход в monocle (переводит окно в полноэкранный режим)
Файл config.h
После редактирования config.h для активации изменений достаточно выполнить make install.
Первые несколько строк задают шрифт и цвета.
font[] - шрифт normbordercolorp[] = цвет границ окна normbgcolor[] = цвет фона normfgcolor[] = цвет текста в статус баре selbordercolor[] = цвет границ активного окна selbgcolor[] = цвет фона заголовка окна selfgcolor[] = цвет текста заголовка окна borderpx = ширина границ окна
Далее, после /* tagging */ идет строка, которая описывает имена тегов. По умолчанию там цифры от 1 до 9.
Следом за ней - rules[], в которых присваиваются теги для программ.
static const float mfact = 0.55Это означает, что размер мастер окна будет 55% от ширины экрана.
После этого найдите такую строку:
static const char *dmenucmd[]Тут задается команда для запуска dmenu. После нее - *termcmd[] - команда для запуска терминала. Еще ниже - в keys[] указывается, какие клавиатурные сочетания будут вызывать эти команды.
Вроде все. Ликбез закончен, перейдем к практике.
Кирилица в dwm
Первым делом вы можете обнаружить, что у dwm есть проблемы с отображением кириллицы (русских букв) в панели (статус баре). Я не буду разглагольствовать, почему автор не удосужился сделать нормальную поддержку utf-8, а просто скажу, как это исправить:
static const char font[] = "-*-clean-*-*-*-*-*-*-*-*-*-*-iso10646-*";Собственно, вы можете использовать любой шрифт, поддерживающий iso10646.
Как узнать, поддерживает ли ее шрифт? Используйте утилиту xfontsel.
Теперь о цветах. Статус бар dwm по умолчанию синий. Мне больше нравится темно-серый:
static const char normbordercolor[] = "#999999"; static const char normbgcolor[] = "#323232"; static const char normfgcolor[] = "#eeeeee"; static const char selbordercolor[] = "#eeeeee"; static const char selbgcolor[] = "#3a3a3a"; static const char selfgcolor[] = "#ffffff";
Теги. Вот как это выглядит у меня:
static const char *tags[] = { "web", "im", "console", "files", "main", "6", "7", "8", "9" };
Правила:
static const Rule rules[] = { { "Gimp", NULL, NULL, 0, True, -1 }, { "Firefox", NULL, NULL, 1 << 0, False, -1 }, { "Roxterm", NULL, NULL, 1 << 2, False, -1 }, { "trayer", NULL, NULL, ~0, False, -1 }, };
"1 << 0" означает, что Firefox будет запускаться на первом теге ("web"), "1 << 2" означает, что Roxterm будет запускаться на третьем теге ("console"), "~0" означает, что trayer будет запускаться сразу на всех тегах. Таким образом добавляете в правила приложения, которые вы используете и каждое будет запускаться только там, где надо.
С конфигом почти разобрались. Я не описал только одну, но очень важную деталь. Я опишу ее позднее, это будет о настройке клавиш на мультимедиа клавиатуре.
dmenu
Dmenu - очень мощная штука и о его настройке написано много мануалов. Но исполнять свои прямые обязанности dmenu может и без настройки. Просто установите dmenu, в конфиге dwm для него уже есть шорткат. Нажмите Alt-p, вверху появится само dmenu, начните набирать первые буквы нужного вам приложения (к примеру - firefox) и вы увидите, как уменьшается список команд, которые начинаются на эти буквы. Когда этот список сократится до одного, нажмите Enter. Вот так тривиально и без излишеств рекомендуется запускать программы в dwm. Да-да, никаких тебе иконок, ярлычков и других бесполезных выкидышей гламура. По статистике человек в основном использует не более десяти программ (не считая системных консольных утилит), не так трудно запомнить их названия. Лично для меня проще набрать "fire" для запуска веб-браузера, чем водить курсором по экрану.
Что делать с conky?
До dwm у меня был красивый и большой conky, который красиво показывал много всякой интересной информации о системе. Когда я пересел на dwm, то вдруг обнаружил, что всю _полезную_ информацию о системе можно уместить в одну строку в статус баре dwm =)
Conky в dwm можно запускать как обычно, отдав ей во владения какой-то один тег. Можно conky запускать с опцией "own_window no". А можно поступить правильнее и настроить conky на вывод информации в статус бар dwm. Конечно, придется отказаться от всяческих графиков горизонтальных, графиков вертикальных, оставив только ту информацию, которая влезет в одну строку: информация о cpu, ram и о сетевых интерфейсах. Первым делом, надо настроить conky на вывод информации в консоль. Так выглядит мой ~/.conkyrc:
background no out_to_console yes out_to_x no update_interval 2 total_run_times 0 use_spacer none TEXT cpu:${cpu}% mem:$memperc%($mem) down:${downspeed corbina} up:${upspeed corbina} ${time %A} ${time %d} ${time %H}:${time %M}Текст в статус бар dwm добавляется с помощью xsetroot. Отредактируем должным образом ~/.xinitrc:
conky | while read -r; do xsetroot -name "$REPLY"; done & dwm
Установка фона рабочего стола в dwm
Это делается как обычно, но я все же опишу процесс для тех, кто в танке. Фоновую картинку в иксах можно задавать командой feh. Установите ее, если не сделали этого раньше. Теперь добавляем следующую строку в ~/.xinitrc:
feh --bg-scale /Pictures/image.jpg &Ее можно добавлять в любое место xinitrc, главное, чтобы она была перед строкой "dwm".
Раскладка клавиатуры. Про отдельную раскладку клавиатуры для каждого окна с помощью xxkb я уже писал.
Автозапуск программ в dwm производится с помощью все того же файла ~/.xinitrc:
psi & qutim & xxkb & feh --bg-scale /files/Pictures/Linux/lxf117-wide.jpg & conky | while read -r; do xsetroot -name "$REPLY"; done & gnome-terminal -e weechat-curses & dwmСистемный трей в dwm
Для этой цели вы можете использовать, к примеру, утилиту trayer. Просто поставьте ее в автозапуск и сделайте правило в config.h для размещения ее на всех тегах.
Теперь расскажу о той очень важной вещи про config.h, о которой не договорил вначале.
Настройка горячих клавиш мультимедиа клавиатуры в dwm
Делается это в три шага
1) Узнаем код клавиши с помощью утилиты xev
2) Добавляем команду в config.h
3) Добавляем сочетание клавиш в config.h, которое будет вызывать эту команду
Как использовать xev. Запускаете xev в терминале и жмете нужную клавишу. Вы увидите нечто подобное:
KeyPress event, serial 30, synthetic NO, window 0x1200001, root 0x15b, subw 0x0, time 235999518, (370,513), root:(371,528), state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,Вам нужно значение keysym.
Теперь добавим команды для увеличения и уменьшения громкости. В разделе /* commands */ (там уже есть по-умолчанию команды для dmenu и терминала) добавьте следующие строки:
static const char *apluscmd[] = { "amixer", "sset", "Front", "1+", NULL }; static const char *aminuscmd[] = { "amixer", "sset", "Front", "1-", NULL };Далее, в static Key keys[] добавьте клавиатурные сочетания, которые будут вызывать эти команды:
{ 0, 0x1008ff13, spawn, {.v = apluscmd } }, { 0, 0x1008ff11, spawn, {.v = aminuscmd } },жирным шрифтом выделены коды клавиш, которые вы получили с помощью xev.
На всякий случай показываю полностью ту часть конфига, которая отвечает за мультимедиа клавиши, а именно - пауза/плей, стоп, след. трек, пред. трек, перемотать вперед, перемотать назад, увел. громк., уменьш. громк., выкл./вкл. звук.
/* commands */ static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; static const char *termcmd[] = { "roxterm", NULL }; static const char *apluscmd[] = { "amixer", "sset", "Front", "1+", NULL }; static const char *aminuscmd[] = { "amixer", "sset", "Front", "1-", NULL }; static const char *atogglecmd[] = { "amixer", "sset", "Front", "toggle", NULL }; static const char *mpdnextcmd[] = { "mpc", "next", NULL }; static const char *mpdprevcmd[] = { "mpc", "prev", NULL }; static const char *mpdstopcmd[] = { "mpc", "stop", NULL }; static const char *mpdtogglecmd[] = { "mpc", "toggle", NULL }; static const char *mpdseekpcmd[] = { "mpc", "seek", "+00:00:10", NULL }; static const char *mpdseekmcmd[] = { "mpc", "seek", "-00:00:10", NULL }; static Key keys[] = { /* modifier key function argument */ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, togglebar, {0} }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, { MODKEY, XK_comma, focusmon, {.i = -1 } }, { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, { 0, 0x1008ff13, spawn, {.v = apluscmd } }, { 0, 0x1008ff11, spawn, {.v = aminuscmd } }, { 0, 0x1008ff14, spawn, {.v = mpdtogglecmd } }, { 0, 0x1008ff15, spawn, {.v = mpdstopcmd } }, { 0, 0x1008ff17, spawn, {.v = mpdnextcmd } }, { 0, 0x1008ff16, spawn, {.v = mpdprevcmd } }, { 0, 0x1008ff12, spawn, {.v = atogglecmd } }, { MODKEY, 0x1008ff17, spawn, {.v = mpdseekpcmd } }, { MODKEY, 0x1008ff16, spawn, {.v = mpdseekmcmd } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) TAGKEYS( XK_4, 3) TAGKEYS( XK_5, 4) TAGKEYS( XK_6, 5) TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, };
Да, это может показаться сложным, но вы ведь не меняете мультимедиа шорткаты каждый день? :)
Скриншоты dwm
Вообще, глупо показывать скриншоты оконного менеджера, единственная видимая часть
которого - статус бар, высотой в 12 пикселей. Весь внешний вид dwm зависит
полностью от внешнего вида программ, запущенных в нем. Но, все-таки, выложу
пару скриншотов.
А вот. что получилось у меня:
На этом все. Спасибо за чтение.
Возможно, эти материалы Вас заинтересуют:
- Настройка и использование Dwm (Динамический тайловый оконный менеджер)
- DWM+Dzen2+Conky. Настройка.
- dwm
Рекомендовать эту страницу:
Комментарии:(25)
И сразу вопрос. Столкнулся с мелкой проблемой. После переключения раскладки на русскую, мышь перестает переключать рабочие столы. Подскажите как решить эту проблему.
Меньше недели назад я открыл для себя фреймовые окнные менеджеры - теперь думаю сносить xfce :)
Попробовал DWM - был по-настоящему шокирован размерами архива :), но пока не могу разобраться со схемой разбивкм окон на фреймы. Есть ли в DWM
Есть ли в DWM возможность изменять с помощью хоткеев или мыши разбивку окон с горизонтальной на вертикальную и т.д., как в Awesome?
Хорошо было бы статью написать про патчи для DWM, реально с последней версией работает около 3-х патчей.
Про патчи сам уже давно думаю что-то написать, но никак руки не дойдут. Кстати, если кому интересно, я написал про интеграцию Dzen2 в DWM: http://zenux.ru/articles/47/
Скажите можно ли избежать следующих проблем при использовании trayer:
при переключении между тегами первоначально выбирается как раз таки trayer и это очень неудобно.
Dzen2, кстати, интегрируется в DWM отлично. Интересно, как у него это получается?
Кстати, еще проблема - java приложения (редактор Intellij IDEA) при запуске или при переключении тегов теряет фокус клавиатуры и приходится мышкой по нему щелкать, чтобы клава заработала - неудобно. Запуск java приложений пофиксен через wmname.
www.cypherpunks.ru/DWM.html
После переключения раскладки на русскую, мышь перестает переключать рабочие столыхе.. в awesome 3.4.13-1 тоже
пофиксили в DWM 5.9 баг, когда с русской раскладкой мышь не переключала тегиа когда в awesome?
Комментировать:
Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.