#include <gtk-1.2/gtk/gtk.h>

/* キー入力等のイベントが発生した場合に呼び出されるコールバック関数の定義です。
 * このコールバック関数は、下のほうにある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;
}