Генерация меню OpenBox с помощью openbox-menuПодписка на Комментарии к "Генерация меню OpenBox с помощью openbox-menu"

Аватар ormorph

Программа openbox-menu использует menu-cache из Lxde.

Только один минус, сгенерированный файл не поддерживается OpenBox3.
Решил изменить это.
Вид меню будет зависеть от того какой файл выбран *-applications.menu.
Для этого используется переменная XDG_MENU_PREFIX=

Например XDG_MENU_PREFIX=mate- использует файл: /etc/xdg/menus/mate-applications.menu
Т.е. mate- служит префиксом для applications.menu

Для начала написал скрипт и положил его в каталог ~/.config/openbox
Данный скрипт обрабатывает вывод команды openbox-menu.
Скрипт: ~/.config/openbox/genmenu.sh:

#!/bin/bash

#скрипт  для создания меню openbox
# использует программу x11-misc/openbox-menu

cd ~/.config/openbox

# Переменная XDG_MENU_PREFIX=mate- означает искать
# файл /etc/xdg/menus/mate-applications.menu

XDG_MENU_PREFIX=mate- openbox-menu >menu.xml 2>/dev/null

#XDG_MENU_PREFIX=kde-4- openbox-menu >menu.xml 2>/dev/null

sed -r 's/<openbox_pipe_menu.*http:\/\/openbox.org\/" >/\n<openbox_menu>\n<menu id="root-menu" label="Openbox 3">\n/; s/<\/openbox_pipe_menu>//' -i menu.xml

# добавляем пункты меню

echo '<separator/>
<menu id="root-menu-5990" label="Openbox">
        <menu id="client-list-menu"/>
        <item label="Reconfigure">
                <action name="Reconfigure"/>
        </item>
        <item label="GenMenu">
                <action name="Execute">
                        <execute>~/.config/openbox/genmenu.sh</execute>
                </action>
        </item>
        <item label="Exit">
                <action name="Exit"/>
        </item>
</menu>
</menu>
</openbox_menu>'
>>menu.xml

openbox --reconfigure
# после данного скрипта можно доработать файл в  obmenu

Это один вариант решения.
Второй вариант это правка исходного кода:

В исходнике присутствует файл: ob_display.c
В данном файле присутствует следующий кусок кода:

const gchar *default_template =
    "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
    "<openbox_pipe_menu xmlns=\"http://openbox.org/\""
    "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
    "  xsi:schemaLocation=\"http://openbox.org/\" >"
    "%MENU%</openbox_pipe_menu>\n";

Копируем файл:
$ cp ob_display.c ob_display.c.orig
И приводим содержимое файла к следующему виду:
const gchar *default_template =
    "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
    "<openbox_menu>\n"
    "<menu id=\"root-menu\" label=\"Openbox 3\">\n"
    "%MENU%</menu>\n"
    "</openbox_menu>";

Данный вариант позволяет создавать меню который будет подхватываться OpenBox3, но этот вариант требует лишних телодвижений, по этому этот кусок кода можно еще изменить:
const gchar *default_template =
    "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
    "<openbox_menu>\n"
    "<menu id=\"root-menu\" label=\"Openbox 3\">\n"
    "%MENU%\n"
    "<separator/>\n"
    "<menu id=\"root-menu-5990\" label=\"Openbox\">\n"
    "<menu id=\"client-list-menu\"/>\n"
    "   <item label=\"Reconfigure\">\n"
    "           <action name=\"Reconfigure\"/>\n"
    "   </item>\n"
    "<item label=\"GenMenu\">\n"
    "           <action name=\"Execute\">\n"
    "                   <execute>~/.config/openbox/genmenu</execute>\n"
    "           </action>\n"
    "   </item>\n"
    "   <item label=\"Exit\">\n"
    "           <action name=\"Exit\"/>\n"
    "   </item>\n"
    "</menu>\n"
    "</menu>\n"
    "</openbox_menu>";

Далее остается только собрать:
$ make
$ strip openbox-menu
$ cp openbox-menu ~/.config/openbox

В каталоге ~/.config/openbox создается скрипт genmenu:
#!/bin/bash

cd ~/.config/openbox

XDG_MENU_PREFIX=mate- ./openbox-menu >menu.xml

openbox --reconfigure

Скрипту даются права на выполнение:
$ chmod +x genmenu
После запуска данного скрипта, далее можно будет обновлять меню одним кликом по пункту меню GenMenu

Файл ob_display.c.orig создавался для того чтобы фиксировать изменения файла в виде патча командой:
$ diff -uN ob_display.c.orig ob_display.c >ob_display1.patch
После выполнения данной команды должен появиться файл патча ob_display1.patch, который можно будет потом наложить на исходник, например в gentoo можно использовать его в как autopatch.
Пример сгенерированного меню:
snimok.png
В данном случае использовалась версия 0.5.1.
Скачать исходник программы можно тут

Добавить комментарий