polachok ([info]polachok) wrote,
@ 2006-08-15 20:39:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Current music:сплин - джим

про dwm
Я уже однажды (сцылко) писал про wmii3 - первом динамическом оконном менеджере. Но с тех прошло
хоть и не так много времени, но кое-какие вещи изменились. Одна из них мой оконный менеджер.
Не спешите радоваться упрямые поклонники традиционных перекрывающихся окон. Нет, в ваш лагерь
я похоже в ближайшее время не вернусь (не люблю говорить никогда). Так на что же я променял
wmii? На dwm. Если вам показалось что в wmii слишком много "фич" dwm явно не для вас. Здесь их
еще меньше, например отправлена на свалку истории поддержка 9p-протокола, одна из ключевых
особенностей wmii. Туда же отправилась и поддержка конфигурационного файла, который как известно
прочитавшему мой предыдущий опус представлял из себя скрипт или иной вид исполняемого файла,
который занимался выставлением некоторых переменных и определением событий происходящих
при нажатии сочетаний клавиш и кликов по статусбару. Что же дает взамен dwm? Исключительную
простоту и удобство использования. dwm написан майнтайнером проекта wmii3, который решил что
wmii для него избыточен, а путь по которому идет развитие wmii4 и вовсе неправильный и основал
проект 10kloc.org. На этом сайте он и описал свои мысли по поводу развития современного ПО.
Основная идея: невозможно понимать код, содержащий более 10000 строк, с ростом количества строк
растет и количество ошибок, это же влечет и падение производительности.
dmenu
Итак, если я вас убедил - переходим к установке dwm. Если вы уже знакомы с wmii и привыкли к
ее менюшке можете скачать dmenu. Я всегда его использую, с него и начну.
tar -xvzf ./dmenu-0.4.tar.gz
cd ./dmenu-0.4
ls
config.arg.h dmenu.1 LICENSE README
config.default.h dmenu.h main.c util.c
config.mk draw.c Makefile
cat *|wc -l
852
То бишь dmenu 0.4 содержит 852 LOC. Меньше 1K :) И все что оно умеет - принять со стандартного
ввода список слов разделенных пробелами, показать его на экране и вернуть в стандартный вывод
выбранное слово. Кстати, вы можете использовать dmenu в сочетании с каким угодно wm/de,
создав небольшой скрипт вроде
#!/bin/sh
ls -lL `echo $PATH|tr : ' '` 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u | dmenu
выполняться он будет я б не сказал чтоб очень быстро, потому
если не хотите ждать и устанавливать программы во время сеанса
можете сделать так:
#!/bin/sh
proglist() {
ls -lL "$@" 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u
}
export PROGS_FILE=`mktemp /tmp/.wmiimenu.proglist.XXXXXX` || exit 2
proglist `echo "$PATH" | tr : ' '` >$PROGS_FILE
поместить вызов этих команд в ./.xsession (.xinitrc), а потом
уж вызывать dmenu < $PROGS_FILE.
Если не нравятся шрифты или цвета (такое часто бывает :) )
делаем так:
cp ./config.default.h ./config.h
vi(nano,emacs и тд) config.h
ну да, это сишный хедер (file config.h config.h: ASCII C program text),
но не стоит этого пугаться даже непрограммистам: не так страшен Си как его малюют!
Вот собственно перед нами конфигурационный файл, похож на стандартный формат конфигурационных
файлов UNIX: параметр - значение, ну и еще какое-то странное слово define. Но оно нас с вами не
интересует, мы не Си учим а dmenu настраиваем. Собственно из названий переменных их назначение
вполне ясно, по порядку: шрифт (в иксовом формате, можно выбрать через xfontsel), цвет фона,
цвет шрифта и бордюра. Выставляем по вкусу. Далее make; make install. Если же не нравится
умолчальный префикс - /usr/local меняем в файле config.mk. Я так все в ~/Programs ставлю, но
это дело вкуса и возможностей. Затем, как обычно, make ; make install.

dwm
tar -xvzf dwm-0.9.tar.gz
cd ./dwm-0.9
cat *|wc -l
2360
cp ./config.default.h ./config.h
vi[nano,emacs..) config.h
ну да тут немного побольше файл и посложнее, а кто обещал что все будет элементарно?
Первое, что можно (нужно?) настроить - имена тэгов. По умолчанию это 0,1,2.. выберите более
подходящие имена и не забывайте теги - не воркспейсы, а наименования группы окон, потому лучше
всего подойдут названия вроде work, net, devel и тд. Поехали дальше:
DEFMODE - как располагать окна по умолчанию - как в wmii/ion - чтоб не перекрывались или как
в традиционных менеджерах. Нельзя почувствовать всю прелесть dwm не выбрав первый!
DEFTAG - тэг по умолчанию. 1 значит второй, это такой сишный прикол, счет ведется с нуля :)
FONT/BG-FG-BORDER-COLOR я уже пояснял
MODKEY - это Mod1 т.е. ALT. Можно выбрать и ShiftMask, ControlMask, но тогда придется переписывать
всю следующую секцию, оставим эту идею :)
секция KEYS - горячие клавиши. вид ее таков:
модификатор(ы) клавиша вызываемая функция аргументы вызываемой функции
Модификатор обычно MODKEY, можно указать до трех штук, таким вот образом MODKEY|ControlMask|ShiftMask,
это означает Alt+ctrl+shift+клавиша.
функции - spawn - запуск аргумента, можно в качестве него указать любую шелл-конструкцию
вроде уже обсужденной "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null | " \
k 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`
Если на вашей клавиатуре имеются т.н. мультимедиа-клавиши использовать их можно следующим
образом: добавьте строку "#include "/usr/X11R6/include/X11/XF86keysym.h" в начало config.h,
а в секцию KEYS что-то вроде
{ 0, XF86XK_AudioNext, spawn, { .cmd = "exec `mpc next`" } }, \
focusnext - следующее окно
focusprev - предыдущее
zoom - увеличить окно в фокусе (т.е. разместить на тех процентах экрана, что указаны в
переменной MASTERW)
togglemax - максимизировать окно на весь экран
tag - отметить окно соответствующим тэгом (считать с нуля!) (остальные отметки обнуляются)
toggletag - отметить "еще и этим" тегом
killclient - закрыть окно
togglemode - переключить режим tile/float
view - увидеть тег
toggleview - увидеть "еще и этот тег"
quit - выход собственно :)
Теперь правила - RULES. Это правила размещения окон по тегам. Т.е. если вы на любом тэге
запустите Firefox он все равно будет отмечен вторым тэгом, и появится именно на нем.
формат таков:
класс окна (регулярное выражение) тэги плавающий
Гимп например объявлен плавающим - его окно растянутое на 60% экрана выглядит весьма гадко...
На этом все - make;make install. Хотя нет, не все еще можно чего-нибудь добавить в статус-бар. Для
этого нужно передать нужные данные на стандартный ввод dwm через конвейер:
например вот так показано в README:
while true
do
echo `date` `uptime | sed 's/.*://; s/,//g'`
sleep 1
done | dwm

а вот мой вариант:
while true
do
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'`"
sleep 2
done | dwm
Это все нужно добавить в ~/.xinitrc или ~/.xsession

На этом вроде бы и пора закончить :) Наслаждайтесь отличным легким, быстрым и удобным
оконным менеджером!

</lj>




(Post a new comment)


[info]redchrom
2006-08-16 06:18 am UTC (link)
Имхо это не нормально столько убивать времени на настройку оконного манагера. Задротсво.

(Reply to this) (Thread)


[info]polachok
2006-08-16 10:10 am UTC (link)
сколько? у меня заняла минут 15 настройка 0.7, потом копировал конфиг и все дела... впрочем спорить не охота и агитировать тоже.

(Reply to this) (Parent)


[info]z0id
2006-08-16 10:08 am UTC (link)
отличная штука этот dwm

(Reply to this) (Thread)

(Reply from suspended user)

[info]z0id
2006-08-16 12:43 pm UTC (link)
тока такие статьи под кат надо прятать

(Reply to this)


[info]soko1
2006-08-16 12:52 pm UTC (link)
забавно, но я пока на ионе завис.

(Reply to this) (Thread)

(Reply from suspended user)

[info]ogr666
2006-08-16 02:27 pm UTC (link)
Че-то для меня это пока сложноватенько, так что на "традиционных" WM пока останусь.

(Reply to this)

config.h
[info]erik_dessler
2006-10-03 05:52 am UTC (link)
А можешь поделиться своим конфигом dwm? А то почему-то у меня ничего не компилируется, если я пытаюсь кнопку добавить...

(Reply to this) (Thread)

Re: config.h
[info]polachok
2006-10-03 12:13 pm UTC (link)
/*
* (C)opyright MMVI Anselm R. Garbe
* See LICENSE file for license details.
*/
#include
[Error: Irreparable invalid markup ('<x11/xf86keysym.h>') in entry. Owner must fix manually. Raw contents below.]

/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <X11/XF86keysym.h>
#define TAGS \
const char *tags[] = { "main", "web", "im", "misc", "dev", NULL };

#define DEFMODE dotile /* dofloat */
#define FONT "-*-snap-*-*-*-*-11-*-*-*-*-*-koi8-r"

#define SELBGCOLOR "#59798e"
#define SELFGCOLOR "#eeeeee"
#define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"
#define STATUSBGCOLOR "#222222"
#define STATUSFGCOLOR "#999999"

#define MODKEY Mod1Mask
#define MASTERW 60 /* percent */
//#define MASTERH 50 /* percent */
#define FLOATSYMBOL "~"
#define TILESYMBOL "#"
#define WIDESYMBOL "="
#define KEYS \

static Key key[] = { \
/* modifier key function arguments */ \
{ MODKEY, XK_t, spawn, { .cmd = "osdexec aterm" } }, \
{ MODKEY|ControlMask, XK_Delete, spawn, { .cmd = "exec sudo /sbin/reboot" } }, \
{ MODKEY, XK_y, spawn, { .cmd = "exec mpc play `mpc playlist | colrm 60 500 | dmenu | colrm 1 1 | cut -d ')' -f 1,3`" } }, \
{ 0, XF86XK_AudioNext, spawn, { .cmd = "exec `mpc next`" } }, \
{ 0, XF86XK_AudioPrev, spawn, { .cmd = "exec `mpc prev`" } }, \
{ 0, XF86XK_AudioPlay, spawn, { .cmd = "exec `mpc toggle`" } }, \
{ MODKEY, XK_p, spawn, \
{ .cmd = "osdexec `ls -lL /home/polachok/Programs/bin /home/polachok/bin /usr/local/bin /usr/games/bin /usr/bin /usr/X11R6/bin /opt/mozilla/bin /opt/gno
"awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \
{ MODKEY, XK_j, focusnext, { 0 } }, \
{ MODKEY, XK_j, focusnext, { 0 } }, \
{ MODKEY, XK_k, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_m, togglemax, { 0 } }, \
{ MODKEY, XK_o, togglelayout, { 0 } }, \
{ MODKEY, XK_minus, resizecol, { .i = -10 } },\
{ MODKEY, XK_equal, resizecol, { .i = 10 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
{ MODKEY|ShiftMask, XK_4, tag, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_5, tag, { .i = 4 } }, \
{ MODKEY|ControlMask, XK_1, toggletag, { .i = 0 } }, \
{ MODKEY|ControlMask, XK_2, toggletag, { .i = 1 } }, \
{ MODKEY|ControlMask, XK_3, toggletag, { .i = 2 } }, \
{ MODKEY|ControlMask, XK_4, toggletag, { .i = 3 } }, \
{ MODKEY|ControlMask, XK_5, toggletag, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_F1, view, { .i = 0 } }, \
{ MODKEY, XK_F2, view, { .i = 1 } }, \
{ MODKEY, XK_F3, view, { .i = 2 } }, \
{ MODKEY, XK_F4, view, { .i = 3 } }, \
{ MODKEY, XK_F5, view, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_F1, toggleview, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_F2, toggleview, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_F3, toggleview, { .i = 2 } }, \
{ MODKEY|ShiftMask, XK_F4, toggleview, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_F5, toggleview, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_q, quit, { 0 } }, \
};

#define RULES \
static Rule rule[] = { \
/* class:instance regex tags regex isfloat */ \
{ "Firefox.*", "web", False }, \
{ "Firefox-bin.*", "web", False }, \
{ "Flock-bin.*", "web", False }, \
{ "MPlayer.*", NULL, True}, \
{ "Sylpheed.*", "misc", False }, \
{ "Gimp.*", NULL, True}, \
};

(Reply to this) (Parent)

Проголосуйте за меня
(Anonymous)
2007-05-25 02:13 pm UTC (link)
Привет!
Мне очень нужна помощь!
Не могли бы вы проголосовать за меня здесь:
http://avatars.pepsi.ru/avatar/view/6543/5963
поставьте пожалуйста оценку 5.
----
это не займет более 2 секунд.
Мне это ооочень нужно.
==
Заранее ОГРОМНОЕ СПАСИБО! :blush:

(Reply to this)


[info]v_silent
2008-05-17 06:41 am UTC (link)
Привет. а как можно настроить dwm который из репозитория ( Ubuntu Hardy ) при загрузке dwm
в верхней части экрана появляется 1,2,3,4 и E0F . Почитал man пробовал нажимать горячие клавиши чтобы хоть что то запустить, неполучилось. Как его настроить?

(Reply to this) (Thread)


[info]hunlong [ya.ru]
2008-07-21 03:53 pm UTC (link)
Видимо пересобирать.

(Reply to this) (Parent)


(Anonymous)
2008-08-05 11:43 am UTC (link)
Консоль запускается alt+shift+F2. А потом из нее остальное можно запустить.
А настроить его не получится, он уже скомпиленный и без исходного кода. Поэтому надо самому собрать из исходников.

У мну проблема: как его после сборки запускать?

(Reply to this) (Parent)(Thread)


[info]polachok
2008-08-05 12:15 pm UTC (link)
>У мну проблема: как его после сборки запускать?

while true
do
echo `date` `uptime | sed 's/.*://; s/,//g'`
sleep 1
done | dwm

Это все нужно добавить в ~/.xinitrc или ~/.xsession

см. выше (:

алсо, http://polachok.googlepages.com и http://rootshell.be/~polachok/code

(Reply to this) (Parent)


Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…