*** empty log message ***
[m17n/m17n-im-config.git] / src / main.c
index 13d765e..3c1f622 100644 (file)
@@ -1,3 +1,26 @@
+/* main.c -- M17N input method configuration tool
+   Copyright (C) 2007
+     National Institute of Advanced Industrial Science and Technology (AIST)
+     Registration Number H15PRO112
+
+   This file is part of the m17n-im-config package; a sub-part of the
+   m17n library.
+
+   The m17n library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License
+   as published by the Free Software Foundation; either version 2.1 of
+   the License, or (at your option) any later version.
+
+   The m17n library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the m17n library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   02111-1307, USA.  */
+
 #include <stdlib.h>
 #include <string.h>
 #include <libintl.h>
 #include <gtk/gtk.h>
 #include <m17n-im-config.h>
 
-struct ConfigSaveRevert
+/* Common argument to all callback functions.  */
+
+struct CallbackArgument
 {
-  GtkWidget *config, *save, *revert;
+  /* IM configuration widget created by mim_config_new ().  */
+  GtkWidget *config;
+  /* Button widget "default" */
+  GtkWidget *default_;
+  /* Button widget "revert" */
+  GtkWidget *revert;
+  /* Button widget "save" */
+  GtkWidget *save;
 };
 
+
+/* Called when the status of configuration is changed.  */
 void
-status_changed_cb (gboolean modified, gpointer data)
+status_changed_cb (GtkWidget *config, gpointer data)
 {
-  struct ConfigSaveRevert *config_save_revert = data;
+  struct CallbackArgument *arg = data;
+  gboolean modified = mim_config_modified (config);
 
-  if (GTK_WIDGET_SENSITIVE (config_save_revert->save))
+  if (GTK_WIDGET_SENSITIVE (arg->save))
     {
       if (! modified)
        {
-         gtk_widget_set_sensitive (config_save_revert->save, FALSE);
-         gtk_widget_set_sensitive (config_save_revert->revert, FALSE);
+         gtk_widget_set_sensitive (arg->revert, FALSE);
+         gtk_widget_set_sensitive (arg->save, FALSE);
        }
     }
  else
    {
       if (modified)
        {
-         gtk_widget_set_sensitive (config_save_revert->save, TRUE);
-         gtk_widget_set_sensitive (config_save_revert->revert, TRUE);
+         gtk_widget_set_sensitive (arg->revert, TRUE);
+         gtk_widget_set_sensitive (arg->save, TRUE);
        }
    }
 }
 
-static gboolean
-delete (GtkWidget *widget, GdkEvent *event, gpointer data)
+/* Called when "default" button is clicked.  */
+static void
+default_clicked_cb (GtkButton *button, gpointer data)
 {
-  gtk_main_quit ();
-  return FALSE;
-}
+  struct CallbackArgument *arg = data;
 
+  mim_config_default (arg->config);
+  status_changed_cb (arg->config, data);
+}
 
+/* Called when "revert" button is clicked.  */
 static void
 revert_clicked_cb (GtkButton *button, gpointer data)
 {
-  struct ConfigSaveRevert *config_save_revert = data;
+  struct CallbackArgument *arg = data;
 
-  mim_config_revert (config_save_revert->config);
-  status_changed_cb (FALSE, data);
+  mim_config_revert (arg->config);
+  status_changed_cb (arg->config, data);
 }
 
+/* Called when "save" button is clicked.  */
 static void
 save_clicked_cb (GtkButton *button, gpointer data)
 {
-  struct ConfigSaveRevert *config_save_revert = data;
+  struct CallbackArgument *arg = data;
 
-  mim_config_save (config_save_revert->config);
-  status_changed_cb (FALSE, data);
+  mim_config_save (arg->config);
+  status_changed_cb (arg->config, data);
 }
 
+/* Called when "quit" button is clicked.  */
 static void
 quit_clicked_cb (GtkButton *button, gpointer data)
 {
-  struct ConfigSaveRevert *config_save_revert = data;
+  struct CallbackArgument *arg = data;
 
-  if (mim_config_modified (config_save_revert->config))
+  if (mim_config_modified (arg->config))
     {
       GtkWidget *dialog, *label;
       gint response;
@@ -85,40 +125,42 @@ quit_clicked_cb (GtkButton *button, gpointer data)
       if (response == GTK_RESPONSE_CANCEL)
        return;
       if (response == GTK_RESPONSE_YES)
-       mim_config_save (config_save_revert->config);
+       mim_config_save (arg->config);
     }
+  gtk_widget_destroy (arg->config);
   gtk_main_quit ();      
 }
 
-
+/* Called when "ok" button is clicked.  */
 static void
 ok_clicked_cb (GtkButton *button, gpointer data)
 {
-  struct ConfigSaveRevert *config_save_revert = data;
+  struct CallbackArgument *arg = data;
 
-  if (mim_config_modified (config_save_revert->config))
-    mim_config_save (config_save_revert->config);
+  if (mim_config_modified (arg->config))
+    mim_config_save (arg->config);
+  gtk_widget_destroy (arg->config);
   gtk_main_quit ();      
 }
 
 int
 main (int argc, char **argv)
 {
-  GtkWidget *window, *vbox, *config, *hbox;
-  GtkWidget *revert, *save, *ok, *quit;
-  struct ConfigSaveRevert config_save_revert;
-  MimConfigCallback callback;
+  GtkWidget *window, *vbox, *hbox;
+  GtkWidget *default_, *revert, *save, *ok, *quit;
+  struct CallbackArgument arg;
     
 #if ENABLE_NLS
   bindtextdomain ("m17n-im-config", GETTEXTDIR);
   bind_textdomain_codeset ("m17n-im-config", "UTF-8");
 #endif
   gtk_init (&argc, &argv);
+
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-  gtk_widget_set_size_request (window, 400, 300);
+  gtk_widget_set_size_request (window, 500, 300);
   gtk_window_set_title (GTK_WINDOW (window), _("M17N-IM Configuration"));
-  g_signal_connect (G_OBJECT (window), "delete_event",
-                   G_CALLBACK (delete), NULL);
+  g_signal_connect (G_OBJECT (window), "destroy",
+                   G_CALLBACK (gtk_main_quit), NULL);
     
   /* We create these widgets:
      +-vbox----------------------------------+
@@ -130,16 +172,18 @@ main (int argc, char **argv)
      ||                                     ||
      |+-------------------------------------+|
      |+-hbox--------------------------------+|
-     ||          +------+ +-----++----+ +--+||
-     ||          |revert| |save| |quit| |ok|||
-     ||          +------+ +-----++----+ +--+||
+     ||+-------+ +------+ +----+ +----+ +--+||
+     |||default| |revert| |save| |quit| |ok|||
+     ||+-------+ +------+ +----+ +----+ +--+||
      |+-------------------------------------+|
      +---------------------------------------+
   */
 
-  vbox = gtk_vbox_new (FALSE, 10);
+  vbox = gtk_vbox_new (FALSE, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
   gtk_container_add (GTK_CONTAINER (window), vbox);
 
+  default_ = gtk_button_new_from_stock (_("_Default"));
   revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED);
   gtk_widget_set_sensitive (revert, FALSE);
   save = gtk_button_new_from_stock (GTK_STOCK_SAVE);
@@ -147,31 +191,31 @@ main (int argc, char **argv)
   quit = gtk_button_new_from_stock (GTK_STOCK_QUIT);
   ok = gtk_button_new_from_stock (GTK_STOCK_OK);
 
-  config_save_revert.save = save;
-  config_save_revert.revert = revert;
-  callback.func = status_changed_cb;
-  callback.arg = &config_save_revert;
-  config = mim_config_widget (&callback);
-  config_save_revert.config = config;
-  gtk_box_pack_start (GTK_BOX (vbox), config, TRUE, TRUE, 0);
+  arg.revert = revert;
+  arg.save = save;
+  arg.config = mim_config_new (G_CALLBACK (status_changed_cb), &arg);
+  gtk_box_pack_start (GTK_BOX (vbox), arg.config, TRUE, TRUE, 0);
 
+  g_signal_connect (G_OBJECT (default_), "clicked",
+                   G_CALLBACK (default_clicked_cb), &arg);
   g_signal_connect (G_OBJECT (revert), "clicked",
-                   G_CALLBACK (revert_clicked_cb), &config_save_revert);
+                   G_CALLBACK (revert_clicked_cb), &arg);
   g_signal_connect (G_OBJECT (save), "clicked",
-                   G_CALLBACK (save_clicked_cb), &config_save_revert);
+                   G_CALLBACK (save_clicked_cb), &arg);
   g_signal_connect (G_OBJECT (quit), "clicked",
-                   G_CALLBACK (quit_clicked_cb), &config_save_revert);
+                   G_CALLBACK (quit_clicked_cb), &arg);
   g_signal_connect (G_OBJECT (ok), "clicked",
-                   G_CALLBACK (ok_clicked_cb), &config_save_revert);
+                   G_CALLBACK (ok_clicked_cb), &arg);
 
   hbox = gtk_hbutton_box_new ();
   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END);
-  gtk_box_set_spacing (GTK_BOX (hbox), 10);
+  gtk_box_set_spacing (GTK_BOX (hbox), 5);
+  gtk_container_add (GTK_CONTAINER (hbox), default_);
   gtk_container_add (GTK_CONTAINER (hbox), revert);
   gtk_container_add (GTK_CONTAINER (hbox), save);
   gtk_container_add (GTK_CONTAINER (hbox), quit);
   gtk_container_add (GTK_CONTAINER (hbox), ok);
-  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
 
   gtk_widget_show_all (window);
   gtk_main ();