如何用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
相关产品推荐
相关产品推荐

