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}" "$@"