четверг, 17 декабря 2009 г.

И вновь "ложится плитка".

У меня уже было несколько заметок о "плиточных" менеджерах окон (tiled wm). Вот еще одна. Те, кого не интересует тема менеджеров окон, или не интересуют конкретно tiled wm могут смело скиповать эту заметку: они от этого ничего не потеряют. ;) Для тех же, кого эта тема волнует пожалуй начнем...

И так, как я уже писал, так называемые менеджеры окон, к которым мы привыкли (с плавающими окнами), совершенно не оправдывают звания "менеджеров", ибо само это слово обозначает "управлять", то есть "управляющий окнами". По сути же они только создают эти самые окна, в самом лучшем случае не совсем произвольно кидают их на экран и дают пользователю функционал, позволяющий уже непосредственно управлять этими самыми окнами. То есть это не менеджеры, а "креаторы/дистроеры". ;) А вот "плиточные" же, являются уже в полной мере именно менеджерами. Ибо пользователю лишь изредко надо "подправить" что-то, что ему не совсем по вкусу.

Прочтя как-то кучу статей про это чудо, я решил попробовать как же это выглядит на практике. Опробовано было почти все (xmonad, awesome, ion, ratpoison и что-то там еще). Реально некоторое время пожил у меня только xmonad. И нравился он мне, и работал не плохо не были у него определенные минусы:
  1. Какого-то рожна он периодически падал. Почему - я так и не разобрался. :(
  2. Хотя практически все менеджеры этого типа конфигурятся через правку конфига, который есть не что иное, как кусок кода, с xmonad было пожалуй сложнее всего. И связано это в первую очередь с тем, что написано он на haskel, функциональном языке программирования, с которым я никогда не работал. И хотя было прочтено довольно много литературы, сломать свои мозги под haskel я так и не смог. :( Соответственно так и не смог довести конфиг до идеального состояния "под себя".
  3. Раздражало, что очень многие диалоговые окна xmonad не смотря на все мои усилия так и не хотел признавать диалоговыми и открывал как полноценное окно, на полную.
  4. Не смотря на все прелести haskel, xmonad все же довольно медлителен.
В общем через некоторое время я вернулся в гном, заменив в нем metacity на openbox, в конфиге которого сделал следующее:
  1. все окна по умолчанию открывались на весь экран
  2. окна были "привязаны" к конкретным "воркспейсам", не все конечно, но "каждодневные". Например firefox - к первому, консоль - ко второму, pidgin - к третему, "почта" - 4-ому, игры - к 9-ому
  3. горячие клавиши были "стырены" с xmonad, ибо очень понравилось, ибо очень напоминает vim. :)
И все бы ничего, но раздражала одна деталь: если я например кликал на ссылку в pidgin, то она открывалась в firefox, который тут же перемещался в экран 3, где находится pidgin. Это очень сильно раздражало. Как это решить в openbox я так и не нашел. И решил опять обратится к tiled wm...

На этот раз я решил таки (уж не помню почему), еще раз попробовать awesome. И на этот раз, в отличии от предыдущего, все получилось очень хорошо. :) Но об этом по порядку...

Для начала я решил сделать свою тему. Ну тут все просто: берем стандартную (или как я, чужую, в частности sky) и меняем в ней цвета и картинки. Лично для меня самой большой сложностью было подобрать именно цвета. Но гимп помог и тут. :) Сам же конфиг очень прозрачен и пояснений не требует. Скажу лишь, что цветовую гамму я "подделывал" под гнома, ибо планировал использовать networkmanager (да, нравится он мне! хотя и не без недочетов, но в дороге довольно удобно подрубаться в wifi сетям), а нынешнее его офрмление лучше всего смотрится на такой цветовой гамме. Бакграунд был сляпан с уклоном в убунтовские рыже/коричневые тона. Кому не нравится - делайте сами лучше, если сможете, мне покатит и так. ;)

Конфиг был взят за основу дефолтный. Поколдовать с ним пришлось, хотя и не очень сильно. Вообще lua оказался довольно простым, в отличии от haskel, так что там довольно прозрачно все, хотя еще и не оптимально. ;) В паче так же видно, что я хочу еще доделать парочку вещей для удобства. :) Немного не очевидно для меня была процедура изменения дефолтного расположения окон для третьего тега, но в конце концов я нашел как это делается.

Тут нужно небольшое лирическое отступление о том, что и как называется...

Что бы понимать что и как работает в awesome, надо знать несколько терминов и принцип организации этого всего дела. Во первых надо уяснить, что при старте этот wm создает от одного до нескольких экранов. Экраны, в его понимании, это именно физические экраны. То есть мониторы подключенные к компу. Если у вас одна карта один монитор - то все просто: это будет экран 1. Если же у вас 1 видео адаптер и к нему подключено 2 монитора, то это уже 3 экрана. Ну и так далее. Что касается динамического подключения/отключения - не спрашивайте, не знаю еще. :)

Вообще в awesome есть несколько объектов:
  1. screen - экран, описанный выше
  2. client - окно запущенного клиентского приложения
  3. tag - опишу чуть нижу
  4. widget - ну собственно виджеты :) о них тоже позже, но по сути это небольшие объекты в которых мы можем что-то отображать или что-то делать
  5. titlebar - по сути рамка вокруг клиента. В отличии от заголовка окна в обычных wm, тут мы можем в titlebar засунуть нужные нам виджеты. Надо ли оно мне - пока не придумал, а по сему отрубил :)
  6. statusbar - панель в верху экрана (можно ли поставить ее в другое место пока тоже не знаю), в которые мы можем насовать нужной нам фигни соответственно сформировав нужную нам панель.

И так: у нас есть экран. Что нам надо еще? Правильно, панель. Создаем статусбар и цепляем ее к скрину. Если этого не сделать - панелью пользоваться будет нельзя! Хотя она и была создана. Вообще тут любой объект если был создан, но не был прикреплен - становится бесполезным.

Теперь у нас есть экран с панелью. Но она пуста! Фигня! Создаем теги.

Теги - чем-то напоминают обычные экраны в понимании например того же metacity или openbox и по сути являются ими, за исключением одного "но": одному и тому же приложению может быт задано несколько тегов. Соответственно в отличии от экранов openbox, где окно может быть только в одном (или во всех сразу, если оно прицеплено), тут окно мы будем видеть во всех тегах, которые на него "повешены". :) Соответственно при желании мы можем включить несколько тегов одновременно. Или выключить не нужные. Внешне же они пожалуй больше ни чем не отличаются от экранов.

Теги имеют имя (в дефолтном конфиге это цифры от 1 до 9) и layout, внешний вид. layout - по сути есть алгаритм размещения окон в данном теге. По умолчанию это:
  1. tail - большое "главное" окно занимает половину экрана, остальные делят поровну оставшуюся часть
  2. fair - половину экрана делят 2 окна, остальные поровну делят вторую половину
  3. max - основное окно распахнуто на весь экран
  4. magnifier - основное окно находится в центре, но занимает не весь экран, а половину, остальные окна делят весь экран находясь как бы под основным
  5. floating - ну тут вроде комментарии не нужны: плавающее окно, оно и есть плавающее. :)
Так же для каждого типа есть несколько вариантов. К примеру для tail и fair - расположение основного окна слева, справа, вверху, внизу. Для max - распахнуто на весь экран, или на весь совсем, закрывая даже панель. Ну и естественно для каждого лайаута можно задать процент занимаемый основным окном. Например для 3-его тега, там где pidgin, у меня отношение 0.75. То есть основное окно, то есть чат, занимает слева 75% крана, а оставшаяся узкая полоса занимается списком клиентов.

Далее виджеты. Их не так много, но вполне достаточно. ;) В частности у меня созданы виджеты на статус баре слева на право:
  1. launcher - при нажатии открывает меню
  2. taglist - область с визуально отображенными тегами
  3. tasklist - область, где видны клиентские окна с активными в данный момент тегами (говоря терминами привычных менеджеров: окна в данном воркспейсе)
  4. promptbox - по сути не отображается, но когда нажимаем комбинацию клавиш "запустить..." раздвигает соседние виджеты и выдает строку для набора команды. Поддерживает добивку tab-ом почти как шел
  5. textbox ("часы") - текстовый видежт. Фактически свободное поле, куда можно вывести любой текст. С помощью одного из "хуков" обновляется раз в минуту записывая туда дату и время. :) Самые примитивные часы. :)
  6. layoutbox - небольшая область, в которой отображаются картинки с текущем layout. Собственно аналогичен textbox, только нужен для отображения графических изображений
  7. ну и конечно же tray. :) комменты тут излишни, так как без трея сейчас не обходится ни одни wm. ;)
Ну собственно почти и все: wm у нас почти сконфигурен. Осталось забиндить нужные нам клавиши и добавить hooks. В хуки особо не вникал, но они нужны для выполнения тех или иных действий в зависимости от обстоятельств. Например обновлять textbox с моими часами, выполнять некие действия при старте клиентской проги, выполнять действия при прохождении мыши надо окном (ну или не выполнять, это уже как захотите ;)) и так далее.

С клавишами в общем тоже все понятно: комбинация клавиш и то что мы по ней делаем. Или вызываем какую либо функцию wm-а, или отрабатываем ряд действий, засунутых в свою собственную функцию. В общем для человека хоть раз что-то писавшего на каком либо языке тут все понятно. :)

Вот примерно так. :) На подходе описание всяких извратств, типа выпадающего календаря. ;)