Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Коннекторы и вставки
Оригинал: Programming with gtkmm 3Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 28 марта 2014 г.
22. Коннекторы и вставки
22.1. Обзор
Иногда может оказаться полезной возможность встраивания виджета стороннего приложения в окно вашего приложения. gtkmm позволяет выполнить такое встраивание с помощью классов Gtk::Socket
и Gtk::Plug
. Неразумно предполагать, что данная возможность будет востребована чрезвычайно большим количеством приложений, но в редких случаях, когда вам требуется показать виджет, созданный средствами полностью независимого процесса, эти классы могут оказаться достаточно полезными.
Взаимодействие между вставкой (Socket
) и коннектором (Plug
) осуществляется в соответствии с протоколом XEmbed. Этот протокол также был реализован в рамках других тулкитов (например, в рамках Qt), что позволяет достичь точно такого же уровня интеграции при встраивании виджета из приложения на основе Qt в приложение на основе GTK+ и наоборот.
Способ совместной работы вставок и коннекторов основывается на использовании их идентификаторов окон. Как коннектор, так и вставка имеют идентификаторы окон, которые могут быть получены с помощью методов get_id()
соответствующих объектов. Методика использования идентификаторов окон будет описана ниже в разделе 22.1.3 - "Соединение коннекторов и вставок".
22.1.1. Вставки (Sockets)
Вставка (Socket
) является специальным типом контейнерного виджета, который предоставляет возможность встраивания виджетов из окна приложения в рамках одного процесса в окно приложения в рамках другого процесса прозрачным для пользователя образом.
22.1.2. Коннекторы (Plugs)
Коннектор (Plug
) является специальным типом окна, которое может быть соединено с вставкой (Socket
). Помимо стандартных свойств и методов класса Gtk::Window
, класс коннектора предоставляет конструктор, принимающий идентификатор вставки и автоматически встраивающий коннектор в вставку с соответствующим идентификатором.
Так как коннектор является всего лишь особым типом класса окна на основе класса Gtk::Window
, вы можете добавлять в него контейнеры и виджеты точно также, как и в любое другое окно.
22.1.3. Соединение коннекторов и вставок
После создания объекта вставки или коннектора вы можете получить идентификатор его окна с помощью функции get_id()
. Этот идентификатор впоследствии будет разделяться со сторонними процессами, поэтому процессы будут располагать информацией о том, как соединиться друг с другом.
- Создание объекта вставки (
Socket
) в одном процессе и передача идентификатора этой вставки другому процессу для того, чтобы он мог создать объект коннектора (Plug
) с указанием переданного идентификатора вставки при использовании его конструктора. Не существует способа постановки коннектора в соответствие определенной вставке после его создания, поэтому вы должны передавать идентификатор вставки конструктору коннектора. - Создание объекта коннектора (
Plug
) независимо от какого-либо определенного объекта вставки (Socket
) и передача идентификатора коннектора другим процессам, которые могут использовать его. Идентификатор коннектора может быть ассоциирован с определенным объектом вставки с помощью функцииGtk::Socket::add_id()
. Данный подход используется в приведенном ниже примере.
22.2. Пример использования коннекторов и вставок
Ниже приведен простой пример использования вставок и коннекторов. Используемый в нем метод межпроцессного взаимодействия умышленно упрощен: процесс с коннектором записывает идентификатор коннектора в текстовый файл с именем plug.id
, после чего процесс с вставкой читает этот идентификатор из созданного файла. В реальной программе вы можете отдать предпочтение использованию более сложного механизма межпроцессного взаимодействия.
Файл: socket.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: plug.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
В данном примере создаются два приложения: socket
и plug
. Принцип работы данных приложений заключается в том, что приложение с вставкой (socket
) содержит окно, в которое будет встраиваться виджет из приложения с коннектором (plug
). Пример разработан таким образом, что приложение с коннектором (plug
) должно быть запущено до запуска приложения с вставкой (socket
). Для того, чтобы увидеть этот пример в действии, выполните в директории примера приведенные ниже команды в строгой последовательности:
plug
) и переведите ее в фоновый режим (или просто используйте отдельный терминал):
$ ./plug &
Идентификатор окна: 69206019
socket
):
$ ./socket
socket
) вы должны увидеть следующий вывод в терминале:
Виджет был встроен. Коннектор был добавлен
Первая строка выводится приложением с коннектором (plug
), после получения уведомления о том, что произошло встраивание виджета в вставку (Socket
). Вторая строка выводится приложением с вставкой (socket
) в ответ на генерацию сигнала "plug_added"
в рамках этого приложения. Если все действия были выполнены в строгом соответствии с приведенными выше инструкциями, окно приложения с вставкой (socket
) должно выглядеть примерно так:
Рисунок 22-1: Корректная работа приложения с вставкой
В том же случае, если по какой-то причине не удается связать вставку (Socket
) с коннектором (Plug
), окно будет выглядеть аналогичным образом:
Рисунок 22-2: Некорректная работа приложения с вставкой
Следующий раздел : События клавиатуры.