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