我只是想理解X11中事件处理程序被调用的技术方法。在Linux/X11中,如果一个窗口以ASyncMode(即PointerMotion)注册事件,X11是如何调用该进程的事件处理程序的?
它们是否使用某种形式的中断?
令我困惑的是,我的进程没有任何东西正在轮询X11事件。 我甚至附加了gdb并验证了在场景下没有运行由X11库启动的线程。所以我对这实际上是如何工作存在一些知识上的空缺。
向我倾述吧!
我只是想理解X11中事件处理程序被调用的技术方法。在Linux/X11中,如果一个窗口以ASyncMode(即PointerMotion)注册事件,X11是如何调用该进程的事件处理程序的?
它们是否使用某种形式的中断?
令我困惑的是,我的进程没有任何东西正在轮询X11事件。 我甚至附加了gdb并验证了在场景下没有运行由X11库启动的线程。所以我对这实际上是如何工作存在一些知识上的空缺。
向我倾述吧!
while(1) {
XNextEvent(d, &e);
/* draw or redraw the window */
if(e.type==Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
}
/* exit on key press */
if(e.type==KeyPress)
break;
// Handle Windows Close Event
if(e.type==ClientMessage)
break;
}
XNextEvent
从套接字中消耗了32个字节的数据,并将其存储在 e
结构体中。而 while
循环中的代码根据应用程序逻辑、事件类型和有效负载进行调度。var x11 = require('x11');
var PointerMotion = x11.eventMask.PointerMotion;
x11.createClient(function(err, display) {
var X = display.client;
var root = display.screen[0].root;
var wid = X.AllocID();
X.CreateWindow(
wid, root,
0, 0, 400, 300,
0, 0, 0, 0,
{
eventMask: PointerMotion
}
);
X.MapWindow(wid);
X.on('event', function(ev) {
if (ev.name == 'PointerMotion')
{
console.log('Mouse motion!', [ev.x, ev.y]);
}
});
X.on('error', function(e) {
console.log(e);
});
});