Наши партнеры

UnixForum





Библиотека сайта 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: Некорректная работа приложения с вставкой
Некорректная работа приложения с вставкой


Следующий раздел : События клавиатуры.