○gtk+-develパッケージがインストールされていれば、GTK+ のTutorialが
/usr/doc/gtk+-devel-???/tutorial/ にあります。そのManaging Selections
の項目には詳しい説明があります。
1. あるwidgetがselectionのowner、つまり送信元になる場合他のアプリケーションにデータを送るには、selectionのownerになる必要があります。
ownerであれば、例えば、xtermでマウスの中ボタンを押したときに、ownerが予めセットした文字列を、
xtermに貼り付けてもらうことができます。
ここでは、PRIMARYのSelectionを使い、文字を扱うことにします。まず、作っておいたwidgetに次のようにtargetを付加します。
gtk_selection_add_target (widget,
GDK_SELECTION_PRIMARY,
GDK_SELECTION_TYPE_STRING,
1);後に述べる方法でwidgetがownerになるとき、"selection_get"シグナルが発生するので、例えば、
コールバック関数をselection_obtainedと名付けて、次のように関連づけます。gtk_signal_connect (GTK_OBJECT (widget),"selection_get",
GTK_SIGNAL_FUNC (selection_obtained), NULL);コールバック関数は次のように多くの引数をとります。
void selection_obtained (GtkWidget *widget, GtkSelectionData *selection_data,
guint info, guint time_stamp, gpointer data )
{
static char ClipedStr[] = "test test test";
gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING,
8, ClipedStr, strlen(ClipedStr));
}この場合は単純に、送るデータとしてClipedStrに入っている文字列をセットしています。
こうしておいて、widgetがPRIMARY Selectionのownerになりたい時に、以下の関数を使います。
gtk_selection_owner_set (widget, GDK_SELECTION_PRIMARY,
GDK_CURRENT_TIME);widgetがownerになっている間に、アプリケーションがデータを要求すれば、先程セットした
データが送られます。2. あるwidgetがselectionのownerからデータを受け取る場合
この場合、targetは付加する必要はありません。
後述する方法で要求したデータが返ってくると、"selection_received"シグナルが送られてくるので、
例えば、コールバック関数をselection_data_receivedと名付けて、widgetに次のように関連づけます。gtk_signal_connect (GTK_OBJECT (widget),"selection_received",
GTK_SIGNAL_FUNC (selection_data_received), NULL);送られてきたものが、文字データのときにそれを利用するなら、次のようなコールバック関数
が良いでしょう。void selection_data_received (GtkWidget *widget, GtkSelectionData *selection_data, gpointer data)
{
guchar *str;
if (selection_data->length < 0)
return;
if (selection_data->type != GDK_SELECTION_TYPE_STRING)
return;
str = selection_data->data;/*
* strを使って、処理が続く。
*/
}さて、あるwidgetが、Primary Selectionのownerにデータを要求するには、次の関数を使います。
gtk_selection_convert (widget,
GDK_SELECTION_PRIMARY,
GDK_SELECTION_TYPE_STRING,
GDK_CURRENT_TIME);データが送られてきたら、上のselection_data_received関数が呼び出されます。