Vista general

De vez en cuando, puede ser útil incrustar un widget de otra aplicación dentro de la suya. gtkmm le permite hacer esto con las clases Gtk::Socket y Gtk::Plug. Se anticipa que no muchas aplicaciones necesitan esta funcionalidad, pero en los raros casos en los que necesite mostrar un widget que esté ejecutándose en un proceso completamente diferente, estas clases pueden resultar muy útiles.

La comunicación entre un Socket y un Plug sigue el protocolo «XEmbed». Este protocolo, que también se ha implementado en otros kits de herramientas (por ejemplo, «Qt»), permite el mismo nivel de integración cuando se incrusta un widget Qt en uno GTK+ o viceversa.

La manera en la que los Sockets y los Plugs trabajan juntos es a través de sus ID de ventana. Tanto un Socket como un Plug tienen ID que pueden obtenerse con sus funciones miembro get_id(). El uso de estos ID se explicará a continuación en la Sección 22.1.3: Conectar «plugs» y «sockets».

22.1.1. «Sockets»

Un Socket es un tipo especial de widget contenedor que ofrece la posibilidad de incorporar widgets de un proceso en otro proceso de manera que sea transparente para el usuario.

22.1.2. «Plugs»

Un Plug es un tipo especial de ventana que se puede conectar a un Socket. Además de las propiedades y los métodos normales de Gtk::Window, un Plug proporciona un constructor que toma el ID de un Socket, lo que automáticamente incrusta el Plug en el Socket que coincide con el ID.

Dado que un Plug es sólo un tipo especial de la clase Gtk::Window, puede añadirle contenedores o widgets como si fuera cualquier otra ventana.

22.1.3. Conectar «plugs» y «sockets»

Luego de que se crea un objeto Socket o Plug, puede obtener su ID con su función get_id(). Este ID puede entonces compartirse con otros procesos para que estos sepan cómo conectarse entre sí.

There are two basic strategies that can be used:

  • Create a Socket object in one process and pass the ID of that Socket to another process so that it can create a Plug object by specifying the given Socket ID in its constructor. There is no way to assign a Plug to a particular Socket after creation, so you must pass the Socket ID to the Plug's constructor.
  • Create a Plug independantly from any particular Socket and pass the ID of the Plug to other processes that need to use it. The ID of the Plug can be associated with a particular Socket object using the Socket::add_id() function. This is the approach used in the example below.