*** empty log message ***
[m17n/m17n-im-config.git] / src / mim-config.c
index 3d41031..6923125 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <libintl.h>
 #include <m17n.h>
+#include <m17n-misc.h>
 #include <gtk/gtk.h>
 #include <config.h>
 #include "m17n-im-config.h"
 #define CONFIG_STATUS_DATA " config-status-data"
 #define CONFIG_TREE_VIEW "  config-tree-view"
 
+typedef void (*MimConfigCallbackFunc) (GtkWidget *widget, gpointer data);
+
+typedef struct _MimConfigCallback
+{
+  GtkWidget *widget;
+  MimConfigCallbackFunc func;
+  gpointer data;
+} MimConfigCallback;
+
 typedef struct _MimConfigStatus
 {
   /* Number of available input methods.  */
@@ -246,8 +256,7 @@ update_child_row (GtkTreeModel *model, GtkTreeIter *iter,
 
       callback = g_object_get_data (G_OBJECT (tree), CONFIG_CALLBACK_DATA);
       if (callback)
-       callback->func (config_status->num_modified == 0 ? FALSE : TRUE,
-                       callback->arg);
+       callback->func (callback->widget, callback->data);
     }
 }
 
@@ -460,13 +469,30 @@ set_as_saved (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
   return FALSE;
 }
 
+static int initialized = 0;
+
+static void
+destroy_cb (GtkWidget *widget, gpointer data)
+{
+  M17N_FINI ();
+}
+
 \f
 /* Public API */
 
-int
-mim_config_init ()
+GtkWidget *
+mim_config_new (GCallback func, gpointer data)
 {
+  GtkWidget *tree, *config;
+  GtkTreeStore *store;
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
+
+  if (initialized)
+    return NULL;
   M17N_INIT ();
+  if (merror_code < 0)
+    return NULL;
 
 #if ENABLE_NLS
   bindtextdomain ("m17n-im-config", GETTEXTDIR);
@@ -478,30 +504,9 @@ mim_config_init ()
   mim_status_str[MIM_STATUS_MODIFIED] = _("modified");
   mim_status_str[MIM_STATUS_NO] = _("uncustomizable");
 
-  return 0;
-}
-
-int
-mim_config_fini ()
-{
-  M17N_FINI ();
-
-  return 0;
-}
-
-GtkWidget *
-mim_config_widget (MimConfigCallback *callback)
-{
-  GtkWidget *tree, *config;
-  GtkTreeStore *store;
-  GtkCellRenderer *renderer;
-  GtkTreeViewColumn *column;
-
   store = make_store_for_input_methods ();
   tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
   g_object_unref (G_OBJECT (store));
-  if (callback)
-    g_object_set_data (G_OBJECT (tree), CONFIG_CALLBACK_DATA, callback);
 
   renderer = gtk_cell_renderer_text_new ();
   column = (gtk_tree_view_column_new_with_attributes
@@ -522,8 +527,21 @@ mim_config_widget (MimConfigCallback *callback)
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (config),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (config), tree);
+  g_signal_connect (G_OBJECT (config), "destroy",
+                   G_CALLBACK (destroy_cb), NULL);
 
   g_object_set_data (G_OBJECT (config), CONFIG_TREE_VIEW, tree);
+  if (func)
+    {
+      MimConfigCallback *callback;
+
+      callback = g_new (MimConfigCallback, 1);
+      callback->widget = config;
+      callback->func = (MimConfigCallbackFunc) func;
+      callback->data = data;
+      g_object_set_data_full (G_OBJECT (tree), CONFIG_CALLBACK_DATA,
+                             callback, g_free);
+    }
 
   return config;
 }