LaurVas

Жизнь с комфортом в Openbox WM

   linux

Openbox window manager — стэковый оконный менеджер для графической системы X Window.

Как-то не попадались мне душевные рассказы про Openbox на просторах рунета. А зря, ибо хороший он. В этой статье я хочу поделиться своим опытом формирования полноценного окружения на его основе. Мне результат нравится.

Почему именно Openbox?

Почему оконный менеджер, а не готовое DE? Я хотел сделать себе эффективный инструмент, обустроить рабочее место. Пришлось повозиться, но результат того стоит. Готовые решения в виде Cinnamon/Mate/Gnome/XFCE/KDE наследуют традиционный интерфейс. В них много лишнего.

Под линукс существует масса оконных менеджеров, и на знакомство со всеми уйдет уйма времени. Но в этом нет необходимости — стековые оконные менеджеры работают примерно одинаково и имеют примерно одинаковый набор возможностей — выбирай любой. Для себя я выделил несколько достоинств опенбокса.

Минимализм и строгость. Всё что вы получаете на голом опенбоксе — это меню по клику на рабочем столе. Никаких спецэффектов, обоев, панелей, лончеров. Опенбокс сосредотачивается на управлении окнами и делает это хорошо: быстро работает и потребляет мало ресурсов.

Но это не значит, что больше ничего не будет. При необходимости вы можете подобрать к нему именно то дополнение, которое вам больше всего подходит.

Богатые возможности по настройке. И это, пожалуй, самый весомый плюс. Основной конфиг rc.xml представляет собой хорошо структурированный xml-документ. Если вы не знаете что такое xml, то у вас есть шанс с ним познакомиться, просто настраивая этот оконный менеджер. Основные настройки можно менять галочками и ползунками через утилиту obconf. Самое то для знакомства.

Привычное поведение. Знакомые окошечки, кнопочки, комбинации клавиш. Не надо перестраивать мозг как в случае с тайловыми Awesome, Xmonad, DWM, i3. Мы будем использовать те же горячие клавиши, что используются в Windows: Alt + Tab, Alt + F4, Win + стрелка и др. и сделаем даже лучше.

Популярность. Openbox входит в состав LXDE, на котором основан дистрибутив Lubuntu, а это серьёзно.

Проведём небольшой эксперимент. Посмотрим сколько результатов Google смог найти для разных оконных менеджеров (на момент написания статьи).

Запрос Количество
site:archlinux.org openbox 50400
site:archlinux.org fluxbox 13400
site:archlinux.org icewm 3410
site:linux.org.ru openbox 7680
site:linux.org.ru fluxbox 5780
site:linux.org.ru icewm 2960

Даже если Openbox не лучший, он уже достаточно хорош.

Установка и запуск

Тут всё просто: качаем пакет openbox. Если вы не используете графических логин-менеджеров (slim, lightdm, gdm, kdm), то для запуска необходимо добавить exec openbox-session в ~/.xinitrc. Данный скрипт выполняется, когда мы запускаем X-сервер командой startx.

Не удаляйте из ~/xinitrc непонятные строчки в начале! Так вы рискуете выключить автозапуск чего-нибудь нужного.

После старта опенбокса мы получаем предельно минималистичный рабочий стол: нет ничего, кроме серого фона. Единственное, что сейчас работает — дефолтная менюшка по правому клику. По первости можно запускать программы из терминала, если их нет в меню:

$ chromium &
$ firefox &
$ gedit &

Базовая настройка утилитой obconf

Первоначальную настройку рекомендую производить из графической утилиты obconf. Первая вкладка отвечает за тему обрамления окон (это называется декорациями).

Обратите внимание, что тема отвечает только за внешнюю рамку окна и меню на рабочем столе. Внутренностями окна занимается библиотека GTK или QT. Для настройки GTK рекомендую утилиту lxappearance:

Вернёмся к obconf. На вкладке “Внешний вид” настраиваются шрифты и набор управляющих кнопок в заголовке окна.

Можно разместить все кнопочки заголовка слева, как в Mac OS, или оставить только крестик, как вам больше нравится. Вариантов много. Размер кнопок, как и высота заголовка, зависит от размера шрифта. Если вам кажется, что рамка съедает ценное пространство, то можно её отключить. Позже я покажу как это сделать.

Окно сохраняет границу когда нет декорации (Windows retain a border when undecorated) — это тёмная однопиксельная рамка, которая отрисовывается вокруг окна, чтобы как-то отделить его от фона. Функция работает только если у окна выключены декорации.

Декорации включены на всех окнах

Без декораций, но с однопиксельной рамкой

Без всего — полный минимализм

На вкладке “Перемещение и изменение размера” настраивается прилипание границ окна к другим окнам или краям экрана.

Окно может автоматически переместиться на другой рабочий стол, если во время перемещения какое-то время подержать его у края экрана. Задержка указывается в милисекундах. Мне нравится когда подобные вещи можно указать с высокой точностью. В Windows и, уж тем более Android, у вас в лучшем случае будет выбор из трёх значений: быстро, средне, медленно.

Фокус на окне, когда курсор мыши перемещается по нему (Focus windows when the mouse pointer moves over them) — очень приятная опция, рекомендую включить. Особенно если вы часто работаете в нескольких окнах, расположенных рядом. С этой опцией окно становится активным, если переместить указатель мыши в его зону. С выключенной опцией надо ещё и кликнуть. Казалось бы, смешная экономия в один клик… Но без него переключение на другое окно проходит плавнее и быстрее.

Уже очень давно Linux поддерживает несколько виртуальных рабочих столов. Я рекомендую начать с двух. Если этого покажется мало, добавьте ещё один. Если и трёх не хватает, то это повод задуматься о замене монитора на больший или о покупке второго.

Отступ нам понадобится для панели, в моём случае это tint2.

Горячие клавиши

Горячие клавиши используются для запуска приложений и управления окнами. Дефолтный конфиг уже содержит наиболее распространённые комбинации, такие как Alt+Tab, Alt+F4. Возможно вам захочется дополнить ассортимент своими комбинациями.

Для настройки горячих клавиш существует графическая утилита obkey, однако я и без неё отлично всё настроил руками в конфигурационном файле ~/.config/openbox/rc.xml. Если в вашем домашнем каталоге нет этого файла, значит вы, скорее всего, не запускали obconf. В этом случае возьмите дефолтный конфиг из /etc/xdg/openbox/.

Для правки конфига я рекомендую редактор Geany. Потому что там есть подсветка синтаксиса и классный фолдинг (Документ → свернуть все). Далее нам надо раскрыть секцию <keyboard> .

Обычные клавиши обозначаются своими привычными именами. Для клавиш-модификаторов используются обозначения:

S для Shift
C для Ctrl
A для Alt
W для Win
M для Meta

Если имя клавиши сложно определить по тому, что на ней нарисовано, спасёт утилита xev. Запускаем её в терминале, нажимаем нужную клавишу и смотрим вывод после слова keysim. Например, клавиша PageUp называется Prior:

KeyPress event, serial 32, synthetic NO, window 0x2600001,
    root 0xd7, subw 0x0, time 25428237, (-106,741), root:(1177,744),
    state 0x10, keycode 112 (keysym 0xff55, Prior), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 32, synthetic NO, window 0x2600001,
    root 0xd7, subw 0x0, time 25428328, (-106,741), root:(1177,744),
    state 0x10, keycode 112 (keysym 0xff55, Prior), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Пример для запуска терминала lxterminal по Ctrl+Alt+T:

~/.config/openbox/rc.xml
<keybind key="C-A-t">
  <action name="Execute">
    <startupnotify>
      <enabled>true</enabled>
    </startupnotify>
    <command>lxterminal</command>
  </action>
</keybind>

Здесь всё понятно кроме тэга startupnotify. Что это такое? Это оповещение “окружающего мира” о запуске приложения через механизм startupnotification. Мне известно только одно применение данного механизма: в промежуток времени между запуском приложения и появлением его окна курсор мыши меняет форму на песочные часы или крутилку (или нечто аналогичное). Некоторые приложения не поддерживают startupnotification — как правило либо древние (xterm), либо сделанные на скорую руку.

Практический совет: включать startupnotify стоит только для тяжёлых приложений, которым требуется несколько секунд для запуска. Т.е. в этом примере он не нужен.

А это пример перемещения окна на левую или правую половину экрана по хоткею Win+ и Win+ соответственно:

~/.config/openbox/rc.xml
<keybind key="W-Left">
  <action name="UnmaximizeFull"/>
  <action name="MoveResizeTo">
    <x>0</x>
    <y>0</y>
    <width>50%</width>
  </action>
  <action name="MaximizeVert"/>
</keybind>
<keybind key="W-Right">
  <action name="UnmaximizeFull"/>
  <action name="MoveResizeTo">
    <x>50%</x>
    <y>0</y>
    <width>50%</width>
  </action>
  <action name="MaximizeVert"/>
</keybind>

Начало координат находится в левом верхнем углу экрана (или окна). Числовые значения координат и ширины можно указывать по-разному: в пикселях, в процентах, в виде простой дроби. Отрицательные числа имеют свой смысл, можно даже указать два знака +-3. Подробнее см. вики на сайте проекта.

Больше примеров для изучения вы найдёте в дефолтном конфиге — он весьма неплохой.

Если что-то непонятно — читайте официальную документацию или русский перевод. Возможностей очень много. Реализованы практически все мыслимые операции над окнами. Есть даже условные конструкции (if.. then.. else.. ).

Единственное, чего не хватает лично мне в управлении окнами — несколько вариантов расположения окна по одному хоткею, как это сделано в WinSplit Revolution. Вместо множества хоткеев хочется иметь один, который будет циклически перебирать различные варианты расположения окна: левая треть, левая половина, две трети слева. Не отрицаю, что и это можно сделать при желании. Для чего-то же были добавлены условные конструкции.

Особые правила для приложений

Кастомные настройки для конкретных приложений задаются в секции <applications> конфига rc.xml.

Хотим, чтобы браузер всегда запускался в полноэкранном режиме и на втором рабочем столе:

~/.config/openbox/rc.xml
<application name="Chromium" type="normal">
  <desktop>2</desktop>
    <maximized>true</maximized>
</application>

Хотим, чтобы текстовый редактор Geany и pdf-смотрелка Evince всегда открывались раздвинутыми по вертикали (maximized vertical):

~/.config/openbox/rc.xml
<application name="geany" type="normal">
  <maximized>Vertical</maximized>
    </application>
<application name="evince" type="normal">
  <position force="yes">
    <y>-1</y>
  </position>
  <maximized>Vertical</maximized>
</application>

Здесь же можно отключить рамку (декорации) для всех окон и выиграть 30 пикселей по высоте:

~/.config/openbox/rc.xml
<application class="*">
  <decor>no</decor>
</application>

Теперь управлять окнами можно только с клавиатуры:

Alt+F4 закрывает окно;
Win+ сворачивает окно в панель задач (iconify);
Win+ разворачивает окно на весь экран (maximize);
Alt+мышь перемещает окно по экрану;
Alt+пробел открывает контекстное меню окна, через которое можно изменить размер, закрепить поверх других окон или отправить на определённый рабочий стол:

Чтобы узнать параметры конкретного окна (name, class, role, type), поможет утилита obxprop:

$ obxprop | grep "^OB_APP"

Панель задач tint2

Без панели задач на помощь приходит средняя кнопка мыши и Alt+Tab, но всё равно с окнами работать не очень удобно. Арчвики рекомендует две панели: tint2 и pypanel. Можно взять lxpanel и получить почти LXDE. Я же влюбился в tint2.

Очень гибко настраивается. Регулируются габариты, размеры элементов, отступы, шрифты, цвета. Есть где развернуться в творческом порыве.

Умеет отображать задачи сразу всех рабочих столов, а не только текущего. Это позволяет видеть картину в целом: где что запущено и быстро переключаться между окнами.

Эффективно использует площадь. Можно выжать максимум из ширины монитора — нет лишних кнопок, ярлычков, отступов, декоративных элементов. Только список запущенных приложений, трей и часы! Хм… может и часы убрать?

Нет меню приложения по правому клику. Поначалу такое поведение может показаться топорным, но практика показывает, что это очень удобно. По крайней мере в Windows я это меню использую только чтобы закрывать окна. В tint2 всё просто и быстро:

  • правый клик по задаче без всяких менюшек закрывает приложение,
  • левый клик по неактивной задаче переводит фокус и делает окно активным,
  • левый клик по активной задаче сворачивает соответствующее окно.

И да, это настраивается.

Ничего лишнего. Tint2 не умеет запускать приложения (в свежих версиях умеет?), не умеет показывать меню, не имеет плагинов. Конфигурация панели описывается в текстовом файле.

Для настройки панели есть графические утилиты tint2conf и tintwizard, но учтите — они удаляют все комментарии из конфига. Возможно сейчас уже нет, но лучше подстраховаться бэкапом.

Устройство панели

Вся панель состоит из нескольких объектов:

  • панель быстрого запуска (launcher),
  • панель задач (taskbar),
  • трей (systray),
  • индикатор заряда аккумулятора (battery),
  • часы (clock).

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

  • неактивном,
  • активном,
  • свёрнутом (iconified),
  • требующем внимания (urgent).

Вот такая вот иерархия. Задачи в данном контексте — это окна приложений.

Каждому объекту панели задач нужно назначить набор свойственных ему параметров и стиль. Стиль определяет параметры фона и рамки:

  • цвет фона,
  • толщину рамки,
  • цвет рамки,
  • радиус скругления углов.

Все цвета имеют альфа-канал, он указывается через пробел.

В начале конфигурационного файла задаются стили без привязки к конкретным объектам. Явного объявления стилей в конфиге нет, меня это поначалу сбивало с толку. Они просто идут по порядку, начиная с единицы. Можно объявить столько стилей, сколько нужно. Стили присваиваются объектам при описании объектов. Подробнее о настройке панели читайте в официальном руководстве.

По клику на часах можно запускать некоторое приложение. Сложность в том, чтобы закрыть это приложение: надо как-то определять PID процесса, чтобы убить его. Если руки чешутся что-нибудь смастерить, то посмотрите в сторону календарей на dzen2. А если возиться неохота, возьмите gsimplecal. По первому клику он покажет календарь, а по второму сам закроется.

Если вы будете переделывать панель по своему вкусу, то в процессе творчества вам понадобится заставить tint2 перечитать свой конфиг. Для этого надо убить существующий процесс и запустить новый:

$ killall tint2 && tint2

Может пригодиться ключ -c — указать отличный от дефолтного конфиг.

Мой конфиг

Мой конфиг лежит на гитхабе. Ключевые особенности:

  • Максимальное использование доступной площади.
  • Опция mouse_right = close закрывает окно по правому клику на панели задач.
  • Сразу видны окна всех рабочих столов.
  • Высота панели — 28 пикселей. Это оптимальный размер, подобранный мной в процессе долгих поисков.

Почему я выбрал такие цвета? Именно такой серый цвет не отвлекает от работы, хорошо сочетается с редактором Sublime Text и дефолтным серым фоном. Хорошо читаются состояния задач, особенно активное окно.

Смена и индикация раскладки клавиатуры

Я долго не мог понять зачем линуксоиды назначают смену раскладки на CapsLock, а потом попробовал и… Восторг! Традиционный капс нафиг не нужен, а если вдруг приспичит, то его можно включить по Shift+CapsLock. Привыкнув переключать раскладку по CapsLock, вы уже не вернётесь назад.

Прописать клавиатурное комбо для смены раскладки можно в автостарт индивидуально для пользователя, либо в конфиг иксов — для всех пользователей. На моей машине в глобальном конфиге прописана смена по Alt+Shift:

/etc/X11/xorg.conf.d/20-keyboard-layout.conf
Section "InputClass"
    Identifier          "keyboard-layout"
    MatchIsKeyboard     "on"
    Option "XkbLayout"  "us,ru"
    Option "XkbOptions" "grp:alt_shift_toggle,grp_led:scroll"
EndSection

А в автозапуске — по CapsLock:

~/.config/openbox/autostart
setxkbmap -layout us,ru -variant -option grp:caps_toggle,grp_led:scroll &

В результате работают оба сочетания. Хорошая идея — использовать для индикации раскладки лампочку Scroll Lock на клавиатуре. Я даже перепаял светодиод с зелёного на красный по такому поводу.

На ноутбуке этой лампочки обычно нет и для индикации раскладки целесообразно использовать значок в трее. В линуксах традиционно это флаг страны.

Помимо индикации текущей раскладки жизненно необходимая опция — это запоминание раскладки для каждого окна. Например код я пишу на английском, а переписку в мессенджере веду на русском; переключаясь между окнами мне не нужно каждый раз менять язык.

Я могу посоветовать три утилиты, все умеют запоминать раскладку для окон.

  1. kbdd ничего не показывает в трее,
  2. sbxkb показывает флаги в трее, но не имеет никаких параметров — всё жестко прописано в коде, даже размер значков.
  3. xxkb аналогична sbxkb, но уже имеет конфигурационный файл.

Я долгое время использовал xxkb, но из-за изредко возникающих глюков пересел на sbxkb. Работает без сбоев, но при смене конфигурации экрана (поворот, разрешение) исчезает из трея, хотя процесс продолжает работать.

Отзывчивость клавиатуры

Раз уж я коснулся клавиатурной темы, расскажу про маленькую настройку, которая позволяет быстрее скроллить, перемещаться по тексту или стирать. Когда я хочу стереть что-то длинное, то зажимаю Backspace и смотрю как курсор бежит назад, забирая лишние буквы. Что при этом происходит? Как только я нажимаю Backspace, стирается один символ, затем идёт небольшая задержка, затем срабатывает автоповтор: Backspace убирает символы один за другим, как если бы я постоянно по нему стучал.

Я рекомендую вам отрегулировать задержку и частоту работы автоповтора под скорость своих пальцев. Задержка перед срабатыванием автоповтора нужна когда вы хотите удалить только один символ — она даёт вам время отпустить клавишу.

Слишком долгая задержка заставляет ждать автоповтора. Не настолько долго, чтобы раздражать, но достаточно, чтобы тормозить перенос мыслей из головы в компьютер. Слишком короткая задержка приведёт к тому, что автоповтор начнёт работать когда этого не требуется. Чем выше частота повтора, тем быстрее стирается текст, и тем сложнее успеть вовремя остановить этот процесс. Суть настройки заключается в поиске золотой середины.

Итак, волшебная команда:

$ xset r rate 190 20

190 — длительность задержки в миллисекундах,
20 — частота в количестве повторений в секунду.

Я рекомендую начать с этих значений и понемногу уменьшать задержку до появления ложных срабатываний, затем чуть-чуть вернуть назад. Если установить очень короткую задержку, то вы потеряете возможность пользоваться клавиатурой. Придётся перезагружать X-сервер или компьютер целиком. Так что будьте аккуратнее.

Чтобы параметры применялись самостоятельно, добавляем эту команду в ~/.xinitrc до команды exec openbox-session или в ~/.config/openbox/autostart. Первый скрипт выполняется при запуске X-сервера командой startx, второй — только при запуске опенбокса.

Настроить отзывчивость клавиатуры и скорость указателя мыши можно из графической утилиты lxinput, однако изменения действуют только до перезапуска X-сервера, т.к. lxinput сохраняет выставленные настройки в ~/.config/lxsession/LXDE/desktop.conf, а этот файл кроме LXDE никто не смотрит.

Скорость указателя мыши задаётся командой xset m. Подробнее см. man xset.

Лончеры

Как программы-то запускать? Только горячими клавишами? Ведь нет ни “Пуска”, ни значков на рабочем столе! Суровые админы обойдутся одним лишь терминалом, но нас такой вариант не устраивает. Какие есть альтернативы?

  • всё запихнуть в менюшку опенбокса,
  • сделать ярлычки на панели tint2,
  • сделать ярлыки на рабочем столе (idesk, xfdesktop),
  • запускать приложения по имени из лончера (dmenu, gmrun),
  • сделать красивые иконки снизу (а-ля Mac OS) средствами cairo-dock.

Для себя я нашёл оптимальный способ запуска программ — с клавиатуры.

Gmrun

Эта небольшая утилита написана на языке C с использованием библиотеки GTK+2. Минимум кода, минимум функционала, минимум настроек. По сути это аналог Ctrl + R в Windows.

gmrun

Будет логично повесить gmrun на тот же хоткей. Для этого в конфиге опенбокса в секции <keyboard> добавляем строки:

~/.config/openbox/rc.xml
<keybind key="W-r">
  <action name="Execute">
    <command>gmrun</command>
  </action>
</keybind>

Dmenu

Лончер на основе dmenu описан в отдельной статье.

Обои на рабочий стол

Хочу порекомендовать утилитку feh и такую строчку в автозапуск:

~/.config/openbox/autostart
(sleep 3s && feh --randomize --bg-fill ~/.wallpapers/*) &

Теперь при старте опенбокса вы получаете случайные обои из папки ~/.wallpapers.

Однажды я два дня собирал коллекцию красивых обоев. А потом отключил их нафиг и удалил. Ибо отвлекает.

Как-то Сисадмин спросил:
— Учитель, не желаете ли красивую картинку для вашего десктопа? У меня есть коллекция “обоев для рабочего стола” со звёздным небом и моральным законом.
— Почему ты думаешь, что мой нынешний “wallpaper” хуже? — спросил в ответ Инь Фу Во.
— Я не знаю, какая у вас картинка сейчас. Я никогда не видел вашего десктопа. У вас всегда открыто множество окон.
— Я тоже его никогда не видел, — сказал почтенный Инь. — Я работаю.

Блокировка экрана

Чтобы никто не смог воспользоваться компьютером во время вашего отсутствия, включайте блокировку экрана. Голый опенбокс этого делать не умеет, но ему на помощь отлично приходит утилита slock. В заблокированном состоянии она ничего не выводит на экран. Во время ввода пароля заливает экран голубым цветом. Если пароль введён неверно, заливает экран красным. Цвета заливки не настраиваются, они жёстко прописаны в коде. Если вас это не устраивает, посмотрите на i3lock и его продвинутый форк.

Вместо простого запуска slock по хоткею Win+L я добавил в конфиг опенбокса чуть более интересную конструкцию:

~/.config/openbox/rc.xml
<keybind key="W-l">
  <action name="Execute">
    <command>sh -c 'slock &amp; (sleep 1 &amp;&amp; xset dpms force off)'</command>
  </action>
</keybind>

Через секунду после блокировки выключается фоновая подсветка монитора (backlight).

Кстати, при вводе пароля выручает индикация раскладки лампочкой scrol lock, потому что пароль, набранный не в той раскладке, не подходит, а другой индикации текущей раскладки нету.

В заблокированном состоянии slock не даёт возможности переключиться на свободную консоль по Ctrl+Alt+F1…F6. Так что обойти его нельзя. Но один способ всё-таки есть. Надо зайти на заблокированную машину по ssh и убить процесс:

$ killall slock

О чём я мог бы написать, но не написал

  • Полупрозрачность окон, по-моему абсолютно ненужная.
  • Димминг (затемнение) неактивных окон. Я использовал compton, мне понравилось.
  • Возможности меню по правому клику.
  • Автозапуск приложений. Там вроде не сложно.
  • Менеджер буфера обмена (clipboard manager). Вещь нужная, но у меня до неё руки не дошли.
  • Приложения по-умолчанию для разных типов файлов (default applications).
  • Тайлинг средствами pytile2. Я не пробовал.

Эту статью я писал очень долго, и на момент публикации уже отказался от опенбокса в пользу i3. Но готов ответить на ваши вопросы в комментариях.