Académique Documents
Professionnel Documents
Culture Documents
Xlib : la communication
X-I
Communication
o o o o
ClientMessage PropertyNotify SelectionClear SelectionNotify SelectionRequest
Systme X
Xlib : la communication
Tout client peut envoyer un vnement une fentre, et tout client qui a slectionn le bon type dvnement peut le lire.
XSendEvent (dpy, voisine, propager, masque, e); Window voisine; Bool propager; Mask masque; XEvent * e;
o o o
La fentre voisine peut aussi tre PointerWindow ou InputFocus . Si propager est False, il ny a pas propagation depuis la fentre voisine. La requte est honore par le serveur (jouant le rle de facteur) en transmettant lvnement sans modification, sauf quil loblitre en mettant le champ send_event True.
o
Systme X
Xlib : la communication
Il existe un vnement spcialement conu pour servir des besoins particuliers de transmission dinformations entre clients : ClientMessage. Les donnes transmettre peuvent occuper jusqu 20 octets (ou leur quivalent dans dautrs types).
o
Un tel vnement nest pas masquable, et est gnralement envoy par SendEvent (le boolen send_event vaut alors True). Exemples : l Lutilitaire editres ddition de ressources utilise ce mcanisme; l Certaines mulations du systme Windows utilisent ces vnements pour simuler les messages.
Systme X
Xlib : la communication
X-I Atomes
o o o o
Pour communiquer, les clients X doivent disposer dun vocabulaire. Les vocables sont les atomes. Un atome est la reprsentation interne, par un entier long, dune chane de caractres. Chaque atome prdfini possde un nom symbolique (inclure Xatom.h). l Tous ces noms commencent par XA_. l Le nom symbolique se dduit simplement de la chane: XA_STRING correspond "STRING", XA_INTEGER correspond "INTEGER". Un client peut utiliser les atomes prdfinis ou dfinir lui-mme des atomes. Les atomes sont stocks dans le serveur. Les atomes prdfinis sont chargs au moment du lancement du serveur.
o o
Systme X
Xlib : la communication
X-I Exemples
o
Les changes entre gestionnaire de fentres et autres clients utilisent en particulier les atomes commenant par XA_WM_.
o
Le couper-coller ancienne manire utilise les 8 tampons XA_CUT_BUFFER0 jusqu XA_CUT_BUFFER7 . Ceci est utilis dans xterm ou emacs (les nouvelles versions sont jour).
o
Le couper-coller nouvelle manire utilise le mcanisme des slections via les atomes XA_PRIMARY et accessoirement XA_SECONDARY . Ceci est utilis dans les widgets de texte de Motif.
o
Systme X
Xlib : la communication
Lutilisation dun atome rserv permet deux clients dchanger des informations selon un code qui leur est propre. Mais, selon la philosophie X, il ny a pas de propritaire des atomes.
o
Une application qui veut utiliser un atome rserv le dfinit partir dune chane de caractres. Atom A; Bool ne_pas_creer; A = XInternAtom (dpy,"rubis",ne_pas_creer); La fonction XInternAtom vrifie si un atome de ce nom littral existe. l S'il existe, elle renvoie l'atome; l Sinon si ne_pas_creer est True, elle renvoie None, si ne_pas_creer est False, elle demande au serveur de crer l'atome et en renvoie le numro. La fonction XGetAtomName prend en argument un atome, et retourne la chane de caractres associe : nom = XGetAtomName(dpy, A) Il existe (depuis X11R6) des versions plurielles de ces fonctions : XInternAtoms et XGetAtomNames
Systme X
Xlib : la communication
X-I Proprits
o
Une proprit est un couple (nom, valeur) attach une fentre. l Le nom de la proprit est un atome; l La valeur est a priori quelconque, reprsente dans un format rudimentaire (une chane d'octets) l la proprit est dite dfinie pour la fentre. Une proprit a en outre l un type , qui est une indication sur la nature de la valeur associ l un format (8, 16, 32) qui informe sur la reprsentation des donnes.
fentre
WM_NAME x f o n t s e l WM_NORMAL_HINTS WM_SIZE_HINTS STRING
PRIMARY
STRING
Systme X
Xlib : la communication
Deux fentres peuvent avoir des proprits de mme nom et de valeur diffrentes.
o o o o
Les valeurs des proprits sont conserves sur le serveur. Tout client peut crer des proprits dans toute fentre et y crire. Tout client peut lire la valeur contenue dans une proprit, et la dtruire. Un client peut tre inform dun changement dans une proprit (par un vnement PropertyNotify).
Systme X
Xlib : la communication
Lchange entre clients se fait par des proprits ayant ces noms, attaches la fentre racine de lcran.
o o
Il existe des fonctions utilitaires pour accder aux tampons. Le mcanisme du couper-coller (ancienne manire) est implment comme suit : l le client A, lorsquil dcide de couper ou de copier (i. e. quand il a fini la slection), copie lobjet dans un tampon. l le client B, lorsquil dcide de coller, rcupre lobjet dans le tampon. Ce mcanisme est simple, mais pas trs souple: l La copie de A vers le serveur se fait doffice, et non la demande, do un possible encombrement du serveur pas des donnes qui ne servent pas; l Cette copie se fait dans le format connu de A, et non dans le format souhait par B, do une limitation des changes possibles. Avantage : les donnes copies sont conserves mme aprs la disparition ventuelle du client A.
o o 9
Systme X
Xlib : la communication
Copier dans le tampon 0: XStoreBytes(dpy, octets, nombre) char *octets; Le tableau doctets nest pas ncessairement termin par le caractre nul. Copier dans un tampon numero: XStoreBuffer(dpy, octets, nombre, numero) Rcuprer les donnes du tampon 0 : char *octets; octets = XFetchBytes(dpy, &nombre); ... XFree(octets); Retourne le nombre doctets dans nombre et alloue lui-mme la place ncessaire. Cest pourquoi elle doit tre libre ensuite.
o o
10
Systme X
Xlib : la communication
Les proprits ont des valeurs. l le format indique la reprsentation physique. Cest toujours une suite doctets (unsigned char ), mais compts en : 8 bits (octets) 16 bits (entiers courts) 32 bits (entiers longs). l le type dfinit le sens de la valeur. Pour certaines proprits prdfinies, il existe des utilitaires pour ranger des valeurs ou les rcuprer: XStoreName(dpy,fen,nom); XSetWMNormalSizeHints(dpy, fen, &xsh); Ceci suppose une conversion des donnes (par lutilitaire) selon un type convenu. Comment convenir de types entre clients ? En les nommant dans le vocabulaire commun, donc par des atomes !
11
Systme X
Xlib : la communication
Les proprits prdfinies ont des types prdfinis. l Le type ne donne aucune indication sur la manire de stocker les donnes sur le serveur (suite doctets) : cest le rle du format. l Il sert convenir de linterprtation des donnes brutes entre les clients. l Il est de la responsabilit des clients de fournir les donnes dans le format appropri. Pour limplmentation C de Xlib, il y a des correspondances naturelles entre les types dcrits dans lICCCM et les structures C. Exemples de conventions de correspondance, et formats:
16 32 32 32 16 ou 32 8 32
12
Systme X
Xlib : la communication
XChangeProperty(Display* dpy, Atom prop, Atom t, int format , int mode, unsigned char* donnees, int taille );
Window fen, /* nom de la proprit /* type de la proprit /* 8, 16 ou 32 /* substituer ou ajouter /* data /* nombre dlments
*/ */ */ */ */ */
Exemples
XChangeProperty(dpy, fen, A, XA_STRING, 8, PropModeReplace, "Hello!", 1+strlen("Hello!"); XArc a = {0, 0, 100, 200, 0, 23040}; XChangeProperty(dpy, fen, B, XA_ARC, 16, PropModePrePend, (unsigned char *) &a, 6);
13
Systme X
Xlib : la communication
X-I
o o o
Format : l Les donnes sont stockes, dans le serveur, de manire non structure. l Trois formats sont possibles : 8 bits, 16 bits et 32 bits. l Les conventions pour les types prdfinis doivent tre respectes pour permettre une lecture conforme. Il y a conversion de type obligatoire des donnes unsigned char *. La taille est le nombre d'lments dans le tableau de donnes. Le mode peut tre PropModePrePend PropModeAppend PropModeReplace On ne peut pas mlanger les types ou formats dans une proprit: si lon ajoute des donnes, elles doivent tre du mme type et format que celles dj prsentes. Exemple : une fonction CopierTexte(dpy, texte) qui copie texte dans le cut-buffer 0, scrit : XChangeProperty(dpy, DefaultRootWindow(dpy), XA_CUT_BUFFER0, XA_STRING, PropModeReplace, texte, 1+strlen(texte));
14
Systme X
Xlib : la communication
La fonction de rcupration est complexe car l elle permet dextraire une partie seulement de la valeur l elle rend aussi la valeur de ce qui reste l elle permet de supprimer la proprit aprs lecture
int XGetWindowProperty(Display * dpy, Window fen, Atom prop, /* le nom de la propriete */ long decalage, /* indice de debut de lecture */ long longueur, /* nombre dentites a lire */ Bool supprimer_prop_apres_lecture, Atom type_souhaite, Atom* type_effectif, int* format_effectif, unsigned long* nb_octets_lus, unsigned long* nb_octets_restants, unsigned char** donnees_retournees);
15
Systme X
Xlib : la communication
X-I
XGetWindowProperty(dpy, fen, prop, decalage, longueur, supprimer?, type_souhaite, &quel_type, &quel_format, &lus, &restants, &donnees);
Exemple:
Atom quel_type; int quel_format, lus, restants; char * donnees; XGetWindowProperty(dpy,fen,prop,0,8192,False,AnyPropertyType, &quel_type, &quel_format, &lus, &restants, &donnees);
La fonction de rcupration permet d'tre vague sur le type : AnyPropertyType convient. On rcupre en fait une tranche dau plus longueur*quel_format/8 octets. La suppression de la proprit provoque un vnement PropertyNotify pour la fentre fen.
o o
donnees est un pointeur vers les donnes retournes. Xlib alloue lui-mme la place ncessaire + un octet contenant NULL. Cet octet nest pas compt dans la taille du rsultat. Ne pas oublier de librer la place (XFree) aprs utilisation.
16
Systme X
Xlib : la communication
X-I Exemple
o
Une fonction CollerTexte(dpy, &texte) qui rcupre le texte dans le cut-buffer0 a la forme :
CollerTexte(dpy, &texte) { Atom quel_type; int quel_format, lus, restants; XGetWindowProperty(dpy,DefaultRootWindow(dpy), XA_CUT_BUFFER0,0,8192,False,AnyPropertyType, &quel_type, &quel_format, &lus, &restants, &texte);
17
Systme X
Xlib : la communication
Tout transfert entre clients doit passer par le serveur, car on ne peut supposer que les clients sont susceptibles de communiquer directement.
o
Les slections constituent le mcanisme principal recommand par X pour lchange de donnes entre clients.
o
Aspects spcifiques: l il ny a pas de stockage intermdiaire dans un lieu public comme dans les cut buffer, mais dans une proprit dune fentre du demandeur (destinataire); l le format des donnes transfres est prcis par le destinataire, et cest lexpditeur qui essaie de sy conformer. La slection : l a un nom : un atome qui peut tre prdfini ou convenu, le plus souvent XA_PRIMARY . l a un propritaire : un client qui est aussi lexpditeur, sur demande, l est attache une fentre, frquemment la fentre racine. La communication a lieu entre le propritaire dune donne et un demandeur qui veut lobtenir.
18
Systme X
Xlib : la communication
Un client annonce (au serveur) quil dtient des informations en se rendant propritaire de la slection: SetSelectionOwner[PRIMARY] Le demandeur formule sa demande (au serveur), en indiquant o et comment (dans quelle proprit de quelle fentre, et sous quelle forme) il veut obtenir les informations: ConvertSelection[PRIMARY, o-et-comment] Le propritaire est inform de cette demande par le serveur; il essaie de faire le transfert : ChangeProperty[o-et-comment] puis informe le demandeur (via le serveur) du succs ou de lchec par SendEvent[o] Le demandeur, inform (via le serveur) du message du propritaire, rcupre ses donnes et dtruit la proprit.
o
Le propritaire est inform de la destruction et sait ainsi que tout sest bien pass...
19
Systme X
Xlib : la communication
Demandeur
Serveur
Propritaire
20
Systme X
Xlib : la communication
X-I
Le propritaire
Que le propritaire se fasse connatre ! Il transmet au serveur des informations qui permettent de lidentifier : l un atome de slection : latome XA_PRIMARY est recommand (ICCCM!) pour des changes entre clients qui ne se connaissent pas; l une fentre de rendez-vous : cette fentre permet de vrifier que le serveur q bien enregistr la requte; l le moment partir duquel lacte est prendre en compte. La syntaxe est XSetSelectionOwner(Display* dpy, Atom atomS, /* atome de selection*/ Window fenP, /* fenetre de rendez-vous */ Time dateP); /* date de prise deffet */ Par exemple : XSetSelectionOwner(dpy, XA_PRIMARY, fenP, CurrentTime); Pour connatre le propritaire de la slection, on le demande au serveur : fen = XGetSelectionOwner(dpy, XA_PRIMARY); l on reoit le nom de la fentre de rendez-vous (car les clients nont pas de nom!) l cette connaissance nest pas requise pour lchange; en revanche, cette primitive permet au propritaire de vrifier (par fen==fenP) que le serveur a enregistr la requte.
21
Systme X
Xlib : la communication
Si un nouveau propritaire (un autre client X) se dclare pour une slection, lancien propritaire perd ses droits (N.B. il y a un seule propritaire par atome de slection).
o
Lancien propritaire reoit un avis, sous forme dun vnement SelectionClear (que lon slectionne par PropertyChangeMask).
typedef struct { int type; unsigned long serial; Bool send_event; Display *display; Window window; Atom selection; Time time; } XSelectionClearEvent ;
Si le mme propritaire change seulement de fentre de rendez-vous, il ne reoit pas cet vnement. Il est donc utile, dans les applications, de mmoriser si lon est toujours propritaire.
22
Systme X
Xlib : la communication
Que le demandeur formule sa demande ! Il indique o (dans quelle fentre, sous quelle proprit) et comment (dans quel type) il veut les obtenir : XConvertSelection(Display* dpy, Atom atomS, /* atome de slection */ Atom typeD, /* type cible (target) */ Atom propD, /* proprit du demandeur */ Window fenD, /* fentre cible */ Time dateD); /* heure de la demande */ l typeD est latome dnotant le type cible (target) dans lequel le destinataire veut recevoir les donnes; l propD est le nom (atome) de la proprit dans laquelle il convient de stocker les donnes; l fenD est la fentre laquelle est attache la proprit; l dateD est le moment partir duquel la demande est valable. Exemple : XConvertSelection(dpy, XA_PRIMARY, XA_STRING, propD, fenD, CurrentTime);
23
Systme X
Xlib : la communication
X-I
Window owner Window requestor Atom selection Atom target Atom property
= = = = =
rendez-vous propritaire fentre du demandeur atome de slection type cible du demandeur proprit du demandeur
Rcapitulons
o
Les acteurs du mcanisme de slection sont : l latome de slection : le plus souvent XA_PRIMARY l la fentre du propritaire : sert identifier indirectement le propritaire l la fentre du demandeur : lieu ultime de dpt des donnes l la proprit du demandeur : nom sous lequel seront dposes les donnes l le type cilbe : forme sous laquelle les donnes seront dposes Dans lchange de chanes de caractres pour un copier-coller simple, on choisit : l owner = requestor = DefaultRootWindow(dpy) l selection = target = XA_PRIMARY l target = XA_STRING
24
Systme X
Xlib : la communication
X-I
o
Il connat le propritaire, et lui envoie un vnement SelectionRequest. En cas de problme (par exemple parce que le propritaire a entre temps disparu), on passe ltape suivante. Le propritaire reoit donc, sil a choisi PropertyChangeMask sur une fentre, les informatios requises pour l transformer les donnes dans le type cible; l les transfrer dans la proprit demande de la fentre demande; l dinformer le serveur du succs ou de lchec
typedef struct { int type; unsigned long serial; Bool send_event; Display *display; Window owner; Window requestor; Atom selection; Atom target; Atom property; Time time; } XSelectionRequestEvent;
25
Systme X
Xlib : la communication
Le propritaire essaie dhonorer la demande : l en transformant ventuellement les donnes; l en chargeant ces donnes dans la proprit propD, dans le format associ au type typeD.
26
Systme X
Xlib : la communication
X-I
o
Le propritaire informe le serveur (qui rpercute linformation au demandeur) du rsultat par un SendEvent dun vnement SelectionNotify.
typedef struct { int type; Bool send_event; Window requestor; Atom selection; Atom target; Atom property;/* ATOM or None */ Time time; } XSelectionEvent;
Exemple
XEvent sn; sn.type = SelectionNotify; sn.xselection.requestor = evmt.xselectionrequest.requestor; sn.xselection.selection = evmt.xselectionrequest.selection; sn.xselection.target = evmt.xselectionrequest.target; sn.xselection.time = evmt.xselectionrequest.time;
sinon
sn.xselection.property = None;
Envoi par :
XSendEvent (dpy, sn.xselection.requestor, False, 0, &sn);
Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle 27
Systme X
Xlib : la communication
Le demandeur est inform, par le serveur, de laccomplissement de sa demande: l il rcupre ses donnes, l libre la place, l dtruit ventuellement la proprit (ce qui informe le propritaire).
switch(evmt.type) { case SelectionNotify : if (evmt.xselection.selection == atomS) { if (evmt.xselection.property == None); /* cest rat */ else { XGetWindowProperty(dpy, fenD, XA_STRING, 0, 8192, False, propD, &quel_type, &quel_format, &lus, &restants, &donnees); ... XFree(donnees); XDeleteProperty(dpy, fenD, propD); } break;
28