#!/bin/bash subnum=({0..100}) declare -A pids labels busname=$(xprop -id $1 _GTK_UNIQUE_BUS_NAME | cut -d \" -f 2) objpath=$(xprop -id $1 _GTK_MENUBAR_OBJECT_PATH | cut -d \" -f 2) while IFS=\| read id pos sid action label; do pid=${pids[$id]} label=${label//_/} [[ $pid ]] && label="${labels[$id]} > $label" if [[ $2 == "$label" ]]; then busctl --user -j call $busname $objpath \ org.gtk.Actions Activate sava{sv} -- "${action#unity.}" 0 0 exit fi if [[ $sid ]]; then pids[$sid]="$pid.$sid" labels[$sid]="$label" else echo "$pid.$id.$pos.$(( ++i )) $label" fi done < <( # {{{ busctl --user -j call $busname $objpath \ org.gtk.Menus Start au -- ${#subnum[@]} ${subnum[@]} | jq -r ' .data[] | .[] | .[0] as $id | .[1] as $pos | (.[2] | .[] | select(.label) | [$id, $pos, (.":submenu".data | .[0]), .action.data, .label.data] | @tsv) ' | tr \\t \| ) | # }}} sort -k 1,1V | cut -d ' ' -f 2- ################################################################################ busaddr=$(busctl --user -j call \ com.canonical.AppMenu.Registrar \ /com/canonical/AppMenu/Registrar com.canonical.AppMenu.\ Registrar GetMenuForWindow u $1 | jq -r '.data | join(" ")') while read id label; do if [[ $2 == "$label" ]]; then busctl --user -j call $busaddr \ com.canonical.dbusmenu Event isvu -- $id clicked i 0 $(date +%s) exit fi echo "$label" done < <( # {{{ busctl --user -j call $busaddr \ com.canonical.dbusmenu GetLayout -- iias 0 -1 0 | jq -r '.' --tab | awk ' BEGIN { split("", tree) } /\s+[0-9]+/ { id = int($1) next } /"data": "submenu"/ { submenu = "" next } /"data": "radio"/ { next } /"data": "separator"/ { next } /"data": "checkmark"/ { next } /"data": "/ { gsub("_", "") sub(/"$/, "") sub(/"data": "/, "") if (!submenu){ submenu = $0 last = count count = gsub(/\t/, "", submenu) for (i in tree){ if (count < last && i >= last) delete tree[i] } tree[count]=$0 next } menu = "" for (i in tree) menu = (menu ? menu " > " : "") tree[i] sub(/^\s+/, "") gsub(/\t+/, "", menu) printf "%d %s > %s\n", id, menu, $0 # menus[id]=id " " menu " > " $0 } ' ) # }}}