#!/usr/bin/env bash # QQ 智能启动:已运行则激活主窗口,否则正常启动 QQ_BIN="/usr/bin/linuxqq" APP_IDS=("qq" "QQ" "linuxqq") # 1) QQ 进程没在跑 → 直接启动 if ! pgrep -f "/opt/QQ/qq" >/dev/null 2>&1; then exec "$QQ_BIN" "$@" fi # 2) 进程在跑:先检查 niri 里有没有已 map 的 QQ 窗口,有就直接 focus WIN_ID="" if command -v niri >/dev/null 2>&1; then # 解析 niri 输出:找 App ID 匹配的第一行所属 Window ID current_id="" while IFS= read -r line; do if [[ "$line" =~ ^Window\ ID\ ([0-9]+): ]]; then current_id="${BASH_REMATCH[1]}" elif [[ "$line" =~ ^\ +App\ ID:\ \"([^\"]+)\"$ ]]; then app="${BASH_REMATCH[1]}" for match in "${APP_IDS[@]}"; do if [[ "$app" == "$match" ]]; then WIN_ID="$current_id" break 2 fi done fi done < <(niri msg windows 2>/dev/null) fi if [[ -n "$WIN_ID" ]]; then niri msg action focus-window -- "$WIN_ID" >/dev/null 2>&1 exit 0 fi # 3) 进程在跑但窗口没在 niri → 隐藏在托盘的情况 # Electron 的 requestSingleInstanceLock:第二次执行会让第一实例显示主窗口然后自己退出 exec "$QQ_BIN" "$@"