2016-12-06 6 views
0

Я пришел из Windows, где внутри WndProc вы можете узнать, какой обработчик окон связан с определенным сообщением. Я хочу знать, если это возможно с X11Получить X11 Window внутри основного цикла для события

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, чтобы сохранить список из идентификатора окна, который сопоставляется с указателем, структурой или классом и отслеживать его по всему миру.

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; 

и так далее ...

 Смежные вопросы

  • Нет связанных вопросов^_^