В этом посте описана реализация рабочего стола средствами 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):
вызов меню openbox становится прочно доступным при любой раскладке по команде
Теперь, вписав в desktop-файл лаунчера эту строку, я получил для него всплывающее меню по клику.
Но ведь мне же нужны разные меню для разных лаунчеров!
В решении этого вопроса на помощь приходит замечательная осрбенность openbox под названием динамическое меню.
В каталоге ~/.config/openbox/ я налепил пачку файлов menu1.xml, menu2.xml, menu3.xml, и так далее, представляющих собой куски конфига главного меню openbox, только без «шапки» и «подвала», например:
Предположим, что у меня в одностроним файле ~/obcount хранится некоторый номер (натуральное число), и я хочу вызвать менюшку, которую определяет ~/.config/openbox/menu«номер».xml. Я написал маленький скриптик ~/.config/openbox/menu.sh, который, в зависимости от номера, записанного в ~/obcount, выводит соответствующее этому номеру динамическое меню (если ~/obcount не существует, то скрипт выводит некое глобальное меню), после чего удаляет файл ~/obcount (если он был):
Приведя ~/.config/openbox/menu.xml к виду
я получил возможность полностью определить содержание меню openbox выхлопом скрипта ~/.config/openbox/menu.sh, и, вписав в desktop-файл лаунчера строку
я получил возможность назначить каждому лаунчеру своё всплывающее меню. При правом клике по рабочему столу ~/obcount не создаётся, следовательно, выполняется «план Б», и всплывает глобальное меню.
Таким путём я достиг своей скромной цели.

Поясню, почему номер меню передаётся в ~/.config/openbox/menu.sh через файл ~/obcount, хотя, на первый взгляд, логичнее было бы передать его через переменную. Это вызвано тем, что в процессе заковыристого вызова ~/.config/openbox/menu.sh через эмулятор xmacro и меню опенбокса наследование рвётся, и переменная до адресата не доходит. Есть ещё, конечно, вариант передавать номер через /dev/shm, но это требует дополнительных прав, и для организации работы среднестатистического юзера, я так думаю, не очень годится.
Прекрасно отдаю себе отчёт, что использование tint2 в качестве дока рабочего стола — моё личное предпочтение, но, как может заметить читатель, ничто не мешает, используя вышеописанный метод, привязывать настраиваемые openbox-менюшки к ярлыкам рабочего стола, используемым популярными связками openbox+PCmanFM и openbox+Thunar, также, используя tint2 традиционным способом, можно реализовать несколько различных start-like кнопок на панельке, и т.д., и т.п.
Спасибо за внимание.
Присказка:
Когда я, пребывая на мейнстримовой Убунте, познакомился с расово правильным 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 не создаётся, следовательно, выполняется «план Б», и всплывает глобальное меню.
Таким путём я достиг своей скромной цели.

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