diff -Nur gdm-2.19.1/gui/gdmlanguages.c gdm-2.19.1.new/gui/gdmlanguages.c --- gdm-2.19.1/gui/gdmlanguages.c 2007-05-16 13:03:52.000000000 +0200 +++ gdm-2.19.1.new/gui/gdmlanguages.c 2007-05-16 13:03:53.000000000 +0200 @@ -686,6 +686,13 @@ LOCALE_COLUMN, DEFAULT_LANGUAGE, -1); + gtk_list_store_append (lang_model, &iter); + gtk_list_store_set (lang_model, &iter, + TRANSLATED_NAME_COLUMN, "separator", + UNTRANSLATED_NAME_COLUMN, NULL, + LOCALE_COLUMN, "separator", + -1); + for (li = list; li != NULL; li = li->next) { char *lang = li->data; @@ -788,44 +795,44 @@ } static void -selection_changed (GtkTreeSelection *selection, +selection_changed (GtkComboBox *selection, gpointer data) { GtkTreeIter iter; - if (gtk_tree_selection_get_selected (selection, NULL, &iter)) + if (gtk_combo_box_get_active_iter (selection, &iter)) { g_free (dialog_selected_language); gtk_tree_model_get (GTK_TREE_MODEL (lang_model), &iter, LOCALE_COLUMN, &dialog_selected_language, -1); } } -static void -tree_row_activated (GtkTreeView *view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer data) -{ - GtkTreeIter iter; - if (gtk_tree_model_get_iter (GTK_TREE_MODEL (lang_model), &iter, path)) - { - g_free (dialog_selected_language); - gtk_tree_model_get (GTK_TREE_MODEL (lang_model), &iter, - LOCALE_COLUMN, &dialog_selected_language, - -1); - gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - } +static gboolean +is_separator (GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + GtkTreePath *path; + gboolean result; + + path = gtk_tree_model_get_path (model, iter); + result = gtk_tree_path_get_indices (path)[0] == 2; + gtk_tree_path_free (path); + + return result; } static void gdm_lang_setup_treeview (void) { + GtkWidget *combo = NULL; + GtkCellRenderer *renderer; + if (dialog == NULL) { GtkWidget *main_vbox; GtkWidget *button; GtkWidget **tmp_p; - GtkWidget *swindow; GtkWidget *label; char *s; @@ -866,47 +873,27 @@ gtk_label_set_use_markup (GTK_LABEL (label), TRUE); gtk_box_pack_start (GTK_BOX (main_vbox), label, FALSE, FALSE, 0); - tv = gtk_tree_view_new (); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tv), TRUE); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), tv); - /* FIXME: we should handle this better, but things really look - * bad if we aren't always LTR */ - gtk_widget_set_direction (tv, GTK_TEXT_DIR_LTR); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), - GTK_DIALOG_MODAL, - NULL, - gtk_cell_renderer_text_new (), - "text", TRANSLATED_NAME_COLUMN, - NULL); - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tv), - GTK_DIALOG_MODAL, - NULL, - gtk_cell_renderer_text_new (), - "markup", - UNTRANSLATED_NAME_COLUMN, - NULL); - swindow = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (swindow), tv); - gtk_box_pack_start (GTK_BOX (main_vbox), - swindow, TRUE, TRUE, 0); - gtk_window_set_default_size (GTK_WINDOW (dialog), - MIN (400, gdm_wm_screen.width), - MIN (600, gdm_wm_screen.height)); - g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tv))), + + combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL(lang_model)); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), renderer, + "text", TRANSLATED_NAME_COLUMN, + NULL); + gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); + gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo), + is_separator, NULL, NULL); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo); + gtk_widget_set_direction (combo, GTK_TEXT_DIR_LTR); + gtk_combo_box_set_column_span_column (GTK_COMBO_BOX(combo), (gint)2); + gtk_box_pack_start (GTK_BOX(main_vbox), combo, + FALSE, FALSE, 0); + g_signal_connect (GTK_COMBO_BOX (combo), "changed", (GCallback) selection_changed, NULL); - g_signal_connect (G_OBJECT (tv), - "row_activated", - (GCallback) tree_row_activated, - NULL); - gtk_tree_view_set_model (GTK_TREE_VIEW (tv), - GTK_TREE_MODEL (lang_model)); } }