From 9d9d09a564d969bf3193963cb606284b64c23932 Mon Sep 17 00:00:00 2001 From: "Sergey V. Udaltsov" Date: Sat, 10 Jan 2004 00:06:29 +0000 Subject: [PATCH] fixes for utf and non-utf locales --- .../keyboard/gnome-keyboard-properties-xkb.c | 2 +- .../gnome-keyboard-properties-xkblt.c | 438 ++++++++-------- .../gnome-keyboard-properties-xkbot.c | 491 +++++++++--------- 3 files changed, 458 insertions(+), 473 deletions(-) diff --git a/capplets/keyboard/gnome-keyboard-properties-xkb.c b/capplets/keyboard/gnome-keyboard-properties-xkb.c index 9f5e42bc0..a6265af69 100644 --- a/capplets/keyboard/gnome-keyboard-properties-xkb.c +++ b/capplets/keyboard/gnome-keyboard-properties-xkb.c @@ -135,7 +135,7 @@ add_model_to_option_menu (const XklConfigItemPtr configItem, GtkWidget * menu) GtkWidget *menuItem = GTK_WIDGET (existingItemNode->data); GtkWidget *lbl = GTK_BIN (menuItem)->child; const char *txt = gtk_label_get_text (GTK_LABEL (lbl)); - if (g_strcasecmp (txt, utfModelName) > 0) + if (g_utf8_collate(txt, utfModelName) > 0) break; } g_free (utfModelName); diff --git a/capplets/keyboard/gnome-keyboard-properties-xkblt.c b/capplets/keyboard/gnome-keyboard-properties-xkblt.c index e72b0720d..51840e8d8 100644 --- a/capplets/keyboard/gnome-keyboard-properties-xkblt.c +++ b/capplets/keyboard/gnome-keyboard-properties-xkblt.c @@ -47,12 +47,13 @@ static int maxSelectedLayouts = -1; void clear_xkb_elements_list (GSList * list) { - while (list != NULL) { - GSList *p = list; - list = list->next; - g_free (p->data); - g_slist_free_1 (p); - } + while (list != NULL) + { + GSList *p = list; + list = list->next; + g_free (p->data); + g_slist_free_1 (p); + } } #define get_selected_layouts_list() \ @@ -69,313 +70,300 @@ static void add_variant_to_available_layouts_tree (const XklConfigItemPtr configItem, GladeXML * dialog) { - GtkWidget *layoutsTree = WID ("xkb_layouts_available"); - GtkTreeIter iter; - GtkTreeStore *treeStore = - GTK_TREE_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW (layoutsTree))); - const gchar *fullLayoutName = - GSwitchItConfigMergeItems (current1stLevelId, - configItem->name); - char *utfVariantName = xci_desc_to_utf8 (configItem); + GtkWidget *layoutsTree = WID ("xkb_layouts_available"); + GtkTreeIter iter; + GtkTreeStore *treeStore = + GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (layoutsTree))); + const gchar *fullLayoutName = GSwitchItConfigMergeItems (current1stLevelId, + configItem->name); + char *utfVariantName = xci_desc_to_utf8 (configItem); - gtk_tree_store_append (treeStore, &iter, ¤t1stLevelIter); - gtk_tree_store_set (treeStore, &iter, 0, utfVariantName, 1, - fullLayoutName, -1); - g_free (utfVariantName); + gtk_tree_store_append (treeStore, &iter, ¤t1stLevelIter); + gtk_tree_store_set (treeStore, &iter, 0, utfVariantName, 1, + fullLayoutName, -1); + g_free (utfVariantName); } static void add_layout_to_available_layouts_tree (const XklConfigItemPtr configItem, GladeXML * dialog) { - GtkWidget *layoutsTree = WID ("xkb_layouts_available"); - GtkTreeStore *treeStore = - GTK_TREE_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW (layoutsTree))); - char *utfLayoutName = xci_desc_to_utf8 (configItem); + GtkWidget *layoutsTree = WID ("xkb_layouts_available"); + GtkTreeStore *treeStore = + GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (layoutsTree))); + char *utfLayoutName = xci_desc_to_utf8 (configItem); - gtk_tree_store_append (treeStore, ¤t1stLevelIter, NULL); - gtk_tree_store_set (treeStore, ¤t1stLevelIter, 0, - utfLayoutName, 1, configItem->name, -1); - g_free (utfLayoutName); + gtk_tree_store_append (treeStore, ¤t1stLevelIter, NULL); + gtk_tree_store_set (treeStore, ¤t1stLevelIter, 0, + utfLayoutName, 1, configItem->name, -1); + g_free (utfLayoutName); - current1stLevelId = configItem->name; + current1stLevelId = configItem->name; - XklConfigEnumLayoutVariants (configItem->name, - (ConfigItemProcessFunc) - add_variant_to_available_layouts_tree, - dialog); + XklConfigEnumLayoutVariants (configItem->name, + (ConfigItemProcessFunc) + add_variant_to_available_layouts_tree, dialog); } static void enable_disable_layouts_buttons (GladeXML * dialog) { - GtkWidget *addLayoutBtn = WID ("xkb_layouts_add"); - GtkWidget *delLayoutBtn = WID ("xkb_layouts_remove"); - GtkWidget *upLayoutBtn = WID ("xkb_layouts_up"); - GtkWidget *dnLayoutBtn = WID ("xkb_layouts_down"); - GtkWidget *availableLayoutsTree = WID ("xkb_layouts_available"); - GtkWidget *selectedLayoutsTree = WID ("xkb_layouts_selected"); + GtkWidget *addLayoutBtn = WID ("xkb_layouts_add"); + GtkWidget *delLayoutBtn = WID ("xkb_layouts_remove"); + GtkWidget *upLayoutBtn = WID ("xkb_layouts_up"); + GtkWidget *dnLayoutBtn = WID ("xkb_layouts_down"); + GtkWidget *availableLayoutsTree = WID ("xkb_layouts_available"); + GtkWidget *selectedLayoutsTree = WID ("xkb_layouts_selected"); - GtkTreeSelection *aSelection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (availableLayoutsTree)); - const int nSelectedAvailableLayouts = - gtk_tree_selection_count_selected_rows (aSelection); - GtkTreeSelection *sSelection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (selectedLayoutsTree)); - const int nSelectedSelectedLayouts = - gtk_tree_selection_count_selected_rows (sSelection); - gboolean canMoveUp = FALSE; - gboolean canMoveDn = FALSE; - GtkTreeIter iter; - GtkTreeModel *selectedLayoutsModel = gtk_tree_view_get_model - (GTK_TREE_VIEW (selectedLayoutsTree)); - const int nSelectedLayouts = - gtk_tree_model_iter_n_children (selectedLayoutsModel, - NULL); + GtkTreeSelection *aSelection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (availableLayoutsTree)); + const int nSelectedAvailableLayouts = + gtk_tree_selection_count_selected_rows (aSelection); + GtkTreeSelection *sSelection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (selectedLayoutsTree)); + const int nSelectedSelectedLayouts = + gtk_tree_selection_count_selected_rows (sSelection); + gboolean canMoveUp = FALSE; + gboolean canMoveDn = FALSE; + GtkTreeIter iter; + GtkTreeModel *selectedLayoutsModel = gtk_tree_view_get_model + (GTK_TREE_VIEW (selectedLayoutsTree)); + const int nSelectedLayouts = + gtk_tree_model_iter_n_children (selectedLayoutsModel, + NULL); - gtk_widget_set_sensitive (addLayoutBtn, - (nSelectedAvailableLayouts > 0) - && (nSelectedLayouts < - maxSelectedLayouts)); - gtk_widget_set_sensitive (delLayoutBtn, - nSelectedSelectedLayouts > 0); + gtk_widget_set_sensitive (addLayoutBtn, + (nSelectedAvailableLayouts > 0) + && (nSelectedLayouts < maxSelectedLayouts)); + gtk_widget_set_sensitive (delLayoutBtn, nSelectedSelectedLayouts > 0); - if (gtk_tree_selection_get_selected (sSelection, NULL, &iter)) { - GtkTreePath *path = - gtk_tree_model_get_path (selectedLayoutsModel, - &iter); - if (path != NULL) { - int *indices = gtk_tree_path_get_indices (path); - int idx = indices[0]; - canMoveUp = idx > 0; - canMoveDn = idx < (nSelectedLayouts - 1); - gtk_tree_path_free (path); - } + if (gtk_tree_selection_get_selected (sSelection, NULL, &iter)) + { + GtkTreePath *path = gtk_tree_model_get_path (selectedLayoutsModel, + &iter); + if (path != NULL) + { + int *indices = gtk_tree_path_get_indices (path); + int idx = indices[0]; + canMoveUp = idx > 0; + canMoveDn = idx < (nSelectedLayouts - 1); + gtk_tree_path_free (path); } - gtk_widget_set_sensitive (upLayoutBtn, canMoveUp); - gtk_widget_set_sensitive (dnLayoutBtn, canMoveDn); + } + gtk_widget_set_sensitive (upLayoutBtn, canMoveUp); + gtk_widget_set_sensitive (dnLayoutBtn, canMoveDn); } void prepare_selected_layouts_tree (GladeXML * dialog) { - GtkListStore *listStore = - gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - GtkWidget *treeView = WID ("xkb_layouts_selected"); - GtkCellRenderer *renderer = - GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); - GtkTreeViewColumn *column = - gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "text", - 0, - NULL); - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), - GTK_TREE_MODEL (listStore)); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); - g_signal_connect_swapped (G_OBJECT (selection), "changed", - G_CALLBACK - (enable_disable_layouts_buttons), - dialog); - maxSelectedLayouts = - XklMultipleLayoutsSupported ()? XkbNumKbdGroups : 1; + GtkListStore *listStore = + gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + GtkWidget *treeView = WID ("xkb_layouts_selected"); + GtkCellRenderer *renderer = + GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + 0, + NULL); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), + GTK_TREE_MODEL (listStore)); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); + g_signal_connect_swapped (G_OBJECT (selection), "changed", + G_CALLBACK + (enable_disable_layouts_buttons), dialog); + maxSelectedLayouts = XklMultipleLayoutsSupported ()? XkbNumKbdGroups : 1; } void fill_selected_layouts_tree (GladeXML * dialog) { - GSList *layouts = get_selected_layouts_list (); - GSList *curLayout; - GtkListStore *listStore = - GTK_LIST_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW - (WID ("xkb_layouts_selected")))); - gtk_list_store_clear (listStore); + GSList *layouts = get_selected_layouts_list (); + GSList *curLayout; + GtkListStore *listStore = + GTK_LIST_STORE (gtk_tree_view_get_model + (GTK_TREE_VIEW (WID ("xkb_layouts_selected")))); + gtk_list_store_clear (listStore); - for (curLayout = layouts; curLayout != NULL; - curLayout = curLayout->next) { - GtkTreeIter iter; - char *l, *sl, *v, *sv; - const char *visible = (char *) curLayout->data; - gtk_list_store_append (listStore, &iter); - if (GSwitchItConfigGetDescriptions - (visible, &sl, &l, &sv, &v)) - visible = GSwitchItConfigFormatFullLayout (l, v); - gtk_list_store_set (listStore, &iter, - 0, visible, 1, curLayout->data, -1); - } + for (curLayout = layouts; curLayout != NULL; curLayout = curLayout->next) + { + GtkTreeIter iter; + char *l, *sl, *v, *sv; + char *v1, *utfVisible; + const char *visible = (char *) curLayout->data; + gtk_list_store_append (listStore, &iter); + if (GSwitchItConfigGetDescriptions (visible, &sl, &l, &sv, &v)) + visible = GSwitchItConfigFormatFullLayout (l, v); + v1 = g_strdup (visible); + utfVisible = g_locale_to_utf8 (g_strstrip (v1), -1, NULL, NULL, NULL); + gtk_list_store_set (listStore, &iter, + 0, utfVisible, 1, curLayout->data, -1); + g_free (utfVisible); + g_free (v1); + } - clear_xkb_elements_list (layouts); - enable_disable_layouts_buttons (dialog); - if (idx2Select != -1) { - GtkTreeSelection *selection = - gtk_tree_view_get_selection ((GTK_TREE_VIEW - (WID - ("xkb_layouts_selected")))); - GtkTreePath *path = - gtk_tree_path_new_from_indices (idx2Select, -1); - gtk_tree_selection_select_path (selection, path); - gtk_tree_path_free (path); - idx2Select = -1; - } + clear_xkb_elements_list (layouts); + enable_disable_layouts_buttons (dialog); + if (idx2Select != -1) + { + GtkTreeSelection *selection = + gtk_tree_view_get_selection ((GTK_TREE_VIEW + (WID ("xkb_layouts_selected")))); + GtkTreePath *path = gtk_tree_path_new_from_indices (idx2Select, -1); + gtk_tree_selection_select_path (selection, path); + gtk_tree_path_free (path); + idx2Select = -1; + } } void sort_tree_content (GtkWidget * treeView) { - GtkTreeModel *treeModel = - gtk_tree_view_get_model (GTK_TREE_VIEW (treeView)); - GtkTreeModel *sortedTreeModel; - /* replace the store with the sorted version */ - sortedTreeModel = gtk_tree_model_sort_new_with_model (treeModel); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE - (sortedTreeModel), 0, - GTK_SORT_ASCENDING); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), - sortedTreeModel); + GtkTreeModel *treeModel = + gtk_tree_view_get_model (GTK_TREE_VIEW (treeView)); + GtkTreeModel *sortedTreeModel; + /* replace the store with the sorted version */ + sortedTreeModel = gtk_tree_model_sort_new_with_model (treeModel); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE + (sortedTreeModel), 0, + GTK_SORT_ASCENDING); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), sortedTreeModel); } void fill_available_layouts_tree (GladeXML * dialog) { - GtkTreeStore *treeStore = - gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING); - GtkWidget *treeView = WID ("xkb_layouts_available"); - GtkCellRenderer *renderer = - GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); - GtkTreeViewColumn *column = - gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "text", - 0, - NULL); - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); + GtkTreeStore *treeStore = + gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING); + GtkWidget *treeView = WID ("xkb_layouts_available"); + GtkCellRenderer *renderer = + GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + 0, + NULL); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), - GTK_TREE_MODEL (treeStore)); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), + GTK_TREE_MODEL (treeStore)); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); - XklConfigEnumLayouts ((ConfigItemProcessFunc) - add_layout_to_available_layouts_tree, - dialog); + XklConfigEnumLayouts ((ConfigItemProcessFunc) + add_layout_to_available_layouts_tree, dialog); - sort_tree_content (treeView); - g_signal_connect_swapped (G_OBJECT (selection), "changed", - G_CALLBACK - (enable_disable_layouts_buttons), - dialog); + sort_tree_content (treeView); + g_signal_connect_swapped (G_OBJECT (selection), "changed", + G_CALLBACK + (enable_disable_layouts_buttons), dialog); } static void add_selected_layout (GtkWidget * button, GladeXML * dialog) { - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (WID ("xkb_layouts_available"))); - GtkTreeIter selectedIter; - GtkTreeModel *model; - if (gtk_tree_selection_get_selected - (selection, &model, &selectedIter)) { - gchar *id; - GSList *layoutsList = get_selected_layouts_list (); - gtk_tree_model_get (model, &selectedIter, 1, &id, -1); - layoutsList = g_slist_append (layoutsList, id); - set_selected_layouts_list (layoutsList); - clear_xkb_elements_list (layoutsList); - } + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW + (WID ("xkb_layouts_available"))); + GtkTreeIter selectedIter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected (selection, &model, &selectedIter)) + { + gchar *id; + GSList *layoutsList = get_selected_layouts_list (); + gtk_tree_model_get (model, &selectedIter, 1, &id, -1); + layoutsList = g_slist_append (layoutsList, id); + set_selected_layouts_list (layoutsList); + clear_xkb_elements_list (layoutsList); + } } static void move_selected_layout (GladeXML * dialog, int offset) { - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (WID ("xkb_layouts_selected"))); - GtkTreeIter selectedIter; - GtkTreeModel *model; - if (gtk_tree_selection_get_selected - (selection, &model, &selectedIter)) { - GSList *layoutsList = get_selected_layouts_list (); - GtkTreePath *path = gtk_tree_model_get_path (model, - &selectedIter); - if (path != NULL) { - int *indices = gtk_tree_path_get_indices (path); - char *id = NULL; - GSList *node2Remove = - g_slist_nth (layoutsList, indices[0]); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW + (WID ("xkb_layouts_selected"))); + GtkTreeIter selectedIter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected (selection, &model, &selectedIter)) + { + GSList *layoutsList = get_selected_layouts_list (); + GtkTreePath *path = gtk_tree_model_get_path (model, + &selectedIter); + if (path != NULL) + { + int *indices = gtk_tree_path_get_indices (path); + char *id = NULL; + GSList *node2Remove = g_slist_nth (layoutsList, indices[0]); - layoutsList = - g_slist_remove_link (layoutsList, node2Remove); + layoutsList = g_slist_remove_link (layoutsList, node2Remove); - id = (char *) node2Remove->data; - g_slist_free_1 (node2Remove); + id = (char *) node2Remove->data; + g_slist_free_1 (node2Remove); - if (offset == 0) - g_free (id); - else { - layoutsList = - g_slist_insert (layoutsList, id, - indices[0] + offset); - idx2Select = indices[0] + offset; - } + if (offset == 0) + g_free (id); + else + { + layoutsList = + g_slist_insert (layoutsList, id, indices[0] + offset); + idx2Select = indices[0] + offset; + } - set_selected_layouts_list (layoutsList); - gtk_tree_path_free (path); - } - clear_xkb_elements_list (layoutsList); + set_selected_layouts_list (layoutsList); + gtk_tree_path_free (path); } + clear_xkb_elements_list (layoutsList); + } } static void remove_selected_layout (GtkWidget * button, GladeXML * dialog) { - move_selected_layout (dialog, 0); + move_selected_layout (dialog, 0); } static void up_selected_layout (GtkWidget * button, GladeXML * dialog) { - move_selected_layout (dialog, -1); + move_selected_layout (dialog, -1); } static void down_selected_layout (GtkWidget * button, GladeXML * dialog) { - move_selected_layout (dialog, +1); + move_selected_layout (dialog, +1); } void register_layouts_buttons_handlers (GladeXML * dialog) { - g_signal_connect (G_OBJECT (WID ("xkb_layouts_add")), "clicked", - G_CALLBACK (add_selected_layout), dialog); - g_signal_connect (G_OBJECT (WID ("xkb_layouts_remove")), "clicked", - G_CALLBACK (remove_selected_layout), dialog); - g_signal_connect (G_OBJECT (WID ("xkb_layouts_up")), "clicked", - G_CALLBACK (up_selected_layout), dialog); - g_signal_connect (G_OBJECT (WID ("xkb_layouts_down")), "clicked", - G_CALLBACK (down_selected_layout), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_layouts_add")), "clicked", + G_CALLBACK (add_selected_layout), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_layouts_remove")), "clicked", + G_CALLBACK (remove_selected_layout), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_layouts_up")), "clicked", + G_CALLBACK (up_selected_layout), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_layouts_down")), "clicked", + G_CALLBACK (down_selected_layout), dialog); } static void update_layouts_list (GConfClient * client, guint cnxn_id, GConfEntry * entry, GladeXML * dialog) { - fill_selected_layouts_tree (dialog); + fill_selected_layouts_tree (dialog); } void register_layouts_gconf_listener (GladeXML * dialog) { - gconf_client_notify_add (gconf_client_get_default (), - GSWITCHIT_CONFIG_XKB_KEY_LAYOUTS, - (GConfClientNotifyFunc) - update_layouts_list, dialog, NULL, NULL); + gconf_client_notify_add (gconf_client_get_default (), + GSWITCHIT_CONFIG_XKB_KEY_LAYOUTS, + (GConfClientNotifyFunc) + update_layouts_list, dialog, NULL, NULL); } diff --git a/capplets/keyboard/gnome-keyboard-properties-xkbot.c b/capplets/keyboard/gnome-keyboard-properties-xkbot.c index 248b8333a..24c3ea2a2 100644 --- a/capplets/keyboard/gnome-keyboard-properties-xkbot.c +++ b/capplets/keyboard/gnome-keyboard-properties-xkbot.c @@ -55,218 +55,216 @@ static const char *current1stLevelId; static gboolean can_add_option (GladeXML * dialog) { - GtkWidget *availableOptionsTree = WID ("xkb_options_available"); - GtkWidget *selectedOptionsTree = WID ("xkb_options_selected"); - GtkTreeSelection *aSelection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (availableOptionsTree)); - GtkTreeIter aiter, siter, groupIter; - GtkTreeModel *availableOptionsModel, *selectedOptionsModel; - GtkTreePath *path, *groupPath; - char *selectedOptionId = NULL, *selectedGroupId = - NULL, *selectedFullOptionId = NULL; - gboolean retval = FALSE, multipleAllowed = TRUE; - int depth; + GtkWidget *availableOptionsTree = WID ("xkb_options_available"); + GtkWidget *selectedOptionsTree = WID ("xkb_options_selected"); + GtkTreeSelection *aSelection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (availableOptionsTree)); + GtkTreeIter aiter, siter, groupIter; + GtkTreeModel *availableOptionsModel, *selectedOptionsModel; + GtkTreePath *path, *groupPath; + char *selectedOptionId = NULL, *selectedGroupId = + NULL, *selectedFullOptionId = NULL; + gboolean retval = FALSE, multipleAllowed = TRUE; + int depth; - if (!gtk_tree_selection_get_selected - (aSelection, &availableOptionsModel, &aiter)) - return FALSE; + if (!gtk_tree_selection_get_selected + (aSelection, &availableOptionsModel, &aiter)) + return FALSE; - path = gtk_tree_model_get_path (availableOptionsModel, &aiter); - if (path == NULL) - return FALSE; + path = gtk_tree_model_get_path (availableOptionsModel, &aiter); + if (path == NULL) + return FALSE; - depth = gtk_tree_path_get_depth (path); + depth = gtk_tree_path_get_depth (path); - if (depth != 2) { - gtk_tree_path_free (path); - return FALSE; + if (depth != 2) + { + gtk_tree_path_free (path); + return FALSE; + } + + if (!gtk_tree_model_iter_parent (availableOptionsModel, &groupIter, &aiter)) + { + gtk_tree_path_free (path); + return FALSE; + } + groupPath = gtk_tree_model_get_path (availableOptionsModel, &groupIter); + if (groupPath == NULL) + { + gtk_tree_path_free (path); + return FALSE; + } + + gtk_tree_model_get (availableOptionsModel, &groupIter, 2, + &multipleAllowed, -1); + + gtk_tree_model_get (availableOptionsModel, &aiter, 1, + &selectedFullOptionId, -1); + + if (!GSwitchItConfigSplitItems + (selectedFullOptionId, &selectedGroupId, &selectedOptionId)) + { + gtk_tree_path_free (groupPath); + gtk_tree_path_free (path); + return FALSE; + } + selectedGroupId = g_strdup (selectedGroupId); + selectedOptionId = g_strdup (selectedOptionId); + + selectedOptionsModel = + gtk_tree_view_get_model (GTK_TREE_VIEW (selectedOptionsTree)); + + retval = TRUE; + + if (gtk_tree_model_get_iter_first (selectedOptionsModel, &siter)) + { + do + { + char *sid = NULL; + gtk_tree_model_get (selectedOptionsModel, &siter, 1, &sid, -1); + if (multipleAllowed) + { + // look for the _same_ option - and do not allow it twice + if (!g_strcasecmp (sid, selectedFullOptionId)) + { + retval = FALSE; + } + } + else + { + // look for options within same group + char *sgid = NULL, *soid = NULL; + gtk_tree_model_get (selectedOptionsModel, &siter, 1, &sid, -1); + if (GSwitchItConfigSplitItems + (sid, &sgid, &soid) + && !g_strcasecmp (sgid, selectedGroupId)) + { + retval = FALSE; + } + } + g_free (sid); } + while (retval && gtk_tree_model_iter_next + (selectedOptionsModel, &siter)); + } - if (!gtk_tree_model_iter_parent - (availableOptionsModel, &groupIter, &aiter)) { - gtk_tree_path_free (path); - return FALSE; - } - groupPath = - gtk_tree_model_get_path (availableOptionsModel, &groupIter); - if (groupPath == NULL) { - gtk_tree_path_free (path); - return FALSE; - } + g_free (selectedFullOptionId); + g_free (selectedGroupId); + g_free (selectedOptionId); - gtk_tree_model_get (availableOptionsModel, &groupIter, 2, - &multipleAllowed, -1); - - gtk_tree_model_get (availableOptionsModel, &aiter, 1, - &selectedFullOptionId, -1); - - if (!GSwitchItConfigSplitItems - (selectedFullOptionId, &selectedGroupId, &selectedOptionId)) { - gtk_tree_path_free (groupPath); - gtk_tree_path_free (path); - return FALSE; - } - selectedGroupId = g_strdup (selectedGroupId); - selectedOptionId = g_strdup (selectedOptionId); - - selectedOptionsModel = - gtk_tree_view_get_model (GTK_TREE_VIEW (selectedOptionsTree)); - - retval = TRUE; - - if (gtk_tree_model_get_iter_first (selectedOptionsModel, &siter)) { - do { - char *sid = NULL; - gtk_tree_model_get (selectedOptionsModel, - &siter, 1, &sid, -1); - if (multipleAllowed) { - // look for the _same_ option - and do not allow it twice - if (!g_strcasecmp - (sid, selectedFullOptionId)) { - retval = FALSE; - } - } else { - // look for options within same group - char *sgid = NULL, *soid = NULL; - gtk_tree_model_get (selectedOptionsModel, - &siter, 1, &sid, -1); - if (GSwitchItConfigSplitItems - (sid, &sgid, &soid) - && !g_strcasecmp (sgid, - selectedGroupId)) { - retval = FALSE; - } - } - g_free (sid); - } while (retval && gtk_tree_model_iter_next - (selectedOptionsModel, &siter)); - } - - g_free (selectedFullOptionId); - g_free (selectedGroupId); - g_free (selectedOptionId); - - gtk_tree_path_free (groupPath); - gtk_tree_path_free (path); - return retval; + gtk_tree_path_free (groupPath); + gtk_tree_path_free (path); + return retval; } static void enable_disable_options_buttons (GladeXML * dialog) { - GtkWidget *addOptionBtn = WID ("xkb_options_add"); - GtkWidget *delOptionBtn = WID ("xkb_options_remove"); - GtkWidget *selectedOptionsTree = WID ("xkb_options_selected"); + GtkWidget *addOptionBtn = WID ("xkb_options_add"); + GtkWidget *delOptionBtn = WID ("xkb_options_remove"); + GtkWidget *selectedOptionsTree = WID ("xkb_options_selected"); - GtkTreeSelection *sSelection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (selectedOptionsTree)); - const int nSelectedSelectedOptions = - gtk_tree_selection_count_selected_rows (sSelection); + GtkTreeSelection *sSelection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (selectedOptionsTree)); + const int nSelectedSelectedOptions = + gtk_tree_selection_count_selected_rows (sSelection); - gtk_widget_set_sensitive (addOptionBtn, can_add_option (dialog)); - gtk_widget_set_sensitive (delOptionBtn, - nSelectedSelectedOptions > 0); + gtk_widget_set_sensitive (addOptionBtn, can_add_option (dialog)); + gtk_widget_set_sensitive (delOptionBtn, nSelectedSelectedOptions > 0); } void prepare_selected_options_tree (GladeXML * dialog) { - GtkListStore *listStore = - gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING); - GtkWidget *treeView = WID ("xkb_options_selected"); - GtkCellRenderer *renderer = - GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); - GtkTreeViewColumn *column = - gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "text", - 0, - NULL); - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), - GTK_TREE_MODEL (listStore)); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); - g_signal_connect_swapped (G_OBJECT (selection), "changed", - G_CALLBACK - (enable_disable_options_buttons), - dialog); + GtkListStore *listStore = + gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING); + GtkWidget *treeView = WID ("xkb_options_selected"); + GtkCellRenderer *renderer = + GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + 0, + NULL); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), + GTK_TREE_MODEL (listStore)); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); + g_signal_connect_swapped (G_OBJECT (selection), "changed", + G_CALLBACK + (enable_disable_options_buttons), dialog); } static void add_selected_option (GtkWidget * button, GladeXML * dialog) { - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (WID ("xkb_options_available"))); - GtkTreeIter selectedIter; - GtkTreeModel *model; - if (gtk_tree_selection_get_selected - (selection, &model, &selectedIter)) { - gchar *id; - GSList *optionsList = get_selected_options_list (); - gtk_tree_model_get (model, &selectedIter, 1, &id, -1); - optionsList = g_slist_append (optionsList, id); - set_selected_options_list (optionsList); - clear_xkb_elements_list (optionsList); - } + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW + (WID ("xkb_options_available"))); + GtkTreeIter selectedIter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected (selection, &model, &selectedIter)) + { + gchar *id; + GSList *optionsList = get_selected_options_list (); + gtk_tree_model_get (model, &selectedIter, 1, &id, -1); + optionsList = g_slist_append (optionsList, id); + set_selected_options_list (optionsList); + clear_xkb_elements_list (optionsList); + } } static void remove_selected_option (GtkWidget * button, GladeXML * dialog) { - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW - (WID ("xkb_options_selected"))); - GtkTreeIter selectedIter; - GtkTreeModel *model; - if (gtk_tree_selection_get_selected - (selection, &model, &selectedIter)) { - GSList *optionsList = get_selected_options_list (); - GtkTreePath *path = gtk_tree_model_get_path (model, - &selectedIter); - if (path != NULL) { - int *indices = gtk_tree_path_get_indices (path); - char *id = NULL; - GSList *node2Remove = - g_slist_nth (optionsList, indices[0]); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW + (WID ("xkb_options_selected"))); + GtkTreeIter selectedIter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected (selection, &model, &selectedIter)) + { + GSList *optionsList = get_selected_options_list (); + GtkTreePath *path = gtk_tree_model_get_path (model, + &selectedIter); + if (path != NULL) + { + int *indices = gtk_tree_path_get_indices (path); + char *id = NULL; + GSList *node2Remove = g_slist_nth (optionsList, indices[0]); - optionsList = - g_slist_remove_link (optionsList, node2Remove); + optionsList = g_slist_remove_link (optionsList, node2Remove); - id = (char *) node2Remove->data; - g_slist_free_1 (node2Remove); + id = (char *) node2Remove->data; + g_slist_free_1 (node2Remove); - g_free (id); + g_free (id); - set_selected_options_list (optionsList); - gtk_tree_path_free (path); - } - clear_xkb_elements_list (optionsList); + set_selected_options_list (optionsList); + gtk_tree_path_free (path); } + clear_xkb_elements_list (optionsList); + } } static void add_option_to_available_options_tree (const XklConfigItemPtr configItem, GladeXML * dialog) { - GtkWidget *optionsTree = WID ("xkb_options_available"); - GtkTreeIter iter; - GtkTreeStore *treeStore = - GTK_TREE_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW (optionsTree))); - const gchar *fullOptionName = - GSwitchItConfigMergeItems (current1stLevelId, - configItem->name); - char *utfOptionName = xci_desc_to_utf8 (configItem); + GtkWidget *optionsTree = WID ("xkb_options_available"); + GtkTreeIter iter; + GtkTreeStore *treeStore = + GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (optionsTree))); + const gchar *fullOptionName = GSwitchItConfigMergeItems (current1stLevelId, + configItem->name); + char *utfOptionName = xci_desc_to_utf8 (configItem); - gtk_tree_store_append (treeStore, &iter, ¤t1stLevelIter); - gtk_tree_store_set (treeStore, &iter, 0, utfOptionName, 1, - fullOptionName, -1); - g_free (utfOptionName); + gtk_tree_store_append (treeStore, &iter, ¤t1stLevelIter); + gtk_tree_store_set (treeStore, &iter, 0, utfOptionName, 1, + fullOptionName, -1); + g_free (utfOptionName); } static void @@ -275,116 +273,115 @@ add_group_to_available_options_tree (const XklConfigItemPtr Bool allowMultipleSelection, GladeXML * dialog) { - GtkWidget *optionsTree = WID ("xkb_options_available"); - GtkTreeStore *treeStore = - GTK_TREE_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW (optionsTree))); - char *utfGroupName = xci_desc_to_utf8 (configItem); + GtkWidget *optionsTree = WID ("xkb_options_available"); + GtkTreeStore *treeStore = + GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (optionsTree))); + char *utfGroupName = xci_desc_to_utf8 (configItem); - gtk_tree_store_append (treeStore, ¤t1stLevelIter, NULL); - gtk_tree_store_set (treeStore, ¤t1stLevelIter, 0, - utfGroupName, 1, configItem->name, 2, - (gboolean) allowMultipleSelection, -1); - g_free (utfGroupName); + gtk_tree_store_append (treeStore, ¤t1stLevelIter, NULL); + gtk_tree_store_set (treeStore, ¤t1stLevelIter, 0, + utfGroupName, 1, configItem->name, 2, + (gboolean) allowMultipleSelection, -1); + g_free (utfGroupName); - current1stLevelId = configItem->name; + current1stLevelId = configItem->name; - XklConfigEnumOptions (configItem->name, (ConfigItemProcessFunc) - add_option_to_available_options_tree, - dialog); + XklConfigEnumOptions (configItem->name, (ConfigItemProcessFunc) + add_option_to_available_options_tree, dialog); } void fill_available_options_tree (GladeXML * dialog) { - GtkTreeStore *treeStore = - gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_BOOLEAN); - GtkWidget *treeView = WID ("xkb_options_available"); - GtkCellRenderer *renderer = - GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); - GtkTreeViewColumn *column = - gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "text", - 0, - NULL); - GtkTreeSelection *selection = - gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); + GtkTreeStore *treeStore = + gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_BOOLEAN); + GtkWidget *treeView = WID ("xkb_options_available"); + GtkCellRenderer *renderer = + GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); + GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + 0, + NULL); + GtkTreeSelection *selection = + gtk_tree_view_get_selection (GTK_TREE_VIEW (treeView)); - gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), - GTK_TREE_MODEL (treeStore)); - gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); + gtk_tree_view_set_model (GTK_TREE_VIEW (treeView), + GTK_TREE_MODEL (treeStore)); + gtk_tree_view_append_column (GTK_TREE_VIEW (treeView), column); - XklConfigEnumOptionGroups ((GroupProcessFunc) - add_group_to_available_options_tree, - dialog); + XklConfigEnumOptionGroups ((GroupProcessFunc) + add_group_to_available_options_tree, dialog); - sort_tree_content (treeView); + sort_tree_content (treeView); - g_signal_connect_swapped (G_OBJECT (selection), "changed", - G_CALLBACK - (enable_disable_options_buttons), - dialog); + g_signal_connect_swapped (G_OBJECT (selection), "changed", + G_CALLBACK + (enable_disable_options_buttons), dialog); } void fill_selected_options_tree (GladeXML * dialog) { - GSList *options = get_selected_options_list (); - GSList *curOption; - GtkListStore *listStore = - GTK_LIST_STORE (gtk_tree_view_get_model - (GTK_TREE_VIEW - (WID ("xkb_options_selected")))); - gtk_list_store_clear (listStore); + GSList *options = get_selected_options_list (); + GSList *curOption; + GtkListStore *listStore = + GTK_LIST_STORE (gtk_tree_view_get_model + (GTK_TREE_VIEW (WID ("xkb_options_selected")))); + gtk_list_store_clear (listStore); - for (curOption = options; curOption != NULL; - curOption = curOption->next) { - GtkTreeIter iter; - char *groupName, *optionName; - const char *visible = (char *) curOption->data; - - if (GSwitchItConfigSplitItems - (visible, &groupName, &optionName)) { - XklConfigItem citem; - g_snprintf (citem.name, sizeof (citem.name), "%s", - optionName); - if (XklConfigFindOption (groupName, &citem)) { - visible = citem.description; - } - gtk_list_store_append (listStore, &iter); - gtk_list_store_set (listStore, &iter, - 0, visible, 1, curOption->data, - -1); - } + for (curOption = options; curOption != NULL; curOption = curOption->next) + { + GtkTreeIter iter; + char *groupName, *optionName; + const char *visible = (char *) curOption->data; + if (GSwitchItConfigSplitItems (visible, &groupName, &optionName)) + { + XklConfigItem citem; + char *v1, *utfVisible; + g_snprintf (citem.name, sizeof (citem.name), "%s", optionName); + if (XklConfigFindOption (groupName, &citem)) + { + visible = citem.description; + } + v1 = g_strdup (visible); + utfVisible = + g_locale_to_utf8 (g_strstrip (v1), -1, NULL, NULL, NULL); + gtk_list_store_append (listStore, &iter); + gtk_list_store_set (listStore, &iter, + 0, utfVisible, 1, curOption->data, -1); + g_free (utfVisible); + g_free (v1); } - clear_xkb_elements_list (options); - enable_disable_options_buttons (dialog); + } + + clear_xkb_elements_list (options); + enable_disable_options_buttons (dialog); } void register_options_buttons_handlers (GladeXML * dialog) { - g_signal_connect (G_OBJECT (WID ("xkb_options_add")), "clicked", - G_CALLBACK (add_selected_option), dialog); - g_signal_connect (G_OBJECT (WID ("xkb_options_remove")), "clicked", - G_CALLBACK (remove_selected_option), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_options_add")), "clicked", + G_CALLBACK (add_selected_option), dialog); + g_signal_connect (G_OBJECT (WID ("xkb_options_remove")), "clicked", + G_CALLBACK (remove_selected_option), dialog); } static void update_options_list (GConfClient * client, guint cnxn_id, GConfEntry * entry, GladeXML * dialog) { - fill_selected_options_tree (dialog); + fill_selected_options_tree (dialog); } void register_options_gconf_listener (GladeXML * dialog) { - gconf_client_notify_add (gconf_client_get_default (), - GSWITCHIT_CONFIG_XKB_KEY_OPTIONS, - (GConfClientNotifyFunc) - update_options_list, dialog, NULL, NULL); + gconf_client_notify_add (gconf_client_get_default (), + GSWITCHIT_CONFIG_XKB_KEY_OPTIONS, + (GConfClientNotifyFunc) + update_options_list, dialog, NULL, NULL); }