Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm

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. wink
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

Fabounet a écrit :

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. hmm
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