#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. */
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);
}
}
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);
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
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;
}