X-Git-Url: http://git.chise.org/gitweb/?p=m17n%2Fm17n-im-config.git;a=blobdiff_plain;f=src%2Fmim-config.c;h=6923125c6019d16460ae97631e605473be14749e;hp=3d410311889c974dc2c39d329282276f480f8dc2;hb=0d9ef3fdc010c95fed12724c9790daf0c2d67dfe;hpb=4f5ca6ec34a5180b87271b1d469b20216e4e6c4d diff --git a/src/mim-config.c b/src/mim-config.c index 3d41031..6923125 100644 --- a/src/mim-config.c +++ b/src/mim-config.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include "m17n-im-config.h" @@ -35,6 +36,15 @@ #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 (); +} + /* 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; }