суббота, мая 19, 2012

Awesome и Skype в нём.

 С тех пор, как моей основной рабочей средой в линуксе стал оконный менеджер , Awesome меня перестали заботить многие вещи: окна приложений легко и непринуждённо размещаются по определённым тегам, а управление окнами производится с клавиатуры на уровне рефлексов; на двух панелях размещены только необходимые виджеты, а места на экране они почти не занимают; заголовки окон забыты как страшный сон, а мышь используется в двух-трёх приложениях. Короче, красота и чувство полного контроля над средой. Если бы я знал чем измерить эффективность работы, наверное сказал бы, что эффективность увеличилась многократно. А вот по поводу удобства могу это сказать безо всяких "если".

И только один пунктик меня долгое время раздражал. Как ясно из заголовка - это Skype. Верней, окна с чатами. Для решения этой проблемы придуманы какие-то костыли, например Skype Tab. Откровенно говоря, я его даже и не пытался использовать в виду явной порочности такого подхода. Окнами должен управлять... оконный менеджер. Таково моё, никому не интересное, мнение.

Вкус к тайловым оконным менеджерам мне привил покойный Ion3, воскресший в форках вроде Notion. Так вот Ion и его наследники умеют группировать окна в табы. И вполне логично, что я начал искать такую же возможность в Awesome. Первое упоминание об этой фиче обнаружилось прямо на домашней странице Awesome:
A lot of Lua extensions to add features: dynamic tagging, widget feeding, tabs, layouts …;
 Дальнейшие поиски этого необходимого расширения привели меня в список рассылки Awesome. Ровно два упоминания. И ни одной реализации(или плохой Гугл). Взяв за основу идею из рассылки, расчехлил вим, открыл документацию по Lua и Awesome API, и сел ваять.

Код не блещет красотой, а, возможно, и эффектностью, но своё дело делает. Группировать в табы окна уже можно.

Плюсы:
  • одно окно для чатов со списком вкладок;
  • переключение между чатами привычным сочетанием клавиш - Ctrl-Tab и Ctrl-Shift-Tab.
 Минусы:
  • едва заметное мерцание окна чатов, связанное с особенностиями реализации, об этом в следующем пункте;
  • заменяет стандартный titlebar, что в моём случае совсем даже и не проблема.
  • переключение между чатами привычным сочеатнием клавиш - Ctrl-Tab и Ctrl-Shift-Tab ведёт к неизбежным конфликтам с приложениями, использующими такие кнопки в своих целях (добавлено в TODO и FIXME).
В двух словах о деталях реализации.
Окна группируются по правилам раскладки окон по тегам. Я использую библиотеку shifty.

 shifty.config.apps = {
    { match = {  "Skype™.*(Beta)"}, tag = "im", slave = false},
    { match = {  "Skype™.*чат"}, tag = "im", slave = true, run = function(c) tablist.new(c, "Skype") end},
}

Окно чатов ищется по заголовку, т.к. класс окон одинаков для окна с контактами и для чатов. Далее создается именованный список с табами, а если такой список уже существует, то окно просто туда добавляется. В текущей версии скрипта в качестве виджета для отображения вкладок используется стандартный awful.widget.tasklist. В дальнейшем планирую использовать обычный textbox, но пока всё работает и так, поэтому в основном буду причёсывать код. Выглядит это примерно так:


Забрать эту красоту со следами мучительных попыток познать Lua за два часа, можно отсюда. Там же находится библиотека для работы с юникодными строками, нужна она для того, чотобы виджет мог корректно сокращать названия окон.

Комментариев нет: