Whole document tree 16. Gestion des sélections16.1 IntroductionUn type de communication inter-processus gérée par GTK est les sélections. Une sélection identifie un morceau de données, par exemple une portion de texte sélectionnée par l'utilisateur avec la souris. Seule une application sur un écran (le propriétaire) peut posséder une sélection particulière à un moment donné, ainsi lorsqu'une sélection est réclamée par une application, le propriétaire précédent doit indiquer à l'utilisateur que la sélection a été abandonnée. Les autres applications peuvent demander le contenu d'une sélection sous différentes formes appelées cibles. Il peut y avoir un nombre quelconque de sélections, mais la plupart des applications X n'en gèrent qu'une, la sélection primaire.
Dans la plupart des cas, une application GTK n'a pas besoin de gérer elle-même les sélections. Les widgets standards, comme le widget Entrée de texte, possèdent déjà la capacité de réclamer la sélection lorsqu'il le faut (par exemple, lorsque l'utilisateur glisse au dessus d'un texte) et de récupérer le contenu de la sélection détenue par un autre widget ou une autre application (par exemple, lorsque l'utilisateur clique avec le deuxième bouton de la souris). Cependant, il peut il y avoir des cas dans lesquels vous voulez donner aux autres widgets la possibilité de fournir la sélection, ou vous désirez récupérer des cibles non supportées par défaut.
Un concept fondamental dans la compréhension du fonctionnement des sélections est celui d'atome. Un atome est un entier qui définit de façon unique une chaîne (sur un affichage particulier). Certains atomes sont prédéfinis par le serveur X et, dans certains cas, des constantes définies dans gtk.h correspondent à ces atomes. Par exemple, la constante GDK_PRIMARY_SELECTION correspond à la chaîne "PRIMARY". Dans d'autres cas, on doit utiliser les fonctions gdk_atom_intern(), pour obtenir l'atome correspondant à une chaîne, et gdk_atom_name(), pour obtenir le nom d'un atome. Les sélections et les cibles sont identifiés par des atomes.
16.2 Récupération de la sélectionLa récupération de la sélection est un processus asynchrone. Pour démarrer le processus, on appelle :
Cela convertit la sélection dans la forme spécifiée par target. Si tout est possible, le paramètre time sera le moment de l'événement qui a déclenché la sélection. Ceci aide à s'assurer que les événements arrivent dans l'ordre où l'utilisateur les a demandé. Cependant, si cela n'est pas possible (par exemple, lorsque la conversion a été déclenchée par un signal "clicked"), alors on peut utiliser la macro GDK_CURRENT_TIME.
Quand le propriétaire de la sélection répond à la requête, un signal
"selection_received" est envoyé à notre application. Le gestionnaire
de ce signal reçoit un pointeur vers une structure
selection et target sont les valeurs que l'on a donné dans notre appel gtk_selection_convert(). type est un atome qui identifie le type de données retourné par le propriétaire de la sélection. Quelques valeurs possibles sont : "STRING", une chaîne de caractères latin-1, "ATOM", une série d'atomes, "INTEGER", un entier, etc. La plupart des cibles ne peuvent retourner qu'un type. format donne la longueur des unités (les caractères, par exemple) en bits. Habituellement, on ne se préoccupe pas de cela lorsqu'on reçoit des données. data est un pointeur vers la donnée retournée et length donne la longueur en octets de la donnée retournée. Si length est négative, cela indique qu'une erreur est survenue et que la sélection ne peut être récupérée. Ceci peut arriver si aucune application n'est propriétaire de la sélection, ou si vous avez demandé une cible que l'application ne sait pas gérer. Le tampon est garanti d'être un octet plus long que length ; l'octet supplémentaire sera toujours zéro, et il n'est donc pas nécessaire de faire une copie de chaîne simplement pour qu'elle soit terminée par zéro (comme doivent l'être toutes les chaînes C).
Dans l'exemple qui suit, on récupère la cible spéciale "TARGETS", qui est une liste de toutes les cibles en lesquelles la sélection peut être convertie.
16.3 Fournir la sélection
Fournir la sélection est un peu plus compliqué. On doit enregistrer les gestionnaires qui seront appelés lorsque notre sélection est demandée. Pour chaque paire sélection/cible que l'on gèrera, on fera un appel à :
widget, selection et target identifient les requêtes que ce gestionnaire gèrera. S'il ne vaut pas NULL, remove_func sera appelé lorsque le gestionnaire de signal est supprimé. Ceci est utile, par exemple, pour des langages interprétés qui doivent garder une trace du nombre de références à data.
La fonction de rappel function doit avoir la signature suivante :
Le GtkSelectionData est le même qu'au dessus, mais, cette fois, nous sommes responsables de l'initialisation de ses champs type, format, data, et length. (Le champ format est important ici - le serveur X l'utilise pour savoir si la donnée doit être échangée par octet ou non. Habituellement, ce sera 8 (un caractère), ou 32 (un entier)). Cette initialisation est faite en utilisant l'appel :
Cette fonction s'occupe de faire une copie correcte des données afin que l'on n'ait pas à se soucier du reste. (On ne doit pas remplir ces champs à la main).
Lorsque cela est demandé par l'utilisateur, on réclame la possession de la sélection en appelant :
Si une autre application réclame la possession de la sélection, on recevra un "selection_clear_event". Comme exemple de fourniture de sélection, l'exemple suivant ajoute une fonctionnalité de sélection à un bouton commutateur. Lorsque ce bouton est appuyé, le programme réclame la sélection primaire. La seule cible supportée (à part certaines cibles fournies par GTK lui-même, comme « TARGETS ») est « STRING ». Lorsque celle-ci est demandée, on retourne une représentation de l'heure sous forme de chaîne.
Page suivante Page précédente Table des matières |