Bonjour,
je m'initie depuis quelques temps à la programmation X11 et je me demandais à quoi servait les atomes? Est ce que quelqu'un peut me donner un exemple d'utilisation?
![]()
Bonjour,
je m'initie depuis quelques temps à la programmation X11 et je me demandais à quoi servait les atomes? Est ce que quelqu'un peut me donner un exemple d'utilisation?
![]()
excuse-moi j'étais pris ces derniers jours
Les Atom sont la manière X11 de communiquer avec le WM (ou d'autres applis) pour des prorpriétés relativement permanentes.
Si tu as le bouquin de base de X11 (Gettys, Scheifler, et Newman), c'est bien expliqué.
En bref, tu peux t'en servir pour :
- spécifier les paramètres de démarrage (state (iconique, minimisée, maximisée), taille par défaut, etc etc)
- modifier ces paramètres par programme
- spécifier dynamiquement une action générale du WM (par exemple l'action à prendre sur l'activation du bouton Close (ou maximize ou Minimize) de la fenêtre gérée par le WM, action qui normalement ne passe pas par ton appli mais est interceptée par le WM).
- communiquer des infos, des blocs, etc entre différentes applis (mécanisme équivalent au copy/paste). Dans mon cours je faisais un exercice en faisant créer un programme comme xtalk, où les phrases du dialogue étaient écrites via des Atom.
Voici un petit exemple pour remplacer le close :
(ici on suppose que MainShell est une sauvegarde statique de l'Application Shell, mais on peut s'en passer, comme tu vois avec le code dessous)
Ici, dans ce cas, pour tout Shell ou fenêtre dépendante de l'application, on va ajouter à la fermeture de la fenêtre la callback précisée en entrée, et de même éventuellement des callbacks générales définies pour la fenêtre principale (sauf la fermeture globale).. Une routine simple s'arrêterait juste avant le test de Main_Shell.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 void SetWMCloseCallback( Widget shell, XtCallbackProc callback, XtPointer client_data ) { Atom wma ; XtCallbackList cblist ; int i, l0 ; wma = XInternAtom(XtDisplay(shell), "WM_DELETE_WINDOW", False); if ( (callback != (XtCallbackProc)NULL) && (wma != None) ) XmAddWMProtocolCallback(shell, wma, callback, client_data); /* --- First gets access to the general close callback */ if ( Main_Shell == (Widget)NULL ) return ; XtVaGetValues (Main_Shell, XmNdeleteResponse, &cblist, NULL ); if ( (cblist != (XtCallbackList)NULL) && ( #ifndef LINUX (unsigned char) #endif cblist != XmDESTROY) ) { l0 = 0 ; for ( ; ; ) if ( cblist[l0++].callback == (XtCallbackProc)NULL ) break ; if ( l0 != 0 ) for ( i = 0 ; i < l0 ; i++ ) XmAddWMProtocolCallback(shell, wma, (XtCallbackProc)cblist[i].callback, (XtPointer)cblist[i].closure); } }
Voilà le petit extrait de mon cours portant sur ceci :
J'ai le programme permettant l'échange (style xtalk) via Atom, mais tu peux t'y essayer toi-même...Il peut être très utile de communiquer entre deux applications, et de s’envoyer des messages.
Une méthode courante est le principe du « Cut and Paste ». Des méthodes sont fournies par la Xlib pour cette fonctionalité. Elles font cependant parties d’un ensemble plus vaste de fonctions et de paramètres, destinés de manière plus générale à la communication inter-client.
C’est d’ailleurs grâce à ces méthodes que le serveur communique avec les applications X.
Certains emplacements physiques, situés sur le serveur, contiennent les informations qui relient le serveur aux applications. Ces emplacements sont déterminés, et portent le nom Atom . Ces Atom sont identifiés par un nom, qui est le moyen de les repérer à partir de n’importe quelle application. On pourraient considérer ces Atom comme des sockets : ce sont des canaux où les clients ou le serveur envoie des messages. Et l’un ou l’autre peuvent être à l’écoute des changements qui y arrivent.
Les Atom physiquement présents sur le serveur sont ceux servant à la communication entre le serveur et ses clients. Ils définissent par exemple la table de couleurs par défaut, la police de caractère par défaut, ....
Mais la Xlib fourni un mécanisme afin qu’une application puisse elle-même se créer un Atom. Et dans ce cas, si deux applications « écoutent » le même Atom, elles peuvent se synchroniser ou se partager des données.
En résumé, il y a quatre (4) manières de communiquer entre clients :
a) envoyer un message spécifique à une application spécifique (XSendEvent avec un événement du type ClientMessage) ;
b) utiliser les buffers « Cut » et « Paste » fournis par la Xlib ;
c) utiliser le mécanisme dit de sélection (qui envoie un XSelectionEvent au serveur), qui est en fait la généralisation du « Cut » et « Paste » ;
d) enfin on peut utiliser directement les Atom.
J'ajoute qu'au niveau du fonctionnement, l'application commence par enregistrer un nom de propriété, quel qu'il soit, sous la forme d'une chaîne de caractère. Le serveur X en prend note de manière permanente et envoie en retour un numéro qui la référence. Ce numéro reste valide pendant toute la durée de fonctionnement du serveur. Les autres applications demandant par la suite à référencer la même chaîne se voient retourner le même numéro.
C'est pratique parce que ça permet de faire quelque chose qui soit portable sans avoir à retransmettre à chaque appel la chaîne entière. Ça se fait beaucoup dans les bases de données aussi, notamment avec les OID. Comme la taille de ta chaîne n'a virtuellement pas de limite (je ne sais pas si la norme en fixe une ou pas), les chances de collision sont faibles.
Si tu veux voir, depuis le Shell, quels sont les atomes actuellement déclarés sur ton serveur X, tu peux utiliser la commande xlsatoms.
Pas tout à fait, puisque cela n'est valable que pour les atomes que toi (ton appli) veut créer.
Les autres (ceux par défaut, les propriétés comme mentionnées ci-dessus) sont déjà dans la "base" (ou plutôt le cache) du serveur.
Une chose très importante que tu as bien fait de mentionner est que cela reste valide toute la durée du serveur X, c'est-à-dire y compris quand on termine l'application et qu'on la relance plus tard.
C'est également vrai pour tous les objets du type Pixmap, qui sont conservés par le serveur d'un lancement à l'autre, sauf si avant de sortir on avait effectué un XFreePixmap.. Et cela peut par conséquent être très utile que ce soit en augmentant la vitesse de démarrage ou d'affichage..
NB:
Vu que le protocole X11 est "internet-transparent", ce mécanisme des atomes est , si l'on sait que l'on a affaire à des applications X des 2 côtés, extrêmement plus simple à manipuler que des sockets pour une communication inter-applications (par exemple le COPY/PASTE pourrait se faire entre machines).
Mais globalement cela sert principalement pour une communication avec le WM, et un peu moins souvent pour une communication inter-process, sur la même machine..
NB2 : peut-être cela aurait-il plus sa place dans un des forums Linux ? General développement -> Programmtion Linux ou Linux
PPS : j'avais pas vu que ça avait été déplacé![]()
Bah, en tt cas merci pour vos réponses meme si je n'ai pas tout compris d'un seul coup.
J'ai posé la meme question à mon prof et il m'a répondu :
c'est l'équivalent d'une variable globale.![]()
![]()
Ni +, ni -. J'espere qu'il n'est pas sur le forum de dvp??????
En passant, Souviron, connaitrais tu des sites (english or french) qui proposent des tuto sur X11?
Pose des questions supplémentaires si tu as besoin..
Disons que l'exemple ci-dessus peut être simplifié au maximum. Je veux permettre de rajouter une fonction de mon programme (my_exit) à toutes mes fenêtres, qui sera appelée chaque fois qu'on clique sur le bouton "fermeture fenêtre" (la croix rouge sous Windows).(là je me sers de la XToolkit (notions de Widget))
Je fabrique une routine :
Admettons que j'ai défini une structure globale qui contient mes paramètres principaux, et que ma routine de sortie soit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void SetWMCloseCallback( Widget shell, void callback, void *client_data ) { Atom wma ; wma = XInternAtom(XtDisplay(shell), "WM_DELETE_WINDOW", False); if ( wma != None ) XmAddWMProtocolCallback(shell, wma, (XtCllbackProc)callback, (XtPointer)client_data); }
NB: l'API de la fonction ici est l'API générale d'une callback dans la XToolKit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 typedef pMaStruct { .... } MaStruct ; .... void My_Exit ( Widget W, void *cbstruct, void *clientdata ) { MaStruct *ptrMaStruct = (MaStruct *)clientdata ; /* Ce que je veux faire avant de sortir (liberer des tableaux statiques, fermer une connexion, etc etc etc) */ ... }
Alors, dans mon code de fenêtres, à chaque fois que je vais créer une fenêtre ou une sous-fenêtre indépendante (avec les boutons du WM et non pas une fenêtre "modale"), je rajoute dès après l'avoir créée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void MaRoutineCreationFenetre(void) { MaStruct MesData ; .... /* ici je cree la fenetre */ .... SetWMCloseCallback( MonWidgetFenetre, My_Exit, (void *)&MesData ); }
Note : Je pourrais éventuellement mettre le code pour le "xtalk" un peu plus tard... Lui il est en X pur (sans Widgets).
Disons que cela peut être valable comme analogie si l'on parle du serveur X, et que l'on explique que les clients X partagent une zone de données entre elles grâce au serveur..
Mais comme ce n'est sûrement pas ce qu'il a voulu dire... no comment..
Disons que la Bible est le bouquin de Scheifler, Gettys, et Newman (les auteurs originaux, délégués par DEC, Sun, HP, IBM, et le MIT) (rien que ça). Il est clair, bien expliqué, et parfait. Table des matières parfaite. Par contre, aucun exemple.
Ensuite le O'Reilly : moins clair, table des matières beaucoup plus mélangée et moins logique. Par contre, possède des exemples.
De plus, il est bon d'avoir le O'Reilly sur la XToolKit.
Pour les sites, je ne connais pas trop, mais je suppose que le XFree86.org doit avoir de bonnes références.
Pour les tutos, je pourrais en extraire un de mon cours, mais je ne l'ai pas fait. Pas eu le temps. Pour d'autres, je n'en connais pas..
Pour les cours, j'en ai un
Je peux le faire (je fais un prix de groupe) ou le vendre (papier ou fichier)
ça dépend où tu es, ou .. voilà, quoi..
Si intéressé, envoie-moi un MP.
Maintenant, sur certains sujets, je peux mettre des exemples ou astuces. A ce compte-là, c'est mieux de poster les questions sur le forum, comme celle que tu as posée ici.
Pour une aide sur un gros projet, contacte-moi par MP.
PS: je m'excuse, mais c'est un peu mon gagne-pain![]()
voilà, j'ai rajouté l'exemple de xchat dans la rubrique contribuez
[x11-c]équivalent xchat : exemple communication interclients
Partager