#1 Le 15/07/2007, à 21:34
- Fabounet
[Résolu]Agir sur une fenêtre avec Xlib
Bonsoir !
j'aimerais pouvoir fermer une appli à partir d'une autre. Seulement voilà, le gestionnaire de fenêtre me met des bâtons dans les roues, il ne laisse pas passer les XKillClient
Après qques recherches, j'ai lu qu'il fallait envoyer un message de type _NET_CLOSE_WINDOW à la root window, et que c'est le gestionnaire de fenêtre qui en l'interceptant va provoquer la fermeture de ma fenêtre.
Mais en essayant cette méthode, rien ne se passe
Voici mon code, avec une Window Xid en entrée :
XEvent xClientMessage;
xClientMessage.xclient.type = ClientMessage;
xClientMessage.xclient.serial = 0;
xClientMessage.xclient.send_event = True;
xClientMessage.xclient.display = g_XDisplay;
xClientMessage.xclient.window = Xid;
xClientMessage.xclient.message_type = XInternAtom (g_XDisplay, "_NET_CLOSE_WINDOW", False);
xClientMessage.xclient.format = 32;
xClientMessage.xclient.data.l[0] = GDK_CURRENT_TIME;
xClientMessage.xclient.data.l[1] = 2; // 0 ou 1 => idem.
xClientMessage.xclient.data.l[2] = 0;
xClientMessage.xclient.data.l[3] = 0;
xClientMessage.xclient.data.l[4] = 0;
Window root = DefaultRootWindow (g_XDisplay);
XSendEvent (g_XDisplay,
root,
False,
SubstructureRedirectMask | SubstructureNotifyMask,
&xClientMessage);
Merci de votre aide, car là je suis coincé !
[edit]: petite précision : je suis sous Gnome, avec Metacity ou Beryl.
[edit] en fait ça marche, mais il y'a un décalage dans les ordres, le 1er n'est pas pris en compte. un vrai casse-tete !
Dernière modification par Fabounet (Le 17/07/2007, à 07:20)
"Quiconque est prêt à sacrifier sa liberté pour une sécurité provisoire ne mérite ni l'un ni l'autre." (Benjamin Franklin)
>> Changez le look de votre bureau, essayez Glx-Dock ! [http://glx-dock.org] <<
Hors ligne
#2 Le 16/07/2007, à 12:25
- Fabounet
Re : [Résolu]Agir sur une fenêtre avec Xlib
petit up.
je crois qu'il s'agit d'un problème de timestamp, ça dit quelque chose à quelqu'un ?
"Quiconque est prêt à sacrifier sa liberté pour une sécurité provisoire ne mérite ni l'un ni l'autre." (Benjamin Franklin)
>> Changez le look de votre bureau, essayez Glx-Dock ! [http://glx-dock.org] <<
Hors ligne
#3 Le 16/07/2007, à 12:59
- Link31
Re : [Résolu]Agir sur une fenêtre avec Xlib
Bonsoir !
j'aimerais pouvoir fermer une appli à partir d'une autre.
kill PID
edit : enfin, plutôt
char strpid[5];
char command[10] = "kill ";
int pid = /* PID du programme à fermer */;
snprintf(strpid,5,"%d",pid);
system(strcat(command, strpid));
Je n'avais pas vu que c'était en C.
Dernière modification par Link31 (Le 16/07/2007, à 13:13)
Hors ligne
#4 Le 16/07/2007, à 22:47
- Fabounet
Re : [Résolu]Agir sur une fenêtre avec Xlib
merci pour ta réponse, mais le problème c'est que je ne veux pas seulement tuer l'appli.
par exemple je voudrais pouvoir la faire apparaitre.
Mais le message que j'envoie à X ne s'effectue pas tout de suite, mais seulement après le message suivant, ce qui crée un décalage dans les ordres.
je ne vois pas du tout d'où ça peut bien venir.
"Quiconque est prêt à sacrifier sa liberté pour une sécurité provisoire ne mérite ni l'un ni l'autre." (Benjamin Franklin)
>> Changez le look de votre bureau, essayez Glx-Dock ! [http://glx-dock.org] <<
Hors ligne
#5 Le 17/07/2007, à 07:18
- Fabounet
Re : [Résolu]Agir sur une fenêtre avec Xlib
c'est bon j'ai trouvé ! l'ordre est exécuté lorsque l'heure de la fenêtre à changer est mise à jour, avec la valeur de l'heure de la root window.
c'est tout bon.
"Quiconque est prêt à sacrifier sa liberté pour une sécurité provisoire ne mérite ni l'un ni l'autre." (Benjamin Franklin)
>> Changez le look de votre bureau, essayez Glx-Dock ! [http://glx-dock.org] <<
Hors ligne