Chapter 20. プラグとソケット

Table of Contents

概要

開発をしていると、あるウィジットを別のアプリケーションから取ってきて、自分のアプリケーションに埋め込むことが出来れば便利なときがあります。gtkmmではこれをGtk::SocketGtk::Plugクラスを使って行うことができます。この機能はほとんどのアプリケーションでは不必要ですが、稀なケースとしてまったく別のプロセスで動作しているウィジットを表示する必要になる場合には、この二つのクラスがとても役に立つことでしょう。

SocketオブジェクトとPlugオブジェクト間の通信は、XEmbedプロトコルに従います。このプロトコルは他のツールキット(例えばQt)でも実装されていますから、そのツールキットのウィジットとgtkmmのものを同レベルに統合することができます。例えば、QtウィジットをGTK+に埋め込んだり、その逆の場合も同レベルの統合を行うことができます。

SocketオブジェクトとPlugオブジェクトはウィンドウIDを使って協調的に動作します。どちらのオブジェクトもひとつずつIDを持ち、get_id()メンバ関数を使って取り出すことができます。このIDの使い方は以下のthe section called “プラグとソケットを接続する”で説明します。

ソケット

Socketオブジェクトは特殊なコンテナウィジットの一種です。これはあるプロセスから別のプロセスにウィジットを埋め込む機能を持っています。埋め込みはユーザーに目に見える形(transparent)で行われます。

プラグ

Plugオブジェクトは特殊なウィンドウウィジットの一種で、これにSocketオブジェクトをつなぐ(plugする)ことが出来ます。通常のGtk::Windowのプロパティとメソッド以外に、Plugはコンストラクタを提供し、ここでSocketオブジェクトのIDを受け取ります。そうすれば自動的にそのIDを持つSocketオブジェクトの中へPlugオブジェクトが埋め込まれます。

PlugGtk::Windowの特殊なものに過ぎませんから、他のウィンドウウィジットと同様、コンテナやその他のウィジットを中に入れることができます。

プラグとソケットを接続する

SocketオブジェクトやPlugオブジェクトを生成すれば、そのIDはget_id()関数で得ることができます。このIDはプロセス間で共有されていますから、プロセス同士はお互いに接続する方法を知っています。

これを行うのに使われる基本的なやり方が二つあります:

  • あるプロセスの中でSokcetオブジェクトを生成し、そのIDを別のプロセスに渡します。こうすると別のプロセスはPlugのコンストラクタに、与えられたSocketのIDを指定してPlugオブジェクトを生成することができます。Plugは生成した後では、他のSocketオブジェクトを割り当てることは出来ませんから、SocketのIDをコンストラクタに渡す必要があるのです。

  • どのSocketにも全く独立に、Plugオブジェクトを生成します。そして、このPlugのIDを、それを使う必要のある別のプロセスに渡します。PlugのIDはSocketオブジェクトにSocket::add_id()を使って割り当てることができます。このやり方は次の例で使われています。