Vous êtes sur la page 1sur 28

Systme X

Xlib : la communication

X-I

Communication
o o o o
ClientMessage PropertyNotify SelectionClear SelectionNotify SelectionRequest

Envoyer des vnements Atomes Proprits Les tampons du couper-coller


o o

Gestion des proprits Slections

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Envoyer des vnements


o

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

Exemple : faire suivre, la fentre voisine,un vnement KeyPress :


switch (evmt.type) {... case KeyPress : XSendEvent(dpy, voisine, True, KeyPressMask, &evmt); break; }

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Les messages clients


typedef union { o ... XClientMessageEvent xclient; ... } XEvent; o typedef struct { int type; unsigned long serial; Bool send_event; Display *display; Window window; Atom message_type; int format; union { char b[20]; short s[10]; long l[5]; } data; } XClientMessageEvent; o

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.

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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

Quelques atomes prdfinis, et leurs noms symboliques


#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define XA_PRIMARY ((Atom) 1) XA_SECONDARY ((Atom) 2) XA_ARC ((Atom) 3) XA_ATOM ((Atom) 4) XA_CARDINAL ((Atom) 6) XA_CUT_BUFFER0 ((Atom) 9) XA_CUT_BUFFER7 ((Atom) 16) XA_DRAWABLE ((Atom) 17) XA_FONT ((Atom) 18) XA_INTEGER ((Atom) 19) XA_PIXMAP ((Atom) 20) XA_POINT ((Atom) 21) XA_RECTANGLE ((Atom) 22) XA_RESOURCE_MANAGER ((Atom) 23) XA_RGB_BLUE_MAP ((Atom) 26) XA_RGB_RED_MAP ((Atom) 30) XA_STRING ((Atom) 31) XA_WINDOW ((Atom) 33) XA_WM_HINTS ((Atom) 35) XA_WM_TRANSIENT_FOR ((Atom) 68)

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

Motif utilise aussi XA_CLIPBOARD ( ne pas confondre avec lutilitaire xclipboard).


o

Un utilitaire de conversion entre les deux couper-coller existe (xcutsel)

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Cration d'atomes


o

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Proprits des proprits

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Exemple de proprits : les tampons du copier-coller


o

X prdfinit 8 atomes de tampons, de nom XA_CUT_BUFFER0,..., XA_CUT_BUFFER7 utiliss pour le couper-coller.


o

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Pour copier et coller


o

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

Rcuprer les donnes du tampon numero : octets = XFetchBuffer(dpy, &nombre, numero);

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

10

Systme X

Xlib : la communication

X-I Proprits : formats et types


o

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 !

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

11

Systme X

Xlib : la communication

X-I Exemples de types et formats


o

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:

XA_ARC XA_ATOM XA_DRAWABLE XA_FONT XA_INTEGER XA_STRING XA_WM_SIZE_HINTS

XArc Atom Drawable Font int char * XSizeHints

16 32 32 32 16 ou 32 8 32

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

12

Systme X

Xlib : la communication

X-I Manipuler des proprits

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

13

Systme X

Xlib : la communication

X-I

XChangeProperty(dpy, fen, prop, t, format, mode, donnees, taille)

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

14

Systme X

Xlib : la communication

X-I Rcuprer les valeurs


o

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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.

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

17

Systme X

Xlib : la communication

X-I Le mcanisme des slections


o

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.

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

18

Systme X

Xlib : la communication

X-I Principe du dialogue


o

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

19

Systme X

Xlib : la communication

X-I Etapes du dialogue

XConvertSelection SelectionRequest XChangeProperty XSelectionNotify XSendEvent

XGetWindowProperty (rponse) XDeleteProperty PropertyNotify

Demandeur

Serveur

Propritaire

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

Systme X

Xlib : la communication

X-I Changement de propritaire

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.

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

22

Systme X

Xlib : la communication

X-I Formuler la demande


o

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

23

Systme X

Xlib : la communication

X-I

Window owner Window requestor Atom selection Atom target Atom property

= = = = =

fenP : fenD : atomS: typeD: propD:

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

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

24

Systme X

Xlib : la communication

X-I
o

Le Serveur (ici facteur)


Le serveur reoit la requte du demandeur, par exemple:
XConvertSelection(dpy, XA_PRIMARY, XA_STRING, propD, fenD, CurrentTime);
o 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;

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

25

Systme X

Xlib : la communication

X-I Au propritaire de jouer


o

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.

Exemple : on suppose typeD = XA_STRING, donc le format est 8 :


switch (evmt.type) case SelectionRequest : if (evmt.xselectionrequest.selection == propD && evmt.xselectionrequest.target == XA_STRING) XChangeProperty(dpy, evmt.xselectionrequest.requestor, evmt.xselectionrequest.property, XA_STRING, 8, PropModeReplace, donnees, 1+strlen(donnee));

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

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;

si le propritaire sait transformer, alors


sn.xselection.property = evmt.xselectionrequest.property;

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

X-I Retour au demandeur


o

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;

Jean Berstel - Institut Gaspard Monge, Universit Marne-la-Valle

28

Vous aimerez peut-être aussi