perf(astal-menu): use gdbus Activate fast path in menu-toggle.sh

menu-toggle.sh always cold-started a second python3+PyGObject+GTK4
process to forward one verb to the already-running daemon, per
GApplication's command-line-forwarding mechanism. That's ~0.5s
baseline and spikes past 5s under load, easily read as an
unresponsive/broken menu button on repeat taps.

main.py's own do_command_line comment already describes the intended
fix: call the registered org.gtk.Actions directly over D-Bus for an
already-running instance. Wire that up (gdbus call, ~20-100ms) and
keep the python3 spawn only as the cold-bootstrap path when no
instance is registered yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TLz6HWsXCwzQ97LrLt2em6
main
Amir Alexander Abdelbaki 2026-07-09 09:18:34 +02:00
parent 0541177974
commit 716902f8e1
1 changed files with 30 additions and 13 deletions

View File

@ -13,6 +13,7 @@
# Verbs: (toggle) | show | hide | appdrawer. Sides: top | bottom | left | right.
BUS="eu.abdelbaki.astalmenu"
OBJ="/eu/abdelbaki/astalmenu"
APP="${HOME}/.config/astal-menu/main.py"
verb="${1:-}"; side="${2:-}"
@ -22,27 +23,43 @@ case "$verb" in
esac
case "$verb" in
appdrawer) VERB="--appdrawer" ;;
show) VERB="--show" ;;
hide) VERB="--hide" ;;
*) VERB="--toggle" ;;
appdrawer) VERB="--appdrawer"; ACTION="appdrawer"; HAS_PARAM=1 ;;
show) VERB="--show"; ACTION="show"; HAS_PARAM=1 ;;
hide) VERB="--hide"; ACTION="hide"; HAS_PARAM=0 ;;
*) VERB="--toggle"; ACTION="toggle"; HAS_PARAM=1 ;;
esac
case "$side" in
top|bottom|left|right) SIDE=(--side "$side") ;;
*) SIDE=() ;;
*) side=""; SIDE=() ;;
esac
registered() { busctl --user list 2>/dev/null | grep -q "$BUS"; }
if ! registered; then
"${HOME}/.config/scripts/astal-menu-start.sh" >/dev/null 2>&1 &
for _ in $(seq 1 25); do
if registered; then break; fi
sleep 0.2
done
if registered; then
# Fast path: the daemon is already up, so activate the action directly over
# D-Bus (~20-100ms) instead of cold-starting a second python3 + PyGObject +
# GTK4 process (~0.5s baseline, much worse under load — observed spikes past
# 5s) just to forward one verb via GApplication's command-line forwarding.
if [[ $HAS_PARAM -eq 1 ]]; then
param="[<'${side}'>]"
else
param="[]"
fi
exec gdbus call --session --dest "$BUS" --object-path "$OBJ" \
--method org.gtk.Actions.Activate "$ACTION" "$param" "{}" >/dev/null
fi
# If it still didn't register, this invocation just becomes the primary instance
# (Gio single-instance handles the routing either way).
# Not registered yet: start the daemon and wait for it to come up, then retry
# via the fast path above.
"${HOME}/.config/scripts/astal-menu-start.sh" >/dev/null 2>&1 &
for _ in $(seq 1 25); do
if registered; then
exec "$0" "$@"
fi
sleep 0.2
done
# Still not registered after 5s: fall back to becoming the primary instance
# ourselves (Gio single-instance handles the routing either way).
exec python3 "$APP" "$VERB" "${SIDE[@]}"