如何在X11(Xorg)环境下通过shell检测窗口内容变化并触发脚本
X11环境检测工作区窗口内容变化的实现方法
实现方案
方案1:轮询帧比对(无需额外编译,易上手)
该方案通过定时对比当前工作区全屏画面的哈希值判断内容是否变化,适合普通场景使用,资源占用可控。
- 首先安装依赖:
# Debian/Ubuntu 发行版 sudo apt install imagemagick wmctrl # Fedora/RHEL 发行版 sudo dnf install ImageMagick wmctrl
- 示例监控脚本:
#!/bin/bash # 替换为你需要执行的脚本路径 TRIGGER_SCRIPT="/home/xxx/your_custom_script.sh" # 轮询间隔,单位:秒 CHECK_INTERVAL=1 # 存储上一次画面的哈希值 last_pic_hash="" while :; do # 仅在当前激活的工作区检测,跳过其他虚拟桌面 current_workspace=$(wmctrl -d | awk '/\*/{print $1}') # 生成当前画面的唯一哈希标识 current_pic_hash=$(convert x:root -format "%#" info:) # 哈希值变化说明工作区内容有更新 if [ -n "$last_pic_hash" ] && [ "$current_pic_hash" != "$last_pic_hash" ]; then # 后台执行目标脚本,避免阻塞监控流程 bash "$TRIGGER_SCRIPT" & fi last_pic_hash="$current_pic_hash" sleep $CHECK_INTERVAL done
- 启动监控:
chmod +x window_change_monitor.sh ./window_change_monitor.sh # 如需后台常驻可以用 nohup ./window_change_monitor.sh &
方案2:基于X11 Damage扩展(低延迟,低资源占用)
如果你对监控延迟要求很高,不接受轮询的开销,可以基于X11官方的Damage扩展开发轻量监听程序,该扩展会在窗口内容发生变化时主动推送事件,无需定时轮询。
核心调用接口为XDamageQueryExtension、XDamageCreate,编译后可直接被shell调用,事件触发时执行指定脚本即可。
优化提示
- 只需监听特定窗口的话,将
convert命令中的x:root替换为对应窗口ID即可,窗口ID可通过xdotool getactivewindow或者wmctrl -l查询。 - 轮询间隔可根据你的需求调整,1s的间隔一般仅占用不到1%的CPU资源,普通办公场景完全够用。
内容的提问来源于stack exchange,提问作者siduck
相关产品推荐
相关产品推荐

