2016-12-06 82 views
0

我來自Windows,其中WndProc內部可以找到與特定消息相關的窗口句柄。 我想知道這是否也可以用X11在事件的主循環中獲取X11窗口

while (!done) { 
    XNextEvent(dis, &xev); 

    if(xev.type == Expose) { 
     // I want to know what window is being exposed here 
    } 

    if (xev.type == KeyPress) { 
     // I want to know what window has received a key press here 
    } 
} 

我怎麼能實現呢?實在找不到到目前爲止

此外,在Win32的東西,你可以存儲對象的指針爲你創造代表你的窗口類,使用SetWindowLong,您可以在WndProc回調後得到的。有沒有辦法在X11的情況下存儲一個對象指針,以便在處理事件時以相同的方式檢索它?

回答

1

對於那些與X窗口相關的事件,它們的「重載」事件結構有一個Window參數。

XEvent是一個聯合,一個映射到一個結構中的消息特定結構的集合。因此,要使用適當的事件結構,請使用以下代碼:

if (xev.type == KeyPress) 
    { 
     Window w = xev.xkey.window; 
    } 
    if (xev.type == Expose) 
    { 
     Window w = xev.xexpose.window; 
    } 

Et cetera。每個事件結構只有它需要的參數。

我不知道X窗口的對象指針;但是,您可以使用std :: map來保存Window ID中的一個列表,該列表映射到指針,結構或類並全局跟蹤它。

0

您不需要檢索每個事件類型的窗口,你可以在你的事件循環的頂部使用

Window w = event.xany.window; 

,之前,你甚至發現它是一個什麼樣的事件。 您可以使用

XContext ClassID = XUniqueContext(); 

爲全局變量與XSaveContext功能使用。 然後你可以使用

XSaveContext(display, w, ClassID, (XPointer)myclass); 

存儲在X Window本身的類指針。所以,一旦你從事件窗口,你可以使用

XPointer return_class; 
XFindContext(display, w, &return_class); 
MyClass myclass = (MyClass *)return_class; 

等等...

檢索窗口類