2016-10-26 10 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

이벤트는 하위 창용입니다. the Xlib Programming Manual에 따르면, "모든 자식 만들기 ... 이벤트를 생성합니다." 전형적인 X 응용 프로그램은 수많은 자식 창을 포함하고 있으며 각각의 창을보고 있습니다.

이벤트를 받으면 event.xcreatewindow.parent (XEventthe 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