Настройка wmii
В этом посте я как и обещал, расскажу про настройку wmii (window manager improved 2), на примере моего файла конфигурации. Обо всём рассказать довольно трудно ибо нужно рассказать очень многое, поэтому я лишь вкратце опишу некоторые возможности. и как они реализованы.
Как я уже писал, в wmii присутствует своя псевдо-файловая система доступ к которой, осуществляется с помощью утилиты wmiir. Посмотрим содержимое "/" - корня:
└─| % → wmiir ls /
client/ # Список всех окон в виде X формата
colrules # Правила разбиения
ctl # Основной так сказать, файл конфигурации. В нём глобальные опции, такие как цвет\\шрифт и прочее
event # Происходящие события. Например нажатие клавиши
keys # список используемых комбинаций клавиш
lbar/ # Левая часть панели - та, где теги.
rbar/ # Правая часть панели. Обычно используется для вывода информации
tag/ # Список всех **существующих** тегов.
tagrules # Правила для программ
Любой элемент файловой системы, можно в любой момент удалить\считать\записать (remove\read\write\xwrite). Любое изменение не заставит себя ждать. Создадим для примера элемент правой панели, поместим туда информацию и удалим его:
wmiir create /rbar/test # Создаём элемент панели
echo -n "It's a pretty simple test!" | wmiir write /rbar/test # Помещаем туда просто текст
wmiir remove /rbar/test # Удаляем панель со всем содержимым.
С этим разобрались. Теперь стоит разобраться на рабочем примере в данном случае которым выступает - мой конфигурационный файл.
Фактически в конфигурационной файле wmii настраивается его полное поведение. Начнём с простого:
# Configuration Variables
MODKEY=Mod4
UP=k
DOWN=j
LEFT=h
RIGHT=l
MODKEY это модификатор. Т.е. после нажатия этой клавиши, wmii перехватит клавиатурное сочетание и если такое используется, то выполнит команду, в противном случае передаст эту комбинацию выделенному окну. У меня mod4 это клавиша «Windows». У вас она может быть другой. Это зависит от ваших настроек xmodmap. В переменных UP\DOWN\LEFT\RIGHT указываются клавиши для перехода между окнами, они же будет использоваться для изменения размеров, и перемещения окна из одного столбца в другой. Можно заменить на любые по желанию, например на стрелочки - будут иметь такое же название, или на emacs style - b\f\p\n. Я заядлый vim'ер поэтому мне привычнее h\j\k\l ☺
# Colors
WMII_FOCUSCOLORS='#FFF5EE #686363 #708090'
WMII_NORMCOLORS='#bbbbbb #222222 #000000'
WMII_BARCOLORS='#CCFF33 #222222 #000000'
# Set font
WMII_FONT='xft:Monospace:size=9:style=Regular'
Как видно выше, цвета задаются в привычном RGB виде. Первый столбец цвет текста, второй фона, третий рамки. WMII_FOCUSCOLORS
и WMII_NORMCOLORS
это цвета для активных элементов, и неактивных соответственно. WMII_BARCOLORS
я добавил для панели информации. Относительно шрифтов: wmii прекрасно поддерживает utf8, поэтому с любым шрифтом в котором присутствует кириллица проблем с отображение русских символов возникнуть не должно. Xft присутствует в wmii с версии 3.0.
TAGS=("0.zero" "1.www" "2.im" "3.term" "4.code" "5.p2p" "6.file" "7.song" "8.text" "9.misc")
Тут нужно подробнее. Дело в том, что манипуляции с тегами, и их названиями кладётся полностью на плечи пользователя. Для перемещениями между столами, идёт опрос клавиш в постоянном цикле - main loop так сказать. В этом цикле проверялось нажатие клавиш, и если были нажаты mod-1\2\3\4\5\6\7\8\9\0, то фокус переходил на тег под соответствующим номером. Меня абсолютно не устраивало видеть просто теги без названия, поэтому я создал нумерованный массив. Вышло так, что при нажатии на клавишу, выбирается соответствующий элемент из массива, и фокус переходил на него. На мой взгляд это заметно удобнее и проще для восприятия чем простые цифры :)
wmiir write /tagrules < ~
/Firefox/ -> 1.www
/Tkabber/ -> 2.im
/osmo/ -> osmo
!
Так легко и непринуждённо, задаются правила размещения окон или приложений. Стоит обратить внимание на то, что wmii ориентируется на заголовок. Т.е. например если вы хотите поместить tkabber на второй тег, то необходимо писать заголовок или его часть. После размещения окна на соответствующем теге, его последующий заголовок для wmii не важен. Правила записываются в файл /tagrules
построчно, и обязательно с символом конца файла. В данном случае - «!». В примере выше, SMPlayer будет появляться всегда в плавающем режиме на любом теге. Для osmo не предусмотрено тега, и помещать на какой либо из уже имеющихся я тоже не стал. Поэтому специально указал заранее нигде не объявленный тег: wmii его создаст.
echo $WMII_BARCOLORS | wmiir create /rbar/1
echo $WMII_BARCOLORS | wmiir create /rbar/2
echo $WMII_BARCOLORS | wmiir create /rbar/3
status () {
echo -n $(/usr/bin/skb -1) | wmiir write /rbar/1
echo -n $(cat /tmp/.google_weather) | wmiir write /rbar/2
echo -n $(date +'%a %d %b %H:%M') | wmiir write /rbar/3
}
Если внимательно читали начало, то здесь всё понятно :) Я создал функцию status, в которой заполняю содержимое правой части панели. Её же вызываю в основном цикле чтобы информация постоянно обновлялась. Есть один небольшой нюанс - я дал барам номера вместо названий. Связано это с тем, что если давать им имена, то элементы панели будут отображаться по одному им известному порядку.
После этого, идёт крайне большой кусок main-loop'а так сказать. Я не стал подробно на нём останавливаться, иначе бы этот пост затянулся ещё на очень много... Если вкратце, то в цикле идёт управление событиями, назначение клавишных комбинаций:
Key $MODKEY-Shift-c wmiir xwrite /client/sel/ctl kill
$MODKEY
модификатор который мы назначили ещё в самом начале (mod4
).
for i in 0 1 2 3 4 5 6 7 8 9; do
sed 's/^ //' <
А вот это, то самое место про которое я писал выше: цикл проверки клавиш mod-1\2\3\4\5\6\7\8\9\0
. При нажатии (например mod4-5
), команде wmiir xwrite /ctl view ${TAGS[$i]}
передаётся номер клавиши, который так же соответствует элементу массива. Таким образом осуществляется переход между тегами. Функция чуть ниже при так же зажатой клавише Shift, перемещает выделенное окно, на тег под соответствующим номером. В моём конфиге так жесть ещё пара функций, которые перемещают к следующему\предыдущему тегам.
wmiir write /ctl <
Здесь указали основные параметры wmii. Я бы сказал жизненно важные. Значения записываются из переменных что были в самом начале. Снова обращу внимание на то, что все параметры должны быть записаны построчно, и с символом конца файла в конце. В посте остались некоторые пробелы. Например я не написал про создание правил разбиения для тегов заранее. Не сделал я этого только потому, что не нуждаюсь в этом и даже не пробовал настроить. Возможно позже, когда мне понадобится, я сделаю и обязательно напишу о том, как я это сделал. Если появится достаточно людей желающих чтобы я описал подробнее тот самый кусок main-loop'а, и некоторые моменты которые я опустил в данном посте, то я обязательно это сделаю :) That's all. I hope you enjoy using wmii ;)