Openbox window manager — стэковый оконный менеджер для графической системы X Window.
Как-то не попадались мне душевные рассказы про Openbox на просторах рунета. А зря, ибо хороший он. В этой статье я хочу поделиться своим опытом формирования полноценного окружения на его основе. Мне результат нравится.
- Почему именно Openbox?
- Установка и запуск
- Базовая настройка утилитой obconf
- Горячие клавиши
- Особые правила для приложений
- Панель задач tint2
- Смена и индикация раскладки клавиатуры
- Отзывчивость клавиатуры
- Лончеры
- Обои на рабочий стол
- Блокировка экрана
Почему именно 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:
Здесь всё понятно кроме тэга startupnotify
. Что это такое? Это оповещение “окружающего мира” о запуске приложения через механизм startupnotification. Мне известно только одно применение данного механизма: в промежуток времени между запуском приложения и появлением его окна курсор мыши меняет форму на песочные часы или крутилку (или нечто аналогичное). Некоторые приложения не поддерживают startupnotification — как правило либо древние (xterm), либо сделанные на скорую руку.
Практический совет: включать startupnotify
стоит только для тяжёлых приложений, которым требуется несколько секунд для запуска. Т.е. в этом примере он не нужен.
А это пример перемещения окна на левую или правую половину экрана по хоткею Win+← и Win+→ соответственно:
Начало координат находится в левом верхнем углу экрана (или окна). Числовые значения координат и ширины можно указывать по-разному: в пикселях, в процентах, в виде простой дроби. Отрицательные числа имеют свой смысл, можно даже указать два знака +-3
. Подробнее см. вики на сайте проекта.
Больше примеров для изучения вы найдёте в дефолтном конфиге — он весьма неплохой.
Если что-то непонятно — читайте официальную документацию или русский перевод. Возможностей очень много. Реализованы практически все мыслимые операции над окнами. Есть даже условные конструкции (if.. then.. else.. ).
Единственное, чего не хватает лично мне в управлении окнами — несколько вариантов расположения окна по одному хоткею, как это сделано в WinSplit Revolution. Вместо множества хоткеев хочется иметь один, который будет циклически перебирать различные варианты расположения окна: левая треть, левая половина, две трети слева. Не отрицаю, что и это можно сделать при желании. Для чего-то же были добавлены условные конструкции.
Особые правила для приложений
Кастомные настройки для конкретных приложений задаются в секции <applications>
конфига rc.xml
.
Хотим, чтобы браузер всегда запускался в полноэкранном режиме и на втором рабочем столе:
Хотим, чтобы текстовый редактор Geany и pdf-смотрелка Evince всегда открывались раздвинутыми по вертикали (maximized vertical):
Здесь же можно отключить рамку (декорации) для всех окон и выиграть 30 пикселей по высоте:
Теперь управлять окнами можно только с клавиатуры:
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:
А в автозапуске — по CapsLock:
В результате работают оба сочетания. Хорошая идея — использовать для индикации раскладки лампочку Scroll Lock на клавиатуре. Я даже перепаял светодиод с зелёного на красный по такому поводу.
На ноутбуке этой лампочки обычно нет и для индикации раскладки целесообразно использовать значок в трее. В линуксах традиционно это флаг страны.
Помимо индикации текущей раскладки жизненно необходимая опция — это запоминание раскладки для каждого окна. Например код я пишу на английском, а переписку в мессенджере веду на русском; переключаясь между окнами мне не нужно каждый раз менять язык.
Я могу посоветовать три утилиты, все умеют запоминать раскладку для окон.
kbdd
ничего не показывает в трее,sbxkb
показывает флаги в трее, но не имеет никаких параметров — всё жестко прописано в коде, даже размер значков.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 на тот же хоткей. Для этого в конфиге опенбокса в секции <keyboard>
добавляем строки:
Dmenu
Лончер на основе dmenu описан в отдельной статье.
Обои на рабочий стол
Хочу порекомендовать утилитку feh
и такую строчку в автозапуск:
Теперь при старте опенбокса вы получаете случайные обои из папки ~/.wallpapers
.
Однажды я два дня собирал коллекцию красивых обоев. А потом отключил их нафиг и удалил. Ибо отвлекает.
Как-то Сисадмин спросил:
— Учитель, не желаете ли красивую картинку для вашего десктопа? У меня есть коллекция “обоев для рабочего стола” со звёздным небом и моральным законом.
— Почему ты думаешь, что мой нынешний “wallpaper” хуже? — спросил в ответ Инь Фу Во.
— Я не знаю, какая у вас картинка сейчас. Я никогда не видел вашего десктопа. У вас всегда открыто множество окон.
— Я тоже его никогда не видел, — сказал почтенный Инь. — Я работаю.
Блокировка экрана
Чтобы никто не смог воспользоваться компьютером во время вашего отсутствия, включайте блокировку экрана. Голый опенбокс этого делать не умеет, но ему на помощь отлично приходит утилита slock
. В заблокированном состоянии она ничего не выводит на экран. Во время ввода пароля заливает экран голубым цветом. Если пароль введён неверно, заливает экран красным. Цвета заливки не настраиваются, они жёстко прописаны в коде. Если вас это не устраивает, посмотрите на i3lock
и его продвинутый форк.
Вместо простого запуска slock
по хоткею Win+L я добавил в конфиг опенбокса чуть более интересную конструкцию:
Через секунду после блокировки выключается фоновая подсветка монитора (backlight).
Кстати, при вводе пароля выручает индикация раскладки лампочкой scrol lock, потому что пароль, набранный не в той раскладке, не подходит, а другой индикации текущей раскладки нету.
В заблокированном состоянии slock не даёт возможности переключиться на свободную консоль по Ctrl+Alt+F1…F6. Так что обойти его нельзя. Но один способ всё-таки есть. Надо зайти на заблокированную машину по ssh и убить процесс:
$ killall slock
О чём я мог бы написать, но не написал
- Полупрозрачность окон, по-моему абсолютно ненужная.
- Димминг (затемнение) неактивных окон. Я использовал
compton
, мне понравилось. - Возможности меню по правому клику.
- Автозапуск приложений. Там вроде не сложно.
- Менеджер буфера обмена (clipboard manager). Вещь нужная, но у меня до неё руки не дошли.
- Приложения по-умолчанию для разных типов файлов (default applications).
- Тайлинг средствами pytile2. Я не пробовал.
Эту статью я писал очень долго, и на момент публикации уже отказался от опенбокса в пользу i3. Но готов ответить на ваши вопросы в комментариях.