Присказка:
Когда я, пребывая на мейнстримовой Убунте, познакомился с расово правильным CrunchBang, то мне очень понравилась его концепция, тем более, что к тому моменту ужасные дефолтные убунтовские Unity, Nautilus, и Compiz уже были мной выпилены в пользу лёгких шустрых openbox и xcompmgr. Однако, более детальное ознакомление навеяло некоторую тоску древностью доступного софта (основанная на Debian ветка Statler появилась относительно недавно, и, к тому же, её настройка выглядела довольно трудозатратно), поэтому я продолжил по мере возможностей обрабатывать Ubuntu, с целью, не растеряв бонусов, всё-таки довести её тактико-технические характеристики до CrunchBang.
После сноса вышеупомянутой адовой троицы некоторое время продолжалась эксплуатация gnome-panel, но инерция была преодолена, и её место заняла кумир миллионов tint2. Для своей любимой плюшки - слайд-шоу рабочего стола, я изобретать велосипед не стал, и прикрутил feh-строку выбора случайной обоины, выполняемую при загрузке и в дальнейшем по cron, нужную мне информацию вывел на дисплей через conky, а вот вопрос ярлыков рабочего стола остался открытым. В качестве файлового менеджера мне гораздо удобнее использовать mc/gnome-commander, они в качестве менеджера рабочего стола не годятся, а ставить для этой скромной цели аж целый PcmanFM я посчитал плохой идеей.
Мне нужен был док, то есть некоторая область на экране с находящимися на ней ярлыками. Требования к ярлыкам я предъявил расширенные - захотел не только запускать команды по клику, но и иметь настраиваемые выпадающие менюшки. Конечно, можно было поставить idesk+myGTKmenu, или какой-нибудь, не к ночи будь помянут, Cairo-Dock, но, решив обойтись тем, что имею, я таки получил полностью удовлетворившее меня экономное и концептуальное решение.
Док с ярлыками был обеспечен запуском дополнительной копии tint2 с отдельной конфигурацией "только лаунчеры", доставивший мне на рабочий стол ряд ярлыков (если, паче чаяния, захочу несколько рядов – впишу в автозагрузку ещё конфигураций tint2, при её невесомости для тачки это будет совершенно неощутимо). Чтобы полученная конструкция представляла из себя полноценный док, осталось пристегнуть к лаунчерам менюшки.
Сказка:
Для реализации настраиваемых всплывающих менюшек мне, в первую очередь, нужно было получить возможность вызова меню openbox из командной строки. Недостаточно упорные в гуглении сабжа массы нагугливают себе на голову xdotool, убеждаются, что он не работает в русской раскладке, и бросают это дело, истинные же джедаи обретают xmacro, и, после назначения в ~/.config/openbox/rc.xml горячей клавиши (я назначил классическую - Ctrl+Esc):
<!-- Keybinding for opening OpenBox menu -->
<keybind key="C-Escape">
<action name="ShowMenu">
<menu>root-menu</menu>
</action>
</keybind>
вызов меню openbox становится прочно доступным при любой раскладке по команде
echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L" | xmacroplay $DISPLAY
Теперь, вписав в desktop-файл лаунчера эту строку, я получил для него всплывающее меню по клику.
Но ведь мне же нужны разные меню для разных лаунчеров!
В решении этого вопроса на помощь пришла козырная фишка openbox под названием динамическое меню.
В каталоге ~/.config/openbox/ я налепил пачку файлов menu1.xml, menu2.xml, menu3.xml, и так далее, представляющих собой куски конфига главного меню openbox, только без "шапки" и "подвала", например:
<item icon="/usr/share/icons/hicolor/48x48/apps/deadbeef.png" label="DeadBeef">
<action name="Execute">
<command>deadbeef</command>
</action>
</item>
<item icon="/usr/share/icons/hicolor/48x48/apps/vlc.png" label="VLC">
<action name="Execute">
<command>vlc</command>
</action>
</item>
<item icon="/usr/share/icons/hicolor/48x48/apps/gthumb.png" label="gThumb">
<action name="Execute">
<command>gthumb</command>
</action>
</item>
Предположим, что у меня в однострочном файле /tmp/mem/$USER/obcount хранится некоторый номер (натуральное число), и я хочу вызвать менюшку, которую определяет ~/.config/openbox/menu"номер".xml. Я написал маленький скриптик ~/.config/openbox/menu.sh, который, в зависимости от номера, записанного в /tmp/mem/$USER/obcount, выводит соответствующее этому номеру динамическое меню (если /tmp/mem/$USER/obcount не существует, то скрипт выводит некое глобальное меню), после чего удаляет файл /tmp/mem/$USER/obcount (если он был):
#!/bin/bash
echo '<?xml version="1.0" encoding="utf-8"?>'
echo '<openbox_pipe_menu>'
if [ -a /tmp/mem/$USER/obcount ]
then
cat ~/.config/openbox/menu$(head -n1 /tmp/mem/$USER/obcount).xml
rm /tmp/mem/$USER/obcount
else
# План "Б". Эта часть скрипта, выполняемая в случае отсутствия файла /tmp/mem/$USER/obcount, предназначена для вывода глобального меню,
# всплывающего по right-клику на рабочем столе.
# Лично я через цикл скомпоновал в главном меню все используемые менюшки+добавил несколько пунктов в корень,
# но, чтобы не усложнять, привожу здесь незамысловатый вариант вывода меню "в лоб" через файл ~/.config/openbox/menu0.xml:
cat ~/.config/openbox/menu0.xml
fi
echo '</openbox_pipe_menu>'
Приведя ~/.config/openbox/menu.xml к виду
<?xml version="1.0" encoding="utf-8"?>
<openbox_menu>
<menu id="root-menu" label="menu" execute="~/.config/openbox/menu.sh" />
</openbox_menu>
я получил возможность полностью определить содержание меню openbox выхлопом скрипта ~/.config/openbox/menu.sh, и, вписав в desktop-файл лаунчера строку
Exec=echo -n "номер_меню" >>/tmp/mem/$USER/obcount; echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L" | xmacroplay $DISPLAY
я получил возможность назначить каждому лаунчеру своё всплывающее меню. При правом клике по рабочему столу /tmp/mem/$USER/obcount не создаётся, следовательно, выполняется "план Б", и всплывает глобальное меню.

Теперь поясню, почему номер меню здесь передаётся в ~/.config/openbox/menu.sh через файл /tmp/mem/$USER/obcount, хотя, на первый взгляд, логичнее было бы передать его через переменную. Это вызвано тем, что в процессе заковыристого вызова ~/.config/openbox/menu.sh через эмулятор xmacro и меню опенбокса наследование рвётся, и переменная до адресата не доходит.
Но теребить диск для этих целей - дурной тон, и, к тому же, способ ненадёжный. Выражаю горячую благодарность
inkblack'у, предложившему использовать для этих целей tmpfs:
В /etc/fstab вписываем
tmpfs /tmp/mem tmpfs rw,size=1m 0 0
(это обеспечит нам хранящийся в памяти виртуальный диск объёма 1М)
В автозагрузку -
mkdir /tmp/mem/$USER &
(создание для пользователя своего домашнего виртуального временного каталога)
Цель достигнута.
Без ложной скромности считаю, что добился довольно продуктивного взаимодействия двух замечательных продуктов.
Прекрасно отдаю себе отчёт, что изврат с tint2 в качестве дока рабочего стола - моё личное предпочтение, но, как может заметить читатель, ничто не мешает, используя вышеописанную методу, привязывать настраиваемые openbox-менюшки к ярлыкам рабочего стола, используемым популярными связками openbox+PCmanFM и openbox+Thunar. Используя tint2 традиционным способом, можно реализовать несколько различных start-like кнопок на панельке. И так далее, и тому подобное.
Спасибо за внимание.