Prev

Up

Home

GTK+ Reference Manual

Next

Top  |  Description  |  Object Hierarchy  |  Signals

GtkSocket

GtkSocket Контейнер для виджетов из другого процесса

Краткое описание

#include <gtk/gtk.h> GtkSocket; GtkWidget* gtk_socket_new (void); void gtk_socket_steal (GtkSocket *socket_, GdkNativeWindow wid); void gtk_socket_add_id (GtkSocket *socket_, GdkNativeWindow window_id); GdkNativeWindow gtk_socket_get_id (GtkSocket *socket_);

Иерархия объектов

GObject +----GInitiallyUnowned +----GtkObject +----GtkWidget +----GtkContainer +----GtkSocket

Осуществляемые интерфейсы

GtkSocket осуществляет AtkImplementorIface.

Сигналы

"plug-added" void user_function (GtkSocket *socket, gpointer user_data) : Run last "plug-removed" gboolean user_function (GtkSocket *socket, gpointer user_data) : Run last

Описание

Вместе с GtkPlug, GtkSocket обеспечивает встраивание виджетов из одного процесса в другой, в форме прозрачной для пользователя. Один процесс создаёт GtkSocket виджет и передаёт этот ID окна виджета в другой процесс, который создаёт GtkPlug с этим ID окна. Любые виджеты содержащиеся в GtkPlug появятся в окне первого приложения.

ID окна сокета определяется с помощью gtk_socket_get_id(). Перед использованием этой функции сокеты должны быть реализованы и соответственно добавлены к их родителям.

Пример 1. Определение ID окна сокета.

GtkWidget *socket = gtk_socket_new (); gtk_widget_show (socket); gtk_container_add (GTK_CONTAINER (parent), socket); /* Следующий вызов необходим только если один * предок сокета не видим. */ gtk_widget_realize (socket); g_print ("ID сокета окна %x\n", gtk_socket_get_id (socket));

Помните, если вы создаёте ID окна сокета для другого процесса который создает вставку для сокета, вы должны убедиться в том что виджет сокета не разрушен в течении создания подключения. Нарушение этого правила вызовет не предсказуемые последствия, наиболее вероятным из которых будет появление вставляемого виджета как отдельного окна верхнего уровня. Вы можете контролировать создание вставки (plug) проверяя plug_window поле в структуре GtkSocket. Если поле не-NULL, то когда вставка была полностью выполнена внутри сокета.

Когда GTK+ извещён о разрушении встроенного окна, то когда происходит разрушение сокета. Поэтому вы всегда должны быть готовы к разрушению вашего сокета в течении выполнения основного цикла событий.

Общение между GtkSocket и GtkPlug происходит по протоколу XEmbed. Этот протокол, также задействованный в других инструментариях, например Qt, позволяет некоторый уровень интеграции встраивания виджетов Qt в GTK или наоборот.

Сокет может также использоваться для поглощения произвольных предварительно созданных окон верхнего уровня используя gtk_socket_steal(), хотя при этом интеграция не будет такой же законченной как между GtkPlug и GtkSocket.

Помните

GtkPlug и GtkSocket виджеты в текущий момент доступны не на всех платформах поддерживаемых GTK+.

Детали

GtkSocket

typedef struct _GtkSocket GtkSocket;

GtkSocket структура содержит plug_window поле. (Это поле должно рассматриваться только для чтения. Оно никогда не должно устанавливаться приложением.)


gtk_socket_new ()

GtkWidget*  gtk_socket_new                  (void);

Создаёт новый пустой GtkSocket.

Возвращает :

новый GtkSocket.


gtk_socket_steal ()

void gtk_socket_steal (GtkSocket *socket_, GdkNativeWindow wid);

Внимание

gtk_socket_steal устарела и не должна использоваться во вновь создаваемом коде.

Помещает предварительно созданное окно верхнего уровня в GtkSocket. Это нужно для внедрения клиентов которые не знают о встраивании в GtkSocket, однако выполнение ненадёжно, поэтому не стоит использовать эту функцию.

GtkSocket уже должен быть добавлен в окно верхнего уровня перед использованием этого вызова.

socket_ :

GtkSocket

wid :

ID существующего окна верхнего уровня.


gtk_socket_add_id ()

void gtk_socket_add_id (GtkSocket *socket_, GdkNativeWindow window_id);

Добавляет XEMBED клиент, такой как GtkPlug, для GtkSocket. Клиент может быть в том же самом процессе или в другом.

Для внедрения GtkPlug в GtkSocket, вы можете или создать GtkPlug с помощью gtk_plug_new (0), вызвать gtk_plug_get_id() для получения ID окна вставки, а затем передать его в gtk_socket_add_id(), или вы можете вызвать gtk_socket_get_id() для получения ID окна для сокета, и вызвать gtk_plug_new() поместив этот ID.

GtkSocket должен быть добавлен в окно верхнего уровня перед этим вызовом.

socket_ :

GtkSocket

window_id :

ID окна клиента участвующего в XEMBED протоколе.


gtk_socket_get_id ()

GdkNativeWindow gtk_socket_get_id           (GtkSocket *socket_);

Получает ID окна GtkSocket виджета, который может быть использован для создания клиента встроенного в сокет, например с помощью gtk_plug_new().

GtkSocket должен быть добавлен в окно верхнего уровня перед этим вызовом.

socket_ :

GtkSocket.

Возвращает :

ID окна для сокета

Детали сигналов

Сигнал "plug-added"

void user_function (GtkSocket *socket, gpointer user_data) : Run last

Этот сигнал издаётся когда клиент полностью добавлен в сокет.

socket :

Объект который получает сигнал.

user_data :

Пользовательские данные устанавливаемые при подключении обработчика сигнала.


Сигнал "plug-removed"

gboolean user_function (GtkSocket *socket, gpointer user_data) : Run last

Этот сигнал издаётся когда клиент удаляется из сокета. Действие по умолчанию разрушает виджет GtkSocket, поэтому если вы хотите многократно использовать это, вы должны добавить обработчик сигнала возвращающий TRUE.

socket :

Объект который получает сигнал.

user_data :

Пользовательские данные устанавливаемые при подключении обработчика сигнала.

Возвращает :

Смотрите также

GtkPlug

Виджет который встраивается в GtkSocket.

XEmbed

Спецификация протокола XEmbed.