40 lines
1.3 KiB
Bash
Executable File
40 lines
1.3 KiB
Bash
Executable File
#!/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" "$@"
|