簡體   English   中英

如何調用事件處理程序(X11)

[英]How are event handlers called (X11)

我只是想了解X11中如何調用事件處理程序的技術。 因此,在Linux / X11中,如果窗口在ASyncMode(即PointerMotion)中注冊了事件,那么X11如何為該進程調用事件處理程序?

他們使用某種形式的中斷嗎?

讓我感到困惑的是,我的進程沒有任何輪詢X11事件的東西。 我什至附加了gdb並驗證了X11庫可能沒有在該場景下運行的線程。 因此,我對這實際上是如何工作的了解必須存在空白。

溢出我!

X11客戶端使用tcp或unix套接字連接(通常是端口6000 + tcp的顯示號和'/tmp/.X11-unix/X'+域套接字的顯示號)進行通信。 該協議本身是雙工的,您可以隨時發送請求,並且會收到答復,錯誤和事件。 事件和錯誤始終是32字節長的數據包。

關於如何處理來自X服務器的傳入數據,有多種策略。 使用xlib,在每個已知產生響應的請求之后,都會阻塞read()調用以讀取那么多數據。 在“空閑”時間內,您應該手動 讀取 連接中的所有事件和錯誤

   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循環中的代碼根據應用程序邏輯以及事件類型和有效負載來調度它。

在其他一些庫中,例如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);
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM