X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fvariable.c;h=ad189a5fb64ae665828cb4747d1d9e674ba4a29b;hb=155ef5f0b7a71564f3f4cb049afc05fbc38715f4;hp=49ff0ec5a30b7b54151e917c66a0008869b22d8f;hpb=6b0581f0d15b58f39c6a2720488d1f2e65aafb66;p=m17n%2Fm17n-im-config.git diff --git a/src/variable.c b/src/variable.c index 49ff0ec..ad189a5 100644 --- a/src/variable.c +++ b/src/variable.c @@ -16,11 +16,12 @@ (current_lang, current_name, current_variable)))))) #define CURRENT_STATUS \ - (mplist_next \ + (mplist_value \ (mplist_next \ - (mplist_value \ - (minput_get_variable \ - (current_lang, current_name, current_variable))))) + (mplist_next \ + (mplist_value \ + (minput_get_variable \ + (current_lang, current_name, current_variable)))))) #define CONFIG_VARIABLE(plist) \ minput_config_variable (current_lang, current_name, current_variable, \ @@ -43,11 +44,91 @@ struct ControllerInfo /* type of widget */ enum WidgetType wtype; + + /* default button */ + GtkWidget *default_; + + /* revert button */ + GtkWidget *revert; + + /* apply button */ + GtkWidget *apply; + + /* status label */ + GtkWidget *status; }; static MSymbol current_lang, current_name, current_variable; static void +update_controller (struct ControllerInfo *ci) +{ + MPlist *plist; + MSymbol key, status; + void *value; + + status = CURRENT_STATUS; + if (status == Mconfigured) + { + gtk_widget_set_sensitive (ci->default_, TRUE); + gtk_widget_set_sensitive (ci->revert, TRUE); + gtk_widget_set_sensitive (ci->apply, FALSE); + gtk_label_set_text (GTK_LABEL (ci->status), _("Status : modified")); + } + else if (status == Mcustomized) + { + gtk_widget_set_sensitive (ci->default_, TRUE); + gtk_widget_set_sensitive (ci->revert, FALSE); + gtk_widget_set_sensitive (ci->apply, FALSE); + gtk_label_set_text (GTK_LABEL (ci->status), _("Status : customized")); + } + else + { + gtk_widget_set_sensitive (ci->default_, FALSE); + gtk_widget_set_sensitive (ci->revert, FALSE); + gtk_widget_set_sensitive (ci->apply, FALSE); + gtk_label_set_text (GTK_LABEL (ci->status), _("Status : default")); + } + + plist = CURRENT_VALUE; + /* plist == (value [valid-value ...]) */ + key = mplist_key (plist); + value = mplist_value (plist); + + if (ci->wtype == ENTRY_WIDGET) + { + if (key == Msymbol) + gtk_entry_set_text (GTK_ENTRY (ci->widget), + msymbol_name ((MSymbol) value)); + else if (key == Mtext) + /* Fixme : Assuming the return value is in UTF-8 */ + gtk_entry_set_text (GTK_ENTRY (ci->widget), + mtext_data ((MText *) value, + NULL, NULL, NULL, NULL)); + else + { + gchar buf[32]; + g_snprintf (buf, sizeof (buf), "%d", (gint) value); + gtk_entry_set_text (GTK_ENTRY (ci->widget), buf); + } + } + else if (ci->wtype == COMBO_BOX_WIDGET) + { + gint i; + + for (i = 0, plist = mplist_next (plist); + plist && mplist_key (plist) == key; + i++, plist = mplist_next (plist)) + if (mplist_value (plist) == value) + break; + gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), i); + } + else + gtk_spin_button_set_value (GTK_SPIN_BUTTON (ci->widget), + (gdouble) (int) value); +} + +static void entry_cb (GtkEntry *entry, gpointer data) { const gchar *text = gtk_entry_get_text (entry); @@ -99,6 +180,7 @@ entry_cb (GtkEntry *entry, gpointer data) gtk_editable_set_position (GTK_EDITABLE (entry), -1); } m17n_object_unref (plist); + update_controller (ci); } static void @@ -132,6 +214,7 @@ combo_cb (GtkComboBox *combo, gpointer data) CONFIG_VARIABLE (plist); } m17n_object_unref (plist); + update_controller (ci); } static void @@ -144,6 +227,7 @@ spin_cb (GtkSpinButton *spin, gpointer data) (void *) gtk_spin_button_get_value_as_int (spin)); CONFIG_VARIABLE (plist); m17n_object_unref (plist); + update_controller (ci); } enum @@ -161,17 +245,15 @@ set_value_status (GtkListStore *store, GtkTreeIter *iter) MSymbol status; gchar *value_str, *status_str, buf[32]; - plist = CURRENT_STATUS; - /* plist == (status value [valid-value ...]) */ - status = mplist_value (plist); - if (status == Mnil || status == Minherited) - status_str = _("default"); + status = CURRENT_STATUS; + if (status == Mconfigured) + status_str = _("modified"); else if (status == Mcustomized) status_str = _("customized"); else - status_str = _("modified"); + status_str = _("default"); - plist = mplist_next (plist); + plist = CURRENT_VALUE; /* plist == (value [valid-value ...]) */ if (mplist_key (plist) == Msymbol) value_str = msymbol_name ((MSymbol) mplist_value (plist)); @@ -191,6 +273,17 @@ set_value_status (GtkListStore *store, GtkTreeIter *iter) -1); } +static gboolean +key_pressed_cb (GtkEntry *entry, GdkEventKey *event, gpointer data) +{ + struct ControllerInfo *ci = data; + + gtk_widget_set_sensitive (ci->default_, TRUE); + gtk_widget_set_sensitive (ci->revert, TRUE); + gtk_widget_set_sensitive (ci->apply, TRUE); + return FALSE; +} + static GtkWidget * create_widget (struct ControllerInfo *ci) { @@ -233,6 +326,8 @@ create_widget (struct ControllerInfo *ci) gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE); g_signal_connect (G_OBJECT (ci->widget), "activate", G_CALLBACK (entry_cb), ci); + g_signal_connect (G_OBJECT (ci->widget), "key-press-event", + G_CALLBACK (key_pressed_cb), ci); } } else if (ci->vtype == Mtext) @@ -270,6 +365,8 @@ create_widget (struct ControllerInfo *ci) gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE); g_signal_connect (G_OBJECT (ci->widget), "activate", G_CALLBACK (entry_cb), ci); + g_signal_connect (G_OBJECT (ci->widget), "key-press-event", + G_CALLBACK (key_pressed_cb), ci); } } else if (ci->vtype == Minteger) @@ -311,8 +408,12 @@ create_widget (struct ControllerInfo *ci) gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (ci->widget), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (ci->widget), GTK_UPDATE_IF_VALID); + g_signal_connect (G_OBJECT (ci->widget), "activate", + G_CALLBACK (entry_cb), ci); g_signal_connect (G_OBJECT (ci->widget), "value_changed", G_CALLBACK (spin_cb), ci); + g_signal_connect (G_OBJECT (ci->widget), "key-press-event", + G_CALLBACK (key_pressed_cb), ci); } else { @@ -325,9 +426,11 @@ create_widget (struct ControllerInfo *ci) gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE); g_signal_connect (G_OBJECT (ci->widget), "activate", G_CALLBACK (entry_cb), ci); + g_signal_connect (G_OBJECT (ci->widget), "key-press-event", + G_CALLBACK (key_pressed_cb), ci); } } - else + else /* should never come here */ { ci->widget = gtk_entry_new (); ci->wtype = ENTRY_WIDGET; @@ -335,70 +438,30 @@ create_widget (struct ControllerInfo *ci) gtk_editable_set_editable (GTK_EDITABLE (ci->widget), TRUE); g_signal_connect (G_OBJECT (ci->widget), "activate", G_CALLBACK (entry_cb), ci); + g_signal_connect (G_OBJECT (ci->widget), "key-press-event", + G_CALLBACK (key_pressed_cb), ci); } return ci->widget; } -static void -update_controller (struct ControllerInfo *ci) -{ - MPlist *plist; - MSymbol key; - void *value; - - plist = CURRENT_VALUE; - /* plist == (value [valid-value ...]) */ - key = mplist_key (plist); - value = mplist_value (plist); - - if (ci->wtype == ENTRY_WIDGET) - { - if (key == Msymbol) - gtk_entry_set_text (GTK_ENTRY (ci->widget), - msymbol_name ((MSymbol) value)); - else if (key == Mtext) - /* Fixme : Assuming the return value is in UTF-8 */ - gtk_entry_set_text (GTK_ENTRY (ci->widget), - mtext_data ((MText *) value, - NULL, NULL, NULL, NULL)); - else - { - gchar buf[32]; - g_snprintf (buf, sizeof (buf), "%d", (gint) value); - gtk_entry_set_text (GTK_ENTRY (ci->widget), buf); - } - } - else if (ci->wtype == COMBO_BOX_WIDGET) - { - gint i; - - for (i = 0, plist = mplist_next (plist); - plist && mplist_key (plist) == key; - i++, plist = mplist_next (plist)) - if (mplist_value (plist) == value) - break; - gtk_combo_box_set_active (GTK_COMBO_BOX (ci->widget), i); - } - else - gtk_spin_button_set_value (GTK_SPIN_BUTTON (ci->widget), - (gdouble) (int) value); -} - static void * default_cb (GtkButton *button, gpointer data) { MPlist *empty = mplist (); + struct ControllerInfo *ci = data; CONFIG_VARIABLE (empty); m17n_object_unref (empty); - update_controller ((struct ControllerInfo *) data); + update_controller (ci); } static void * revert_cb (GtkButton *button, gpointer data) { + struct ControllerInfo *ci = data; + CONFIG_VARIABLE (NULL); - update_controller ((struct ControllerInfo *) data); + update_controller (ci); } static void * @@ -408,6 +471,7 @@ apply_cb (GtkButton *button, gpointer data) if (ci->wtype == ENTRY_WIDGET) entry_cb (GTK_ENTRY (ci->widget), ci); + update_controller (ci); } static void @@ -416,7 +480,7 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, { GtkTreeModel *model; GtkTreeIter iter; - GtkWidget *dialog, *default_, *revert, *apply, *hbox, *vbox; + GtkWidget *dialog, *hbox, *vbox; struct ControllerInfo ci; gchar *variable; @@ -433,18 +497,20 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL)); - default_ = gtk_button_new_from_stock (_("_Default")); - g_signal_connect (G_OBJECT (default_), "clicked", + ci.default_ = gtk_button_new_from_stock (_("_Default")); + g_signal_connect (G_OBJECT (ci.default_), "clicked", G_CALLBACK (default_cb), &ci); - revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED); - g_signal_connect (G_OBJECT (revert), "clicked", + ci.revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED); + g_signal_connect (G_OBJECT (ci.revert), "clicked", G_CALLBACK (revert_cb), &ci); - apply = gtk_button_new_from_stock (GTK_STOCK_APPLY); - g_signal_connect (G_OBJECT (apply), "clicked", + ci.apply = gtk_button_new_from_stock (GTK_STOCK_APPLY); + g_signal_connect (G_OBJECT (ci.apply), "clicked", G_CALLBACK (apply_cb), &ci); + ci.status = gtk_label_new (NULL); + vbox = gtk_vbox_new (FALSE, 6); gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); @@ -454,11 +520,14 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, hbox = gtk_hbutton_box_new (); gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END); gtk_box_set_spacing (GTK_BOX (hbox), 6); - gtk_container_add (GTK_CONTAINER (hbox), default_); - gtk_container_add (GTK_CONTAINER (hbox), revert); - gtk_container_add (GTK_CONTAINER (hbox), apply); + gtk_container_add (GTK_CONTAINER (hbox), ci.default_); + gtk_container_add (GTK_CONTAINER (hbox), ci.revert); + gtk_container_add (GTK_CONTAINER (hbox), ci.apply); gtk_container_add (GTK_CONTAINER (vbox), hbox); + + gtk_container_add (GTK_CONTAINER (vbox), ci.status); + update_controller (&ci); gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_tree_model_get_iter (model, &iter, path); @@ -467,7 +536,7 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, } GtkWidget * -create_variable_entries (GtkTooltips *tip, MSymbol lang, MSymbol name) +create_variable_list (GtkTooltips *tip, MSymbol lang, MSymbol name) { GtkListStore *store; GtkWidget *view;