gpt4 book ai didi

linux - 如何调用事件处理程序 (X11)

转载 作者:太空狗 更新时间:2023-10-29 12:32:19 25 4
gpt4 key购买 nike

我只是想了解在 X11 中如何调用事件处理程序的技术。那么在 Linux/X11 中,如果一个窗口在 ASyncMode 中注册事件(即 PointerMotion),X11 如何调用该进程的事件处理程序?

他们是否使用某种形式的中断?

让我感到困惑的是我的进程没有任何正在轮询 X11 事件的东西。我什至附加了 gdb 并验证了在场景下没有运行的线程可以由 X11 库启动。因此,我对这实际上是如何工作的知识一定存在差距。

淹没我!

最佳答案

X11 客户端使用 tcp 或 unix 套接字连接(通常是端口 6000 + 显示号用于 tcp 和 '/tmp/.X11-unix/X' + 显示号用于域套接字)进行通信。该协议(protocol)本身是双工的,您可以随时发送请求并接收回复、错误和事件。事件和错误始终是 32 字节长的数据包。

关于如何处理来自 X 服务器的传入数据,有多种策略。使用 xlib,在每个已知产生响应的请求之后,都会阻塞 read() 调用以读取那么多数据。在“空闲”期间,您应该 read all events and errors from connection manually :

   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 字节的数据从 socket 消耗到 e 结构中,while 循环中的代码根据应用程序逻辑分派(dispatch)它以及事件类型和负载。

在其他一些库中,例如 node-x11 (注意:我是作者)事件循环隐藏在框架异步 io 模型后面并隐式发生。

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);
});
});

关于linux - 如何调用事件处理程序 (X11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com