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

如何用xprop -spy持续检测窗口是否未处于_NET_WM_STATE_FOCUSED状态?

实现Alacritty下拉(Quake模式):失焦自动隐藏的脚本方案

问题背景

我正在编写脚本让Alacritty实现桌面下拉(Quake模式),需求是窗口失去焦点时自动取消映射(隐藏)该窗口。

尝试直接通过窗口ID检测焦点状态时,发现X没有为窗口失焦状态设置对应值。首次尝试的代码如下:

xprop -spy -id "$wid" | grep --line-buffered "_NET_WM_STATE_FOCUSED" |
while read -r focused; do
    if [[ -z $focused ]]; then
        echo "off"
    fi
done

但该方案存在问题:当窗口失焦时,grep会因为没有匹配内容而终止管道,导致while read循环直接退出,无法触发后续的隐藏命令。

补充疑问:是否可以用xprop -spy持续检测窗口是否未设置_NET_WM_STATE_FOCUSED状态?

可行解决方案

不要用grep过滤输出,直接监听xprop返回的整个_NET_WM_STATE属性变化,每次状态更新时判断是否包含焦点标记:

xprop -spy -id "$wid" _NET_WM_STATE | while read -r state_line; do
    # 检查当前窗口状态中是否存在焦点标记
    if [[ ! "$state_line" =~ "_NET_WM_STATE_FOCUSED" ]]; then
        # 执行取消映射窗口的命令,可根据你的窗口管理工具选择:
        # wmctrl 方式
        wmctrl -i -c "$wid"
        # 或 xdo 方式
        # xdo hide "$wid"
        # 若需要持续监听(比如窗口再次唤起后继续检测),可移除下面的break
        break
    fi
done

原理说明

  • xprop -spy -id "$wid" _NET_WM_STATE会持续监听指定窗口的_NET_WM_STATE属性,每次窗口状态(包括焦点变化)改变时,都会输出一行包含当前所有状态的内容。
  • 当窗口获得焦点时,输出内容会包含_NET_WM_STATE_FOCUSED;失去焦点时,该标记会从状态列表中移除。
  • 通过[[ ! "$state_line" =~ "_NET_WM_STATE_FOCUSED" ]]判断窗口是否失焦,触发隐藏命令。

内容的提问来源于stack exchange,提问作者Eduardo Isla Venegas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:20:00