2014-04-16 66 views
1

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

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

什麼令我感到困惑的是,我的過程中有沒有什麼是X11的事件輪詢。我甚至連接了gdb,並確認在場景下沒有任何線程可以由X11庫啓動。所以在我的知識中,這個實際上的工作方式肯定存在差距。

溢出來我!

回答

1

X11客戶端使用TCP或用於通信Unix套接字連接(TCP通常端口6000 +顯示數量和用於域套接字「/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; 
    } 

在該片斷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); 
    }); 
}); 
+0

謝謝Andrey,你是說沒有將程序執行轉移到事件處理程序的瘋狂機制?在我的應用程序(即XtMainLoop)中必須有一些針對X11事件進行輪詢? – rbhkamal

+0

是的,您的代碼正好輪詢事件 –

相關問題