2016-10-26 5 views
0

я написал следующий код, чтобы определить, когда окно создается на экране с помощью другого приложения (не мой код):createNotify событие называется слишком часто

Display* display = XOpenDisplay(":0"); 
XSetWindowAttributes attributes; 
attributes.event_mask = SubstructureNotifyMask | StructureNotifyMask; 
Window win = XDefaultRootWindow(display); 
XChangeWindowAttributes(display, win, CWEventMask, &attributes); 

while (1) { 
    XEvent event; 
    XNextEvent(display, &event); 
    if (event.type == CreateNotify) 
     puts("create Notify event occured\n"); 
} 

Код в основном работает, однако, я заметил, что , когда я запускаю приложение (например, терминал), событие CreateNotify, похоже, срабатывает несколько раз. Может ли кто-нибудь объяснить, почему? Я бы ожидал, что CreateNotify будет уволен только для каждого запускаемого приложения/окна. Как мне изменить код для этого?

ответ

0

Мероприятия для детских окон. Per the Xlib Programming Manual, «Создание любых детей ... генерирует событие». Типичное приложение X включает в себя множество дочерних окон, и вы видите каждый из них.

Когда вы получите мероприятие, отметьте event.xcreatewindow.parent (XEvent является союзом за the reference). Если это win, корневое окно, у вас есть окно верхнего уровня. В противном случае у вас есть дочернее окно. Попытка:

if ((event.type == CreateNotify) && (event.xcreatewindow.parent == win)) 
    puts("top-level create Notify event occured\n"); 
+0

Благодарим вас за предложение. попробовал, но кажется, что 'event' не имеет члена, называемого' parent': '' XEvent {aka union _XEvent} 'не имеет члена с именем' parent'' – Moonlit

+0

@Moonlit Извините - забыли член профсоюза. Исправлена. – cxw

+0

ах ок, спасибо, я теперь компилируюсь, но, к сожалению, поведение такое же. – Moonlit

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