Допиливаем openbox (часть 2)

Часть 1 тут

Клавиатурная работа с меню
Понятно, что для 3-4 самых частых приложений можно и нужно назначить горячие клавиши. Но для нескольких десятков приложений (команд, действий) мнемоничных и легко нажимаемых горячих клавиш не напасёшься. Удовлетворительным по мнемоничности является использование цепочечных горячих клавиш (keychain). Но по наглядности и надёжности это ниже всякой критики, поскольку вся цепочка нажимается вслепую. Скажем, ошибка в первой букве цепочки может привести к тому, что не вызовется вообще ничего, или, ещё хуже, вызовется совсем не то.
Но openbox предоставляет великолепную возможность сделать то же самое теми же самыми нажатиями клавиш, но полностью наглядно. Нужно просто на первую горячую клавишу повесить меню, а в него поместить пункты для вторых клавиш, которые и использовать как клавиши ускорители (accelerator key). Например, у меня есть примерно такое меню для выхода, которое я поместил в главное меню:
    <menu id="exit" label="e_Xit" icon="/usr/share/icons/gnome/16x16/actions/system-log-out.png">
      <item icon="/usr/share/icons/gnome/16x16/actions/media-playback-pause.png" label="hibernate">
        <action name="Execute">
          <execute>.hibernate</execute>
        </action>
      </item>
      <item icon="/usr/share/icons/gnome/16x16/actions/system-log-out.png" label="Logout">
        <action name="Execute">
          <execute>.logoff</execute>
        </action>
      </item>
      <item icon="/usr/share/icons/gnome/16x16/actions/window-close.png" label="Reboot">
        <action name="Execute">
          <execute>.reboot</execute>
        </action>
      </item>
      <item icon="/usr/share/icons/gnome/16x16/actions/system-shutdown.png" label="Shutdown" default="yes">
        <action name="Execute">
          <execute>.shutdown</execute>
        </action>
      </item>
    </menu>
Обратите внимание на default="yes" в пункте Shudown - этот то самое назначение пункта по умолчанию, о котором шла речь в первой части.
Если мне надо выключить комп, я могу нажать «Win-пробел» (появляется главное меню), и затем «x» (выбирается подменю e_Xit, а в нём сразу выполняется пункт по умолчанию (shutdown), без входа в это подменю.

Но тут есть одна беда: в момент вызова главного меню вполне может быть установлена кириллица, и, соответственно, вместо «x» введётся «ч», и ничего не произойдёт. Значит, перед «x» надо ещё вручную переключиться на латиницу, что обламывает половину кайфа.
Для решения этой проблемы я ввёл в секцию <menu> настройку — номер раскладки, которую надо установить при выводе меню на экран (bug 6371). Нумерация раскладок от нуля, как принято в иксах. Например, если у меня раскладки «en,ru,ua», то чтобы сходу работали англисйкие ускорители, я пишу
<TopMenuKbdGroup>0</TopMenuKbdGroup>
И ещё о раскладках и клавишах-ускорителях. Официальный openbox не поддерживает нелатинские ускорители. Но есть патч, который это дело лечит (bug 6364), автор Paul G. Если накатить этот патч, то в принципе, можно сделать меню и с русскими ускорителями. Вряд ли кто-то захочет такое установить глобально, но, скажем, для меню плейлистов русских исполнителей русские ускорители вполне адекватны. Поэтому я дополнительно ввёл настройку раскладки для конкретного меню (bug 6372). Естественно, без патча, вводящего utf8-ускорители, эта настройка не имеет смысла.
Итак, в секции <menu> глобально разрешаем нелатинские ускорители
<utf8Enabled>yes</utf8Enabled>
А в определении меню, где реально хотим использовать русские ускорители, пишем
<menu id=.... title=.... TopMenuKbdGroup=«1» … > … </menu>

Упрощение настройки горячих клавиш
Для наиболее употребительных приложений и меню удобно иметь возможность вызывать их как горячими клавишами, так и через иерархическое меню. Штатно это требует описания их как в файле menu.xml, так и в файле rc.xml (горячие клавиши). Для избавления от этой копипастии я ввёл возможность задать горячую клавишу прямо в определении меню (bugs 6357, 6358). Функциональности это не добавляет, просто делает определения более компактными. Например, чтобы приведённое выше меню выходов можно был вызывать напрямую горячей клавишей Win+x, достаточно дописать в загловке key=W-x:
<menu id="exit" label="e_Xit" key="W-x"> … </menu>
Теперь чтобы перелогониться, можно нажать Win+x, l.

Бонус для мышедавов
Как известно, десктоп-юзеры делятся на мышевозов и мышедавов. Мышевоз любит, чтобы все подготовительные и некритические действия делались по наведению или перемещению мыши, а критические — по одиночному щелку (двойной щелчок мышевоз делать не умеет и боится). Мышедав любит размахивать мышью как попало, подготовительные и некритические действия хочет делать по одиночному щелчку, а критические — по двойному.
У мышевозов, конечно, включено поднятие окна по наведению мыши, так что с «вытаскиванием» неактивного окна мышью проблем нет. Мышедавам хуже, этот режим они на дух не переносят, а поднимать окно кликом не всегда безопасно (например, в редакторе снимается выделение и перескакивает курсор). В KDE для мышедававов есть специальная настройка, чтобы клик на неактивном окне только поднимал окно, но приложению не передавался. Так вот, я и в openbox ввёл такую возможность (bug 6352). Чтобы включить этот режим, надо в список действий для клика на неактивном окне добавить действие ClearClick, примерно так:
<context name="Client">
      <mousebind action="Press" button="Left">
        <action name="Focus"/>
        <action name="Raise"/>
        <action name="ClearClick"/>
      </mousebind>

Как бы всё. Остаётся добавить, что в пакет openbox-eui введен пример конфигов с использованием этих расширений. Они лежат в /etc/openbox-eui/samples.
Сейчас все патчи включены прямо в пакет openbox-eui. Со временем я думаю выложить их куда-нибудь (на sorceforge, к примеру) для пользователей других линуксов. Тогда я переделаю пакет, чтобы он брал патчи оттуда. Само собой, нынешнее состояние патчей отвечает нынешнему состоянию git master (этот как бы пререлиз 3.6), и в дальнейшем я буду продолжать поддерживать актуальность патчей.

И немножко о другом - Гуёвая настройка меню
В obmenu3 (AUR) есть поддержка подменю с умолчаниями и горячих клавиш. Соответствующие элементы распрятываются при наличии в комстроке ключиков -d и -k соответственно, или по наличию в редактируемом меню фактического использования этих фишек.
Понятно , но что бы для всех , надо как то юзабельней , к примеру -
окне добавить действие ClearClick, примерно так: <context name="Client">
<mousebind action="Press" button="Left">
<action name="Focus"/>
<action name="Raise"/>
<action name="ClearClick"/>
</mousebind>
править /путь/файл , а то как то навалом все у вас , конечно это ваше дело и ваше право ...
teplovoz
править /путь/файл
Ой. Пересказывать своими словами арчвики или openox wiki?
Эти заметки - не агитка за openbox для новых пользователей. Если такая агитка представляет интерес, я, в принципе, готов её написать, сейчас у меня есть время. Но это будет совсем другой текст. А этот текст - для опытных пользователей, которые уже выжали из openbox всё что можно, а хочется ещё.
akorop
Ой. Пересказывать своими словами арчвики или openox wiki?
Х.З. Извините конечно , тогда зачем , тогда лучше wiki .
Большое спасибо! Очень полезно. Ждём продолжения.
konstantinov-ms
Очень полезно
Если не секрет, что именно оказалось полезно?
konstantinov-ms
Ждём продолжения.
Да я как бы всё сказал на тему допиливания, в двух частях.
akorop
Если не секрет, что именно оказалось полезно?

Я пользуюсь Openbox'ом уже лет шесть и считаю его самым удобным WM. Но Ваше описание дополнительных возможностей в Openbox-eui меня заинтриговало. В частности, речь идёт о добавлении функциональности в client-list-combined-menu и о кейчейнах в меню. И то, и другое — весьма полезные и удобные добавления. Ради этого я бы попробовал openbox-eui, как только выпадет немного свободного времени. Активные углы, наверное, кому-то будут интересны, но у меня энтузиазма пока не вызывают. Хотя… Можно попробовать, а там посмотрим.
Кстати, чего мне ещё не хватает в Openbox, но что было бы (на мой вкус) весьма полезным, это возможность комбинировать разные окна в табы, которая есть во Fluxbox'е, PekWM и, по-моему, в KWin. Если бы это было реализовано в Openbox'е, он стал бы идеальным WM.

akorop
Да я как бы всё сказал на тему допиливания, в двух частях.

Это было пожелание дальнейших творческих успехов :). Вы неплохо пишете — достаточно сжато и при этом понятно даже для новичка.
konstantinov-ms
я бы попробовал openbox-eui, как только выпадет немного свободного времени
Зачем тянуть? Ставите прямо сейчас openbox-eui (на предложение снести openbox соглашаетесь) и продолжаете работать, как работали. Расширенное client-list-combined-menu получаете сразу, остальное - потом, когда будет время ковырять конфиги.
Впрочем, ещё одну фишку я бы советовал задействовать сразу: для всех краёв просто импортировать привязки пустого места. Это можно скопипастить из поставляемого примера (/etc/openbox_eui/samples/rc.xml), выбросив строчку про невидимую кнопку "Пуск". Это очень удобно, когда привычные привязки пустого места доступны всегда. Скажем, сидим в максимизированном окне, и хочется перейти на десктоп вправо, а правая рука лежит на мышке. Так достаточно просто отогнать мышь к ближайшему краю и крутнуть колесо.
konstantinov-ms
Кстати, чего мне ещё не хватает в Openbox, но что было бы (на мой вкус) весьма полезным, это возможность комбинировать разные окна в табы,
Ура! Когда я прочитал про эту фишку в Fluxbox, мне показалось, что это очень круто. Но потом я понял, что не в состоянии придумать ей ни одного полезного применения. А тут Вы!
Раз Вам её не хватает, значит Вы знаете, как её использовать. Пожалуйста, приведите пример ситуации, когда она полезна. Только как можно конкретнее и, пожалуй, как можно многословнее. Краткие фразы "про вообще" обычно ничего, кроме недоразумений, не дают.
akorop
Ставите прямо сейчас openbox-eui (на предложение снести openbox соглашаетесь) и продолжаете работать, как работали.

А потенциальные глюки? Нет, я готов с ними бороться, но не в самую горячую пору. Чуток разгребусь со срочными делами, обязательно попробую.

akorop
Пожалуйста, приведите пример ситуации, когда она полезна.

Да хотя бы вот такая ситуация.

По-моему, нагляднее некуда. И это не самая напряжённая пора, уж поверьте. Бывает гораздо хуже.

akorop
Только как можно конкретнее и, пожалуй, как можно многословнее.

Ну, на многословность я сейчас навряд ли способен, но пару слов скажу. Удобство этой фишки состоит в том, что она позволяет группировать сходные окна (или документы) в одной панели и взаимодействовать с ними (например, перемещать с одного рабочего стола на другой) без того, чтобы загаживать tint2 маловразумительными значками без подписей. Кому-то это удобно, кому-то — нет. Кто-то скажет, что нельзя держать столько открытых документов. У кого-то вообще открыто одно или два окна, и ему удобно постоянно закрывать неактуальные документы, а потом ждать, пока они откроются, если появится надобность. У меня иначе. Я работаю одновременно над несколькими проектами, плюс учебные дела, плюс дела диссовета, кафедры и прочая, и прочая. И в любой момент мне может понадобиться тот или иной документ. Тратить время на его поиски, открытие, пролистывание и т.д. считаю нецелесообразным, учитывая те возможности, которые предоставляет Linux и Openbox. Почему бы их не использовать? Со временем накапливается достаточно много окон, в которых начинаешь путаться. Частично решением проблемы стал домашний сервачок, в котором открыты несколько сеансов VNC, в каждом из которых своя подборка. Но ещё удобнее была бы возможность группировать окна так, как это сделано во Fluxbox. Я не утверждаю, что эта функция была бы нужна каждому десятому пользователю (в конце концов, большая часть пользователей больше трёх-пяти окон никогда не открывает), но лично мне она была бы удобна. Не знаю, насколько внятно, но если ещё что-то понадобится пояснить, постараюсь это сделать.
konstantinov-ms
А потенциальные глюки?
Уверен на 99.9%, что глюков нет. Расширенное client-list-combined-menu я использую уже не один год, а остальное, пока в конфиге не включишь, никак себя не проявляет. Впрочем, я всё использую давно и интенсивно, и глюков не встречаю.
 
Зарегистрироваться или войдите чтобы оставить сообщение.