Pull to refresh

Применение бритвы Оккама при оформлении рабочего стола openbox

В этом посте описана реализация рабочего стола средствами openbox и tint2 без привлечения сторонних менеджеров.

Присказка:

Когда я, пребывая на мейнстримовой Убунте, познакомился с расово правильным CrunchBang, то мне очень понравилась его концепция, тем более, что к тому моменту ужасные дефолтные убунтовские Unity, Nautilus и Compiz уже были мной выпилены в пользу лёгких и шустрых openbox и xcompmgr. Однако, более детальное ознакомление навеяло некоторую тоску древностью доступного софта (основанная на Debian ветка Statler появилась относительно недавно, и, к тому же, её настройка выглядела довольно трудозатратно), поэтому я продолжил по мере возможностей обрабатывать Убунту, с целью, не растеряв бонусов, всё-таки довести её тактико-технические характеристики до CrunchBang.

После сноса вышеупомянутой адовой троицы некоторое время продолжалась эксплуатация gnome-panel, но инерция была преодолена, и её место заняла кумир миллионов tint2. Для своей любимой плюшки — слайд-шоу рабочего стола, я изобретать велосипед не стал, и прикрутил feh-строку выбора случайной обоины, выполняемую при загрузке и в дальнейшем по cron, нужную мне информацию вывел на дисплей через conky, а вот вопрос ярлыков рабочего стола остался открытым. В качестве файлового менеджера мне гораздо удобнее использовать gnome-commander, а он в качестве менеджера рабочего стола не годится, а ставить для этой скромной цели аж целый PcmanFM я посчитал плохой идеей.

Мне нужен был док, то есть некоторая область на экране с находящимися на ней ярлыками. Требования к ярлыкам я предъявил расширенные — захотел не только запускать команды по клику, но и иметь настраиваемые выпадающие менюшки. Конечно, можно было поставить idesk+myGTKmenu, или какой-нибудь, не к ночи будь помянут, Cairo-Dock, но, решив обойтись тем, что имею, я таки получил полностью удовлетворившее меня экономное и концептуальное решение.

Док с ярлыками был обеспечен запуск дополнительной копии tint2 с отдельной конфигурацией «только лаунчеры», доставивший мне на рабочий стол ряд ярлыков (если, паче чаяния, захочу несколько рядов – впишу в автозагрузку ещё конфигураций tint2, при её невесомости для тачки это будет совершенно неощутимо). Чтобы полученная конструкция представляла из себя полноценный док, осталось пристегнуть к лаунчерам менюшки.

Сказка:

Для реализации настраиваемых всплывающих менюшек мне, в первую очередь, нужно было получить возможность вызова меню openbox из командной строки. Недостаточно упорные в гуглении сабжа массы нагугливают себе на голову xdotool, убеждаются, что он не работает в русской раскладке, и бросают это дело, истинные же джедаи обретают xmacro, и, после назначения в ~/.config/openbox/rc.xml горячей клавиши (я назначил классическую — Ctrl+Esc):




root-menu




вызов меню openbox становится прочно доступным при любой раскладке по команде

echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L" | xmacroplay ":0.0".

Теперь, вписав в desktop-файл лаунчера эту строку, я получил для него всплывающее меню по клику.

Но ведь мне же нужны разные меню для разных лаунчеров!
В решении этого вопроса на помощь приходит замечательная осрбенность openbox под названием динамическое меню.

В каталоге ~/.config/openbox/ я налепил пачку файлов menu1.xml, menu2.xml, menu3.xml, и так далее, представляющих собой куски конфига главного меню openbox, только без «шапки» и «подвала», например:



deadbeef





vlc





gthumb




Предположим, что у меня в одностроним файле ~/obcount хранится некоторый номер (натуральное число), и я хочу вызвать менюшку, которую определяет ~/.config/openbox/menu«номер».xml. Я написал маленький скриптик ~/.config/openbox/menu.sh, который, в зависимости от номера, записанного в ~/obcount, выводит соответствующее этому номеру динамическое меню (если ~/obcount не существует, то скрипт выводит некое глобальное меню), после чего удаляет файл ~/obcount (если он был):

#!/bin/bash

if [ -a ~/obcount ]
then

count=`head -n1 ~/obcount`
echo '<?xml version="1.0" encoding="utf-8"?>'
echo '<openbox_pipe_menu>'
cat ~/.config/openbox/menu${count}.xml
echo '</openbox_pipe_menu>'
rm ~/obcount

else

# План "Б". Эта часть скрипта, выполняемая в случае отсутствия файла ~/obcount, предназначена для вывода глобального меню, всплывающего по right-клику на рабочем столе. Лично я через цикл скомпоновал в главном меню все используемые менюшки+добавил несколько пунктов в корень, но, чтобы не усложнять, привожу здесь незамысловатый вариант вывода меню "в лоб" через файл ~/.config/openbox/menu0.xml:

echo '<?xml version="1.0" encoding="utf-8"?>'
echo '<openbox_pipe_menu>'
cat ~/.config/openbox/menu0.xml
echo '</openbox_pipe_menu>'

fi

Приведя ~/.config/openbox/menu.xml к виду

<?xml version="1.0" encoding="utf-8"?>
<openbox_menu>
/>
</openbox_menu>

я получил возможность полностью определить содержание меню openbox выхлопом скрипта ~/.config/openbox/menu.sh, и, вписав в desktop-файл лаунчера строку

Exec=echo -n "номер_меню" >>~/obcount; echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L" | xmacroplay ":0.0"

я получил возможность назначить каждому лаунчеру своё всплывающее меню. При правом клике по рабочему столу ~/obcount не создаётся, следовательно, выполняется «план Б», и всплывает глобальное меню.

Таким путём я достиг своей скромной цели.

image

Поясню, почему номер меню передаётся в ~/.config/openbox/menu.sh через файл ~/obcount, хотя, на первый взгляд, логичнее было бы передать его через переменную. Это вызвано тем, что в процессе заковыристого вызова ~/.config/openbox/menu.sh через эмулятор xmacro и меню опенбокса наследование рвётся, и переменная до адресата не доходит. Есть ещё, конечно, вариант передавать номер через /dev/shm, но это требует дополнительных прав, и для организации работы среднестатистического юзера, я так думаю, не очень годится.

Прекрасно отдаю себе отчёт, что использование tint2 в качестве дока рабочего стола — моё личное предпочтение, но, как может заметить читатель, ничто не мешает, используя вышеописанный метод, привязывать настраиваемые openbox-менюшки к ярлыкам рабочего стола, используемым популярными связками openbox+PCmanFM и openbox+Thunar, также, используя tint2 традиционным способом, можно реализовать несколько различных start-like кнопок на панельке, и т.д., и т.п.

Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.