2016-10-26 2 views
0

j'ai écrit le code suivant pour détecter lorsqu'une fenêtre est créée sur l'écran par une autre application (et non par mon code): cependant,événement createNotify appelé trop souvent

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"); 
} 

Le code fonctionne essentiellement, je remarquai que , quand je démarre une application (par exemple terminal) l'événement CreateNotify semble être tiré plusieurs fois. Quelqu'un peut-il expliquer pourquoi? Je me serais attendu à ce que CreateNotify ne soit tiré une fois pour chaque application/fenêtre démarrée. Comment dois-je modifier le code pour y parvenir?

Répondre

0

Les événements concernent les fenêtres enfants. Par the Xlib Programming Manual, "Créer des enfants ... génère un événement". Une application X typique comprend de nombreuses fenêtres enfants, et vous voyez chacun d'eux.

Lorsque vous obtenez l'événement, vérifiez event.xcreatewindow.parent (XEvent est une union par the reference). Si c'est win, la fenêtre racine, vous avez une fenêtre de niveau supérieur. Sinon, vous avez une fenêtre enfant. Essayez:

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

merci pour votre suggestion. essayé mais il semble que 'event' n'a pas de membre appelé' parent': '' XEvent {aka union _XEvent} 'n'a pas de membre nommé' parent'' – Moonlit

+0

@Moonlit Désolé - j'ai oublié le membre du syndicat. Fixé. – cxw

+0

ah ok, merci je suis maintenant compilable, mais malheureusement, le comportement est le même. – Moonlit