Travaux Dirigés de aci
3. Le coupe & colle en X-window

Le programme ci-joint illustre la technique du coupe & colle entre deux clients X-window. Elle repose sur le partage des propriétés sorte de mémoires partageables par tous les clients mais attachées à une fenêtre pour structurer l’espace de nommage. Ces propriétés sont nommées et typées par des chaînes de caractères préalablement internées afin de les désigner non par leur long libellé, mais par un identifiant implicitement numérique nommé atome (dénomination lispienne du traditionnel identificateur). Cette application illustre également comment les clients d’un même serveur peuvent communiquer.

L’application prend en argument un nom de police, un nom qui sera celui de la fenêtre, et au moins un autre argument. Elle affiche cet argument et les suivants ligne par ligne. Elle se met ensuite en attente d’un processus exécutant le même programme sur d’autres arguments. Quand la communication est établie, la fenêtre de chaque processus apparaît. Lorsque la souris rentre dans l’une des deux fenêtres, la ligne où elle est s’affiche en vidéo inverse. L’utilisateur peut alors cliquer, maintenir le bouton enfoncé, et le relâcher lorsqu’il se trouve dans l’autre fenêtre. A ce moment, les deux processus s’échangent les deux lignes.

Remarque : ce programme pourra servir au jeu syntaxique de la permutation de l’Oulipo, comme le suggère le Makefile associé qui fournit en outre deux exemples de polices.

Liste des symboles de la XLib utilisés dans ce problème :

X XButtonEvent XChangeProperty
XClearWindow XCloseDisplay XCreateGC
XCreateSimpleWindow XCrossingEvent XDeleteProperty
XDisplayName XDrawImageString XEvent
XExposeEvent XFontStruct XFreeGC
XGCValues XGetSelectionOwner XGetWindowProperty
XGrabServer XInternAtom XKeyEvent
XLoadQueryFont XMapSubwindows XMapWindow
XNextEvent XOpenDisplay XPropertyEvent
XSelectInput XSendEvent XSetSelectionOwner
XStoreName XUngrabServer

typincdef.h
Makefile
main.c


1 Suis moi dans la tombe

Le processus doit s’arrêter dès qu’une touche du clavier est enfoncée. Comme le deuxième processus n’a alors plus de raison d’exister, le premier doit lui simuler le même événement pour qu’il se termine également. A l’aide de la fonction XSendEvent, définir la fonction fKeyPress qui ferme la connection au serveur, mais auparavant notifie à l’autre processus d’en faire autant, seulement s’il ne vient pas lui-même d’être notifié par l’autre. Cette fonction devra également demander au serveur de supprimer la propriété répérée par atome[0] et attachée à la fenêtre racine.

Pour envoyer un événement à une fenêtre, utiliser :

Status XSendEvent(Display *, Window, Bool, long , XEvent *)
le troisième argument sera False (il indique qu’il n’est pas nécessaire de propager dans la hiérachie des fenêtres) ; le quatrième est le masque d’événement correspondant à ce qui est envoyé.
Obtenir un formulaire de soumission de comptes rendus

2 Les Propriétaires

Définir la fonction synchroniser, dont le rôle est de repérer un client exécutant le même programme qu’elle. Pour ce faire, définir un atome X-window, trouver son propriétaire (par XGetSelectionOwner) et en réclamer la propriété (par XSetSelectionOwner). Attendre qu’un autre client la réclame, puis mémoriser le numéro de sa fenêtre. Que faire pour notifier ensuite à l’autre processus qu’il arrive en second ? Comment un processus peut-il savoir s’il arrive en premier ou en second ? Pour finir, affecter le tableau atomes avec cet atome et un autre à créer, de sorte que leur indice soient symétriques dans les deux processus. Retourner l’identifiant de la fenêtre du client repéré.

Remarque : les propriétés étant des variables partagées, il y a en fait une section critique entre get et set de la sélection. Cette séquence doit donc être encadrée par les fonctions unaires XGrabServer et XUngrabServer, ce qui oblige le serveur à ne s’intéresser qu’au client demandeur dans cet intervalle de temps. Attention : cette capture du serveur ne doit surtout pas comporter d’appels, notamment implicites, au gestionnaire de fenêtres : celui-ci étant un client comme un autre, il en résulterait une étreinte fatale obligeant à tuer le serveur.


Obtenir un formulaire de soumission de comptes rendus

3 Inverser n’est pas jouer

Définir la fonction sensibiliser. Elle crée autant de fenêtres filles que d’arguments passés dans argv, à l’exception des deux premiers. Chaque fille sera aussi large que la mère, et de hauteur espacement. Sensibiliser toutes les fenêtes de sorte que :


Obtenir un formulaire de soumission de comptes rendus

4 La propriété, c’est le troc

Définir la fonction fEnterNotify qui met en vidéo inverse le contenu de la fenêtre fille où passe la souris, et affecte le numéro de la fille à la variable globale last_sel. Ces opérations ne seront faites que

Définir la fonction fLeaveNotify qui repasse en vidéo normale la fenêtre de numéro last_sel, avec les mêmes contraintes.

On tiendra compte du fait que ces événements sont également générés lorsqu’un client se saisit ou se dessaisit de la souris.

Définir la fonction fProperty. Elle reçoit la chaîne transmise par l’autre client et la visualise en mode inverse si c’est la fenêtre où se trouve la souris. Elle transmet à l’autre client la ligne choisie, en évitant évidemment un bouclage d’envoi.


Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 23 janvier 2021 à 18h18min