【问题标题】:How are event handlers called (X11)如何调用事件处理程序 (X11)
【发布时间】:2014-04-17 11:32:30
【问题描述】:

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

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

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

溢出我!

【问题讨论】:

    标签: linux events event-handling x11


    【解决方案1】:

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

    关于如何处理来自 X 服务器的传入数据有多种策略。使用 xlib,在每个已知会产生响应的请求之后,都会阻塞 read() 调用来读取那么多数据。在“空闲”时间你应该readall 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;
       }
    

    在这个 sn-p 中,XNextEvent 将 32 字节的数据从套接字消耗到 e 结构中,while 循环中的代码根据应用逻辑和事件类型和有效负载调度它。

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

    【讨论】:

    • 谢谢安德烈,你是说没有将程序执行转移到事件处理程序的疯狂机制吗?我的应用程序(即 XtMainLoop)中必须有一些东西在轮询 X11 事件吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多