GTK+でSelectionを使って文字を通信する方法

○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関数が呼び出されます。
 
 

戻る