Python 如何检测X11窗口的内容何时更改?

Python 如何检测X11窗口的内容何时更改?,python,html,x11,Python,Html,X11,我正在尝试编写一个Xvfb-to-HTML5-canvas工具,该工具需要知道X11窗口何时更改,以便它可以向客户端发送屏幕更新。可以将其视为基于web的VNC或RDP,但仅适用于X11 windows(为什么要发送整个桌面?=) 我认为有一种简单的方法可以通过Xlib或xcb(xpyb)实现这一点,但在我的实验中,我能做的最好的事情就是检测窗口是何时创建、销毁或移动的。这很好,但我需要知道windows的内容何时也会发生变化(想象一下,向xterm发送一个击键,并让它显示为冻结状态,直到移动窗

我正在尝试编写一个Xvfb-to-HTML5-canvas工具,该工具需要知道X11窗口何时更改,以便它可以向客户端发送屏幕更新。可以将其视为基于web的VNC或RDP,但仅适用于X11 windows(为什么要发送整个桌面?=)

我认为有一种简单的方法可以通过Xlib或xcb(xpyb)实现这一点,但在我的实验中,我能做的最好的事情就是检测窗口是何时创建、销毁或移动的。这很好,但我需要知道windows的内容何时也会发生变化(想象一下,向xterm发送一个击键,并让它显示为冻结状态,直到移动窗口为止)

如果有人知道如何判断X11窗口的内容何时发生了变化,我很乐意听到!我对创造性的解决方案持开放态度。例如,我尝试使用ffmpeg通过fifo对x11grab进行流式传输,并定期检查是否有任何变化,但结果证明在CPU利用率方面效率极低(即使没有任何变化,它似乎也会降低整个系统的速度)

我还尝试在一个循环中抓取15fps的屏幕截图,同时以最有效的方式检查更改(例如,这个cStringIO缓冲区是否与最后一个匹配?)。这也是非常CPU密集型的

理想的解决方案是,我能够监视套接字的文件描述符,并在X11窗口发生更改时调用处理程序。我愿意满足于检测整个X11屏幕何时发生变化。。。那还是比我的好


任何和所有的帮助,这是感谢

首先,您实际上可以使用vnc在一个窗口中跟踪更改,而不是在整个桌面上。发件人:

如果要手动编写类似功能的代码,则需要使用

下面是一个使用javascript的简单示例(对不起,我不确定python中是否支持损坏扩展)


以窗口id作为命令行参数启动它,当窗口内容发生更改时,您将收到通知。

首先,您实际上可以使用vnc跟踪一个窗口中的更改,而不是整个桌面中的更改。发件人:

如果要手动编写类似功能的代码,则需要使用

下面是一个使用javascript的简单示例(对不起,我不确定python中是否支持损坏扩展)


以窗口id作为命令行参数启动它,当窗口内容发生更改时,您将收到通知。

我将此答案标记为正确答案,因为损坏扩展满足了我的需要。最后,我将XCB bindings for Python(xpyb)与SHM扩展结合使用,以获取窗口中以非常高效的方式更改的部分的屏幕截图,我希望我的工具很快发布!虽然损害似乎是最专业和最直接的方式,但还有其他一些选择。一种简单的方法是使用vnc服务器(无需打开查看器)并安装vncsnapshot(vncsnapshot.sourceforge.net)来拍摄屏幕截图,然后在您喜欢的软/脚本语言上进行比较。我将此答案标记为正确,因为损坏扩展满足了我的需要。最后,我将XCB bindings for Python(xpyb)与SHM扩展结合使用,以获取窗口中以非常高效的方式更改的部分的屏幕截图,我希望我的工具很快发布!虽然损害似乎是最专业和最直接的方式,但还有其他一些选择。一种简单的方法是使用vnc服务器(无需打开查看器)并安装vncsnapshot(vncsnapshot.sourceforge.net)来拍摄屏幕截图,然后在您喜欢的软/脚本语言上进行比较。
-id windowid           Show the X window corresponding to "windowid" not
                       the entire display.  New windows like popup menus,
                       transient toplevels, etc, may not be seen or may be
                       clipped.  Disabling SaveUnders or BackingStore in the
                       X server may help show them.  x11vnc may crash if the
                       window is initially partially obscured, changes size,
                       is iconified, etc.  Some steps are taken to avoid this
                       and the -xrandr mechanism is used to track resizes.  Use
                       xwininfo(1) to get the window id, or use "-id pick"
                       to have x11vnc run xwininfo(1) for you and extract
                       the id.  The -id option is useful for exporting very
                       simple applications (e.g. the current view on a webcam).
-sid windowid          As -id, but instead of using the window directly it
                       shifts a root view to it: this shows SaveUnders menus,
                       etc, although they will be clipped if they extend beyond
                       the window.


-appshare              Simple application sharing based on the -id/-sid
                       mechanism.  Every new toplevel window that the
                       application creates induces a new viewer window via
                       a reverse connection.  The -id/-sid and -connect
                       options are required.  Run 'x11vnc -appshare -help'
                       for more info.
var x11 = require('x11');

var X = x11.createClient(function(err, display) {
    X.require('damage', function(Damage) {
        var damage = X.AllocID();
        Damage.Create(damage, parseInt(process.argv[2]), Damage.ReportLevel.NonEmpty);
        X.on('event', function(ev) {
          Damage.Subtract(damage, 0, 0);
          console.log("window content changed!");
        });
    });
});