シグナルハンドラの実装 〜ウインドウのクローズ〜


"delete_event"と"destroy"

GTK のチュートリアル によると、「コールバック関数 "delete_event" は、ウィンドウ・マネージャがこのイベント "delete_event" をアプリケーションに送信したときに呼び出されます。」 とあります。つまり、ウインドウの右上にある閉じるボタンを押すと、"delete_event"シグナルが呼び出されます。 この関数は、gboolean型の値を返し、「TRUE」であれば、ウインドウをクローズすることなく復帰します。 「FALSE」であれば、ウインドウのクローズを行うために、"destroy"イベントが発行されます。 この性質を利用すると、"delete_event"に対応するシグナルハンドラで、 「本当に終了しますか?」というダイアログを表示させ、ユーザに終了させるかどうかを選択させることができます。 もし、ユーザが終了することを選択したらFALSEを返し、終了をキャンセルしたら、TRUEを返すわけです。

"destry"は、"delete_evnet"に対応するシグナルハンドラが「FALSE」を返すと呼び出されます。 このハンドラでは、終了処理を実装します。


"delete_event"と"destroy"のシグナルハンドラの追加

"delete_event"と"destroy"に対応するシグナルハンドラを追加します。 作成中のウインドウをクリックし、プロパティウインドウに「window1」のプロ パティが表示されるようにします。そして、「シグナル」タブをクリックします (図12)。そして、で囲まれたボタンをクリックすると、 「シグナルの選択」ウインドウが表示されます。

まず、"delete_event"に対応するシグナルハンドラを追加します(図13)。 「シグナルの選択」ウインドウの中から、「GtkWidget」シグナルの"delete_event"を選択し、「OK」をクリックします。 すると、プロパティウインドウの「シグナル」と「ハンドラ」部分に"delete_event"と対応するシグナルハンドラ名が追加されるので、「追加」ボタンを押し、追加します。

同様に、"destroy"に対応するシグナルハンドラを追加します(図14)。 今度は、「シグナルの選択」ウインドウの中から、「GtkObject」シグナルの"destroy"を選択し、同様に追加します。

そうすると、図15のようにシグナルハンドラが追加されます。

図12 「window1」のプロパティ
「window1」のプロパティ
図13 "delete_event"の追加
delte_eventの追加
図14 "destroy"の追加
destroyの追加
図15 追加したシグナルハンドラ
追加したシグナルハンドラ
コードを生成してみると、callback.cにon_window1_delete_event()とon_window1_destry()のコードが追加されています。
on_window1_delete_event()では、とりあえず単にFALSEを返すだけにします。 終了確認は、いずれ実装することにします。
on_window1_destroy()では、gtk_main_quit()を呼び、 メインループを抜けるようにします。これで、閉じるボタンを押すと、 アプリケーションを終了できるようになるはずです。
gboolean
on_window1_delete_event                (GtkWidget       *widget,
                                        GdkEvent        *event,
                                        gpointer         user_data)
{

    return FALSE;
}


void
on_window1_destroy                     (GtkObject       *object,
                                        gpointer         user_data)
{
    gtk_main_quit();
}
ここまで、 実装したコードはここから ダウンロードできます。
シグナルハンドラの実装 〜描画領域の表示〜
GTK/GDK/gladeによるプログラムメモ Topへ
Copyright (C) 2004 Kohta NAKASHIMA
All Rights Reserved.