如何统计当前KDE活动及虚拟桌面内的活跃窗口总数
问题原因
xdotool 原生的 --desktop 参数仅能识别X11协议层面的虚拟桌面标记,而KDE Activities是KDE独立实现的窗口隔离逻辑,不会将窗口的Activity归属信息写入X11原生桌面属性,因此直接调用该参数会跨Activity返回所有匹配桌面的窗口,无法按Activity做筛选。
实现方案
KDE会在每个窗口上写入自定义X属性 _KDE_NET_WM_ACTIVITIES,存储该窗口归属的Activity UUID列表,我们可以先获取目标Activity的ID,再通过该属性过滤窗口完成统计:
- 获取目标Activity的UUID
统计当前激活Activity下的窗口时,可直接执行以下命令拿到当前Activity ID:
如果需要统计其他指定Activity的窗口,可先执行以下命令拿到系统内所有Activity的ID列表,再替换为目标ID即可:qdbus org.kde.ActivityManager /ActivityManager/Activities CurrentActivityqdbus org.kde.ActivityManager /ActivityManager/Activities ListActivities - 筛选窗口并统计数量
搭配xprop读取每个窗口的Activity归属属性做匹配,以下是统计「X11虚拟桌面2 + 目标Activity」下可见窗口数量的完整可执行脚本:# 可替换为你需要统计的任意Activity ID TARGET_ACT=$(qdbus org.kde.ActivityManager /ActivityManager/Activities CurrentActivity) window_count=0 # 枚举所有可见、归属X11虚拟桌面2的窗口ID for wid in $(xdotool search --onlyvisible --desktop 2); do # 读取当前窗口的KDE Activity归属属性 act_attr=$(xprop -id "$wid" _KDE_NET_WM_ACTIVITIES | cut -d '"' -f2) # 属性为空代表窗口在所有Activity下显示,属性包含目标ID代表窗口属于目标Activity if [ -z "$act_attr" ] || [[ "$act_attr" == *"$TARGET_ACT"* ]]; then window_count=$((window_count+1)) fi done echo "目标范围窗口总数:$window_count"
补充说明
- 如果不需要限制X11虚拟桌面范围,仅统计目标Activity下的所有可见窗口,删除
xdotool search命令中的--desktop 2参数即可。 - 针对焦点bug场景,要实现「仅当目标范围存在窗口时才执行Alt+Tab切换」,只需要在统计完成后加判断逻辑即可:
if [ $window_count -gt 0 ]; then xdotool key alt+Tab fi - 以上方案仅适用于KDE的X11会话,如果你使用Wayland会话,
xdotool无法正常工作,可以替换为适配KDE Wayland的窗口控制工具(如kdotool),核心筛选逻辑不变,替换对应窗口枚举、属性读取的命令即可。
内容的提问来源于stack exchange,提问作者Alsaraha
相关产品推荐
相关产品推荐

