我只是想了解事件處理程序是如何稱爲X11的技術。 因此,在Linux/X11中,如果一個窗口註冊ASyncMode(即PointerMotion)中的事件,那麼X11如何調用該進程的事件處理程序?是如何事件處理程序調用(X11)
他們使用某種形式的中斷?
什麼令我感到困惑的是,我的過程中有沒有什麼是X11的事件輪詢。我甚至連接了gdb,並確認在場景下沒有任何線程可以由X11庫啓動。所以在我的知識中,這個實際上的工作方式肯定存在差距。
溢出來我!
我只是想了解事件處理程序是如何稱爲X11的技術。 因此,在Linux/X11中,如果一個窗口註冊ASyncMode(即PointerMotion)中的事件,那麼X11如何調用該進程的事件處理程序?是如何事件處理程序調用(X11)
他們使用某種形式的中斷?
什麼令我感到困惑的是,我的過程中有沒有什麼是X11的事件輪詢。我甚至連接了gdb,並確認在場景下沒有任何線程可以由X11庫啓動。所以在我的知識中,這個實際上的工作方式肯定存在差距。
溢出來我!
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);
});
});
謝謝Andrey,你是說沒有將程序執行轉移到事件處理程序的瘋狂機制?在我的應用程序(即XtMainLoop)中必須有一些針對X11事件進行輪詢? – rbhkamal
是的,您的代碼正好輪詢事件 –