#include /* キー入力等のイベントが発生した場合に呼び出されるコールバック関数の定義です。 * このコールバック関数は、下のほうにあるgtk_signal_connect()により、ボタンを * クリックすると呼び出されます。 */ void hello (GtkWidget *widget, gpointer data) { g_print ("Hello World\n"); } gint delete_event(GtkWidget *widget, gpointer data) { g_print ("delete event occured\n"); /* この関数は、"delete_event"シグナルが発生した場合に呼び出されます。 * "delete_event"シグナルは、Xボタンをクリックすることによって発生 * します。 * "delete_event"シグナルハンドラの戻り値がFALSEの場合、"destroy" * シグナルが発行され、プログラムが終了します。戻り値がTRUEの場合、 * プログラムは終了しません。これは、「本当に終了しますか?」と * いったようなポップアップダイアログを出す場合に便利です。 */ return (TRUE); } /* destroyシグナルが発生した場合のコールバック関数です。 * プログラムの終了処理を行います。 */ void destroy (GtkWidget *widget, gpointer data) { gtk_main_quit (); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; gtk_init (&argc, &argv); /* ウィンドウウィジェットの生成 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* "delete_event"シグナルが発生した場合、delete_event()関数を * 呼び出します。(delete_event()関数は上の方で定義しています) */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* "destroy"シグナルが発生した場合、destroy()関数を呼び出します。 * "destroy"シグナルは、gtk_widget_destroy()関数を呼び出した場合や、 * "delete_event"コールバックの戻り値がFALSEだった場合に発行されます。 */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); /* ウィンドウのボーダーの幅をセットします */ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* "Hello World"というラベルを持つボタンを作成します。 */ button = gtk_button_new_with_label ("Hello World"); /* ボタンが"clicked"シグナルを受け取った場合、関数hello()を呼び出します。 * 関数hello()は上のほうで定義されています。 */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (hello), NULL); /* ボタンが"clicked"シグナルを受け取った場合、関数gtk_widget_destroy(window) * を呼び出し、 "destroy"シグナルを発行します。 */ gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window)); /* ボタンをウィンドウに貼り付けます。 */ gtk_container_add (GTK_CONTAINER (window), button); /* ボタンを表示します。 */ gtk_widget_show (button); /* ウィンドウを表示します。 */ gtk_widget_show (window); gtk_main (); return 0; }