You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Gnome/X11/Ubuntu24.04中恢复、最大化并聚焦通知区最小化窗口

问题:恢复最小化到通知区的窗口并聚焦

我有一段通过窗口标题查找并聚焦窗口的代码:

winid=$(wmctrl -l | grep $1 | cut -f1 -d' ')
xdotool windowactivate $winid

这段代码对被其他窗口遮挡的窗口有效,但对于最小化到通知区的窗口(例如Slack),无法将其恢复。尝试了以下命令也无效:

# Ensure the window is mapped (visible)
xdotool windowmap $winid 2>/dev/null
# Raise the window to the top of the stack
xdotool windowraise $winid 2>/dev/null
# Bring the window to the foreground
xdotool windowactivate $winid 2>/dev/null
# (Optional) Force refresh with wmctrl
wmctrl -i -R $winid 2>/dev/null

环境:Ubuntu 24.04,X11


解决方法

1. 确保正确获取窗口ID

最小化到通知区的窗口通常不会出现在wmctrl -l输出中,因为这类应用会隐藏窗口而非普通最小化。可以用xwininfo遍历所有窗口(包括隐藏的)来定位:

winid=$(xwininfo -root -tree | grep -i "slack" | awk '{print $1}')

若匹配到多个ID,可结合窗口类名精确过滤:

winid=$(xprop -root _NET_CLIENT_LIST | awk -F'#' '{print $2}' | tr ',' '\n' | while read id; do
  xprop -id $id WM_CLASS | grep -q "Slack" && echo $id
done)

2. 强制恢复隐藏窗口并聚焦

先检查窗口状态,若为隐藏则先映射显示,再用wmctrl激活:

# 检查窗口是否隐藏
if xprop -id $winid _NET_WM_STATE | grep -q "_NET_WM_STATE_HIDDEN"; then
  xdotool windowmap $winid 2>/dev/null
fi
# 激活并置顶窗口
wmctrl -i -R $winid
xdotool windowactivate $winid

3. 针对托盘应用的DBus调用

部分托盘应用(如Slack)需要通过DBus接口触发窗口显示,先找到应用的DBus名称:

gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.ListNames | grep -i slack

找到后调用对应的激活方法(以Slack为例):

gdbus call --session --dest com.slack.Slack --object-path /com/slack/Slack --method com.slack.Slack.ActivateWindow

可使用d-feet工具可视化查看应用的DBus接口,方便定位调用方法。

4. 完整通用脚本

整合上述逻辑,编写一个可复用的脚本:

#!/bin/bash
TARGET_APP="$1"

# 通过窗口类名查找目标窗口ID
winid=$(xprop -root _NET_CLIENT_LIST | awk -F'#' '{print $2}' | tr ',' '\n' | while read id; do
  xprop -id $id WM_CLASS | grep -qi "$TARGET_APP" && echo $id && break
done)

if [ -z "$winid" ]; then
  echo "未找到目标窗口"
  exit 1
fi

# 恢复隐藏窗口
xprop -id $winid _NET_WM_STATE | grep -q "_NET_WM_STATE_HIDDEN" && xdotool windowmap $winid

# 激活并聚焦窗口
wmctrl -i -R $winid
xdotool windowactivate $winid

保存为focus-app.sh,执行chmod +x focus-app.sh赋予权限,使用时运行./focus-app.sh Slack即可。


内容的提问来源于stack exchange,提问作者Persimmonium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:21:05