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

Existen dos estrategias básicas que pueden usarse:

  • Cree un objeto Socket en un proceso y pásele el ID de ese Socket a otro proceso para que pueda crear un objeto Plug mediante la especificación del ID del Socket dado en su constructor. No hay manera de asignar un Plug a un Socket particular después de su creación, por lo que le debe pasar el ID del Socket al constructor del Plug.
  • Cree un Plug independiente de cualquier Socket particular y pásele el ID del Plug a otros procesos que necesiten usarlo. El ID del Plug puede asociarse con un objeto Socket particular usando la función Socket::add_id(). Este es el enfoque utilizado en el siguiente ejemplo.