X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fcommand.c;h=49d1ad8345bb1fb7215ed7040ce361e6a5f2cabb;hb=e4578ec40f811633bc59362a83081ee84a811e95;hp=c53a5ebf27923f0b32936b47d169a47d97de1e29;hpb=6b0581f0d15b58f39c6a2720488d1f2e65aafb66;p=m17n%2Fm17n-im-config.git diff --git a/src/command.c b/src/command.c index c53a5eb..49d1ad8 100644 --- a/src/command.c +++ b/src/command.c @@ -25,21 +25,43 @@ (minput_get_command \ (current_lang, current_name, current_command)))))) +#define CURRENT_DESCRIPTION \ + (mtext_data \ + (mplist_value \ + (mplist_next \ + (mplist_value \ + (minput_get_command \ + (current_lang, current_name, current_command)))), \ + NULL, NULL, NULL, NULL)) + #define CONFIG_COMMAND(plist) \ minput_config_command (current_lang, current_name, current_command, \ (plist)) +static void +mtext__cat_str (MText *mt, char *str) +{ + while (*str) + { + mtext_cat_char (mt, (int) *str); + str++; + } +} + static unsigned modifier_state = 0; static MPlist *entry_keyseq; static MSymbol current_lang, current_name, current_command; struct BindingWidgets { + GtkWidget *view; + GtkWidget *default_; + GtkWidget *revert; + GtkWidget *delete; GtkWidget *entry; GtkWidget *clear; GtkWidget *add; - GtkWidget *view; - GtkWidget *delete; + GtkWidget *status; }; enum KeyMaskBit { @@ -106,7 +128,7 @@ update_binding_store (GtkWidget *view) } } -gboolean +static gboolean key_pressed_cb (GtkEntry *entry, GdkEventKey *event, gpointer data) { guint c; @@ -169,7 +191,7 @@ key_pressed_cb (GtkEntry *entry, GdkEventKey *event, gpointer data) return TRUE; } -gboolean +static gboolean key_released_cb (GtkEntry *entry, GdkEventKey *event, gpointer data) { guint c; @@ -193,6 +215,28 @@ key_released_cb (GtkEntry *entry, GdkEventKey *event, gpointer data) } static void +update_widgets (struct BindingWidgets *bw) +{ + MSymbol status = CURRENT_STATUS; + + if (status == Mconfigured) + { + gtk_widget_set_sensitive (bw->default_, TRUE); + gtk_widget_set_sensitive (bw->revert, TRUE); + } + else if (status == Mcustomized) + { + gtk_widget_set_sensitive (bw->default_, TRUE); + gtk_widget_set_sensitive (bw->revert, FALSE); + } + else + { + gtk_widget_set_sensitive (bw->default_, FALSE); + gtk_widget_set_sensitive (bw->revert, FALSE); + } +} + +static void clear_cb (GtkButton *button, gpointer data) { struct BindingWidgets *bw = data; @@ -243,8 +287,9 @@ add_cb (GtkButton *button, gpointer data) gtk_list_store_set (store, &iter, 0, mplist_value (last), -1); update_binding_store (bw->view); clear_cb (NULL, bw); - gtk_widget_set_sensitive (bw->clear, FALSE); - gtk_widget_set_sensitive (bw->add, FALSE); + gtk_widget_set_sensitive (bw->default_, TRUE); + gtk_widget_set_sensitive (bw->revert, TRUE); + gtk_label_set_text (GTK_LABEL (bw->status), _("modified")); } static GtkWidget * @@ -271,8 +316,8 @@ create_adding_section (struct BindingWidgets *bw) g_signal_connect (G_OBJECT (bw->add), "clicked", G_CALLBACK (add_cb), bw); - vbox = gtk_vbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + vbox = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); hbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6); @@ -309,32 +354,19 @@ keyseq_render_function (GtkTreeViewColumn *column, { MPlist *keyseq, *pl; gint n; - gchar buf[1024]; + MText *mt = mtext (); gtk_tree_model_get (model, iter, 0, &keyseq, -1); - for (pl = keyseq, n = 0; + for (pl = keyseq; pl && mplist_key (pl) == Msymbol; pl = mplist_next (pl)) - n += strlen (msymbol_name ((MSymbol) mplist_value (pl))) + 1; - if (n < sizeof (buf)) - { - buf[0] = '\0'; - for (pl = keyseq; - pl && mplist_key (pl) == Msymbol; - pl = mplist_next (pl)) - { - strcat (buf, msymbol_name ((MSymbol) mplist_value (pl))); - strcat (buf, " "); - } - g_object_set (renderer, "foreground-set", FALSE, NULL); - } - else { - g_snprintf (buf, sizeof (buf), _("Too long to display")); - g_object_set (renderer, "foreground", "Red", "foreground-set", TRUE, - NULL); + mtext__cat_str (mt, msymbol_name ((MSymbol) mplist_value (pl))); + mtext_cat_char (mt, ' '); } - g_object_set (renderer, "text", buf, NULL); + g_object_set (renderer, "text", mtext_data (mt, NULL, NULL, NULL, NULL), + NULL); + m17n_object_unref (mt); } static void * @@ -346,6 +378,17 @@ default_cb (GtkButton *button, gpointer data) CONFIG_COMMAND (empty); m17n_object_unref (empty); update_binding_store (bw->view); + gtk_widget_set_sensitive (bw->default_, FALSE); + if (CURRENT_STATUS == Mconfigured) + { + gtk_widget_set_sensitive (bw->revert, TRUE); + gtk_label_set_text (GTK_LABEL (bw->status), _("modified")); + } + else + { + gtk_widget_set_sensitive (bw->revert, FALSE); + gtk_label_set_text (GTK_LABEL (bw->status), _("default")); + } } static void * @@ -355,6 +398,17 @@ revert_cb (GtkButton *button, gpointer data) CONFIG_COMMAND (NULL); update_binding_store (bw->view); + gtk_widget_set_sensitive (bw->revert, FALSE); + if (CURRENT_STATUS == Mnil) + { + gtk_widget_set_sensitive (bw->default_, FALSE); + gtk_label_set_text (GTK_LABEL (bw->status), _("default")); + } + else + { + gtk_widget_set_sensitive (bw->default_, TRUE); + gtk_label_set_text (GTK_LABEL (bw->status), _("customized")); + } } static void @@ -380,23 +434,29 @@ delete_cb (GtkButton *button, gpointer data) m17n_object_unref (new); gtk_list_store_remove (GTK_LIST_STORE (model), &iter); update_binding_store (bw->view); - gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); + update_widgets (bw); + gtk_widget_set_sensitive (bw->default_, TRUE); + gtk_widget_set_sensitive (bw->revert, TRUE); + gtk_label_set_text (GTK_LABEL (bw->status), _("modified")); } static GtkWidget * create_deleting_section (struct BindingWidgets *bw) { GtkListStore *store; - GtkWidget *scrolled, *default_, *revert, *delete, *hbox, *vbox; + GtkWidget *label, *scrolled, *hbox, *vbox; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeIter iter; GtkTreeSelection *selection; MPlist *pl; + label = gtk_label_new (_("Current key bindings:")); + store = gtk_list_store_new (1, G_TYPE_POINTER); bw->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); g_object_unref (G_OBJECT (store)); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (bw->view), FALSE); update_binding_store (bw->view); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(bw->view)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); @@ -410,7 +470,6 @@ create_deleting_section (struct BindingWidgets *bw) bw->view); column = gtk_tree_view_column_new (); - gtk_tree_view_column_set_title (column, _("Current Key Bindings")); gtk_tree_view_append_column (GTK_TREE_VIEW (bw->view), column); renderer = gtk_cell_renderer_text_new (); @@ -418,12 +477,12 @@ create_deleting_section (struct BindingWidgets *bw) gtk_tree_view_column_set_cell_data_func (column, renderer, keyseq_render_function, NULL, NULL); - default_ = gtk_button_new_from_stock (_("_Default")); - g_signal_connect (G_OBJECT (default_), "clicked", + bw->default_ = gtk_button_new_from_stock (_("_Default")); + g_signal_connect (G_OBJECT (bw->default_), "clicked", G_CALLBACK (default_cb), bw); - revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED); - g_signal_connect (G_OBJECT (revert), "clicked", + bw->revert = gtk_button_new_from_stock (GTK_STOCK_REVERT_TO_SAVED); + g_signal_connect (G_OBJECT (bw->revert), "clicked", G_CALLBACK (revert_cb), bw); bw->delete = gtk_button_new_from_stock (GTK_STOCK_DELETE); @@ -431,22 +490,42 @@ create_deleting_section (struct BindingWidgets *bw) g_signal_connect (G_OBJECT (bw->delete), "clicked", G_CALLBACK (delete_cb), bw); - vbox = gtk_vbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 6); + vbox = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6); + gtk_container_add (GTK_CONTAINER (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), scrolled); 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), bw->default_); + gtk_container_add (GTK_CONTAINER (hbox), bw->revert); gtk_container_add (GTK_CONTAINER (hbox), bw->delete); gtk_container_add (GTK_CONTAINER (vbox), hbox); return vbox; } +static void * +help_cb (GtkButton *button, gpointer data) +{ + struct BindingWidgets *bw = data; + GtkWidget *msg; + + msg = gtk_message_dialog_new (GTK_WINDOW + (gtk_widget_get_toplevel (bw->view)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, + CURRENT_DESCRIPTION); + gtk_dialog_run (GTK_DIALOG (msg)); + gtk_widget_destroy (msg); +} + static void set_status (GtkListStore *store, GtkTreeIter *iter) { @@ -454,12 +533,12 @@ set_status (GtkListStore *store, GtkTreeIter *iter) gchar *status_str; status = CURRENT_STATUS; - if (status == Mnil || status == Minherited) - status_str = _("default"); + if (status == Mconfigured) + status_str = _("modified"); else if (status == Mcustomized) status_str = _("customized"); else - status_str = _("modified"); + status_str = _("default"); gtk_list_store_set (store, iter, 1, status_str, -1); } @@ -469,7 +548,8 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, { GtkTreeModel *model; GtkTreeIter iter; - GtkWidget *dialog; + GtkWidget *dialog, *label, *help, *vbox, *hbox; + MSymbol status; struct BindingWidgets bw; gchar *command; @@ -479,17 +559,70 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, gtk_tree_model_get (model, &iter, 0, &command, -1); current_command = msymbol (command); + /* dialog = (gtk_dialog_new_with_buttons (command, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent))), GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + GTK_STOCK_OK, GTK_RESPONSE_OK, NULL)); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), - create_adding_section (&bw)); + */ + dialog = gtk_dialog_new (); + gtk_window_set_title (GTK_WINDOW (dialog), command); + gtk_window_set_transient_for + (GTK_WINDOW (dialog), + GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (parent)))); + gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); + gtk_button_box_set_layout (GTK_BUTTON_BOX (GTK_DIALOG (dialog)->action_area), + GTK_BUTTONBOX_EDGE); + + help = gtk_button_new_from_stock (GTK_STOCK_HELP); + g_signal_connect (G_OBJECT (help), "clicked", + G_CALLBACK (help_cb), &bw); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), + help, FALSE, FALSE, 0); + + gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), create_deleting_section (&bw)); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), + create_adding_section (&bw)); + + vbox = gtk_vbox_new (FALSE, 12); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox); + + hbox = gtk_hbox_new (FALSE, 6); + gtk_container_add (GTK_CONTAINER (vbox), hbox); + + label = gtk_label_new (_("Status : ")); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); + + bw.status = gtk_label_new (NULL); + gtk_box_pack_start (GTK_BOX (hbox), bw.status, FALSE, FALSE, 0); + + status = CURRENT_STATUS; + if (status == Mconfigured) + { + gtk_widget_set_sensitive (bw.default_, TRUE); + gtk_widget_set_sensitive (bw.revert, TRUE); + gtk_label_set_text (GTK_LABEL (bw.status), _("modified")); + } + else if (status == Mcustomized) + { + gtk_widget_set_sensitive (bw.default_, TRUE); + gtk_widget_set_sensitive (bw.revert, FALSE); + gtk_label_set_text (GTK_LABEL (bw.status), _("customized")); + } + else + { + gtk_widget_set_sensitive (bw.default_, FALSE); + gtk_widget_set_sensitive (bw.revert, FALSE); + gtk_label_set_text (GTK_LABEL (bw.status), _("default")); + } + gtk_widget_show_all (dialog); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_tree_model_get_iter (model, &iter, path); @@ -499,7 +632,7 @@ activated_cb (GtkTreeView *parent, GtkTreePath *path, } GtkWidget * -create_command_entries (GtkTooltips *tip, MSymbol lang, MSymbol name) +create_command_list (MSymbol lang, MSymbol name) { GtkListStore *store; GtkWidget *view;