[英]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.