diff --git a/data/menu b/data/menu index 4c74c10..2571f17 100644 --- a/data/menu +++ b/data/menu @@ -10,35 +10,50 @@ def get_waybox_pid(name='waybox'): else: return 0 -def get_menu_items(menu, indent): - print("%s⇢ %s\0nonselectable\x1ftrue\x1ficon\x1fgo-next-symbolic" % (indent, menu.getAttribute('label').replace('_', '') or menu.getAttribute('id'))) +def get_menu_items(menu, indent, expand): + menu_id = menu.getAttribute('id') + nonselectable = str(bool(menu_id == '')).lower() + print("%s%s ⇢\0info\x1f{\"menu\": \"%s\"}\x1fnonselectable\x1f%s" % (indent, menu.getAttribute('label').replace('_', '') or menu_id, menu_id, nonselectable)) indent = indent + " " children = menu.childNodes for i in range(0, children.length): - if children[i].nodeType == dom.Node.ELEMENT_NODE and children[i].tagName == 'item': - action = children[i].getElementsByTagName('action')[0].getAttribute('name') - cmd = "" - icon = children[i].getAttribute('icon') - label = children[i].getAttribute('label').replace('_', '') - if action == 'Execute': - cmd = children[i].getElementsByTagName('execute')[0].firstChild.nodeValue - elif action == 'Exit': - cmd = "kill -s SIGTERM %d" % get_waybox_pid() - elif action == 'Reconfigure': - cmd = "kill -s SIGUSR2 %d" % get_waybox_pid() - print("%s %s\0info\x1f%s\x1ficon\x1f%s" % (indent, label, cmd, icon)) - elif children[i].nodeType == dom.Node.ELEMENT_NODE and children[i].tagName == 'menu': - get_menu_items(children[i], indent) + if expand: + if children[i].nodeType == dom.Node.ELEMENT_NODE and children[i].tagName == 'item': + action = children[i].getElementsByTagName('action')[0].getAttribute('name') + cmd = "" + icon = children[i].getAttribute('icon') + label = children[i].getAttribute('label').replace('_', '') + if action == 'Execute': + cmd = children[i].getElementsByTagName('execute')[0].firstChild.nodeValue + elif action == 'Exit': + cmd = "kill -s SIGTERM %d" % get_waybox_pid() + elif action == 'Reconfigure': + cmd = "kill -s SIGUSR2 %d" % get_waybox_pid() + print("%s\0info\x1f{\"exec\": \"%s\"}\x1ficon\x1f%s\x1fdisplay\x1f%s %s" % (cmd, cmd.replace('"', '\\"'), icon, indent, label)) + elif children[i].nodeType == dom.Node.ELEMENT_NODE and children[i].tagName == 'menu': + get_menu_items(children[i], indent, os.getenv('ROFI_RETV') is None) menu_xml = os.getenv("WB_MENU_XML") or "menu.xml" -# If ran as a rofi script (not possible with wofi) -if not os.getenv('ROFI_RETV') is None: - import shlex - print("\0message\x1f%s" % os.path.abspath(menu_xml)) - if not (info := os.getenv('ROFI_INFO')) is None: - subprocess.Popen(shlex.split(info), stdout=subprocess.PIPE) - sys.exit(0) - document = dom.parse(menu_xml) + +print("\0message\x1f%s" % os.path.abspath(menu_xml)) +if not (info := os.getenv('ROFI_INFO')) is None: + import json + obj = json.JSONDecoder().decode(s=info) + if 'exec' in info: + import shlex + subprocess.Popen(shlex.split(obj['exec']), stdout=subprocess.PIPE) + sys.exit(0) + elif 'menu' in obj: + # Eh document.getElementById() seems not to work + menus = document.getElementsByTagName('menu') + for i in range(0, menus.length): + if menus[i].getAttribute('id') == obj['menu']: + menu = menus[i] + break + if not menu is None: + get_menu_items(menu, "", True) + print("---\0nonselectable\x1ftrue") + root_menu = document.getElementsByTagName('menu')[0] -get_menu_items(root_menu, "") +get_menu_items(root_menu, "", True) diff --git a/data/meson.build b/data/meson.build index c092cba..574cb0a 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,4 +1,5 @@ cfdata = configuration_data() +cfdata.set('bindir', get_option('prefix') / get_option('bindir')) cfdata.set('libexecdir', get_option('prefix') / get_option('libexecdir')) cfdata.set('localedir', get_option('prefix') / get_option('localedir')) cfdata.set('sysconfdir', get_option('prefix') / get_option('sysconfdir')) @@ -16,7 +17,6 @@ configure_file( scripts = files( 'autostart', 'environment', - 'menu', 'xdg-autostart', ) @@ -45,3 +45,10 @@ install_data( install_dir: get_option('prefix') / get_option('datadir') + '/wayland-sessions', install_mode: 'rw-r--r--', ) + +install_data( + 'menu', + install_dir: get_option('prefix') / get_option('bindir'), + install_mode: 'rwxr-xr-x', + rename: ['waybox-menu'] + ) diff --git a/data/rc.xml b/data/rc.xml index 5bff008..818c8f7 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -71,7 +71,8 @@ - rofi -show menu:$WB_CONF_DIR/menu + + rofi -show waybox-menu diff --git a/data/waybox.sh b/data/waybox.sh index 01448ce..1c32191 100644 --- a/data/waybox.sh +++ b/data/waybox.sh @@ -117,6 +117,8 @@ then DBUS_LAUNCH="dbus-launch --exit-with-session" fi +export PATH=@bindir@:$PATH + # No need to export these to Waybox unset TEXTDOMAIN TEXTDOMAINDIR $DBUS_LAUNCH @libexecdir@/waybox --startup "${WB_AUTOSTART:-true}; ${WB_XDG_AUTOSTART:-true}" "$@"