#!/bin/bash # toggle-dropdown.sh — toggle the dropdown foot terminal # Writes debug info to /tmp/sway-f12.log so we can diagnose from SSH # # waybar's on-click context strips WAYLAND_DISPLAY, which swaymsg + foot # both need. Source restore-wayland-env.sh at the top so the entire # script runs with the right env (mirrors caffeine.sh's pattern). # shellcheck source=restore-wayland-env.sh source "$HOME/.config/sway/restore-wayland-env.sh" LOG=/tmp/sway-f12.log echo "=== $(date) F12/Super+grave pressed ===" >> "$LOG" echo "WAYLAND_DISPLAY=$WAYLAND_DISPLAY" >> "$LOG" echo "USER=$USER XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR" >> "$LOG" # Find the sway socket SOCK=$(ls -t /run/user/$(id -u)/sway-ipc.*.sock 2>/dev/null | head -1) echo "SOCK=$SOCK" >> "$LOG" if [ -z "$SOCK" ]; then echo "ERROR: no sway socket found" >> "$LOG" notify-send "sway: no IPC socket" 2>>"$LOG" || true exit 1 fi # Check if a foot window is in the scratchpad (hidden) HIDDEN=$(SWAYSOCK=$SOCK swaymsg -t get_tree 2>>"$LOG" | python3 -c " import sys, json try: tree = json.load(sys.stdin) def find_app(node, app_id): if node.get('app_id') == app_id and node.get('name', '').startswith('__i3'): return node for c in node.get('nodes', []) + node.get('floating_nodes', []): r = find_app(c, app_id) if r is not None: return r return None dd = find_app(tree, 'foot') print('hidden' if dd is not None else 'none') except Exception as e: print(f'err:{e}') " 2>>"$LOG") echo "HIDDEN=$HIDDEN" >> "$LOG" if [ "$HIDDEN" = "hidden" ]; then SWAYSOCK=$SOCK swaymsg '[app_id="foot"] scratchpad show' >>"$LOG" 2>&1 echo "toggled: scratchpad show" >> "$LOG" else # Spawn a new foot. WAYLAND_DISPLAY is now set by restore-wayland-env.sh. if [ -n "$WAYLAND_DISPLAY" ]; then WAYLAND_DISPLAY=$WAYLAND_DISPLAY foot >>"$LOG" 2>&1 & else foot >>"$LOG" 2>&1 & fi echo "spawned foot" >> "$LOG" fi echo "=== done ===" >> "$LOG"