Aperçu

Parfois, il peut se révéler utile de pouvoir incorporer un élément graphique d'une autre application dans votre propre application. gtkmm permet cela grâce aux classes Gtk::Socket et Gtk::Plug. Il est peu vraisemblable que beaucoup d'applications aient besoin de cette fonctionnalité, mais dans les rares cas où vous auriez besoin d'afficher un élément graphique fonctionnant dans un processus tout à fait différent, ces classes peuvent être d'une grande aide.

La communication entre un objet Socket et un objet Plug s'effectue suivant le protocole XEmbed. Ce protocole a aussi été implémenté dans d'autres boîtes à outils (par exemple, Qt) ; cela permet un niveau d'intégration identique lorsqu'on incorpore un élément graphique Qt dans GTK+ ou vice versa.

Les Sockets et Plugs collaborent par l'intermédiaire des identifiants de leurs fenêtres. Un objet Socket et un objet Plug ont tous deux des ID que l'on peut retrouver avec leurs fonctions membres get_id(). L'utilisation de ces ID sera explicitée plus bas dans la Section XXII.I.III ― Branchement des greffons et des connecteurs.

XXII.I.I. Connecteurs

Un objet Socket est une sorte d'élément graphique conteneur spécial qui autorise la possibilité d'incorporer des éléments graphiques d'un processus dans un autre de manière totalement transparente pour l'utilisateur.

XXII.I.II. Greffons

Un objet Plug est une variété de fenêtre particulière qu'il est possible de greffer dans un objet Socket. Outre les propriétés et les fonctions membres habituelles de la classe Gtk::Window, l'objet Plug fournit un constructeur qui prend comme paramètre l'ID d'un objet Socket ; l'objet Plug va automatiquement s'incorporer dans l'objet Socket qui a l'ID correspondant.

Comme un objet Plug n'est qu'un type spécial de classe Gtk::Window, vous pouvez lui ajouter des conteneurs ou des éléments graphiques exactement comme vous auriez fait pour une autre fenêtre.

XXII.I.III. Branchement des greffons et des connecteurs

Après la création d'objets Socket ou Plug, vous pouvez obtenir leur ID avec la fonction get_id(). Cet ID peut ensuite être partagé avec d'autres processus afin que ces processus sachent comment se connecter les uns aux autres.

Il y a deux stratégies de base utilisables :

  • créer un objet Socket dans un processus et passer l'ID de ce Socket à un autre processus pour qu'il puisse créer un objet Plug en précisant ledit ID du Socket dans son constructeur. Il n'est pas possible d'attribuer un Plug à un Socket après sa création, il faut donc transmettre l'ID du Socket au constructeur du Plug.
  • créer un objet Plug de manière indépendante de tout Socket particulier et passer l'ID du Plug aux processus qui souhaitent l'utiliser. L'ID de l'objet Plug peut être associé à un objet Socket donné avec la fonction Socket::add_id(). C'est l'approche utilisée dans l'exemple qui suit.