[Xfce4-commits] <xfce4-settings:master> Show the current layout/variant in the edit dialog.

Jérôme Guelfucci noreply at xfce.org
Thu Sep 23 17:40:03 CEST 2010


Updating branch refs/heads/master
         to af23a34452aa631dbeb71a3a2f51a9a3b79b9cb7 (commit)
       from a9d7037333308c2f87db2cc38d83d323af865e29 (commit)

commit af23a34452aa631dbeb71a3a2f51a9a3b79b9cb7
Author: Jérôme Guelfucci <jeromeg at xfce.org>
Date:   Thu Sep 23 17:23:01 2010 +0200

    Show the current layout/variant in the edit dialog.
    
    This fixes several issues. First, we reset the dialog between each edit
    operation. Second, the current layout/variant is selected in the dialog
    and the row are expanded if needed so that it is easier to change the
    variant if it was wrong.

 dialogs/keyboard-settings/xfce-keyboard-settings.c |  130 ++++++++++++++++++--
 1 files changed, 122 insertions(+), 8 deletions(-)

diff --git a/dialogs/keyboard-settings/xfce-keyboard-settings.c b/dialogs/keyboard-settings/xfce-keyboard-settings.c
index 3404be4..41e6a55 100644
--- a/dialogs/keyboard-settings/xfce-keyboard-settings.c
+++ b/dialogs/keyboard-settings/xfce-keyboard-settings.c
@@ -147,7 +147,9 @@ static void                      xfce_keyboard_settings_add_variant_to_list   (X
 static void                      xfce_keyboard_settings_add_layout_to_list    (XklConfigRegistry         *config_registry,
                                                                                XklConfigItem             *config_item,
                                                                                XfceKeyboardSettings      *settings);
-static gchar *                   xfce_keyboard_settings_layout_selection      (XfceKeyboardSettings      *settings);
+static gchar *                   xfce_keyboard_settings_layout_selection      (XfceKeyboardSettings      *settings,
+                                                                               const gchar               *layout,
+                                                                               const gchar               *variant);
 
 #endif /* HAVE_LIBXKLAVIER */
 
@@ -1304,17 +1306,25 @@ xfce_keyboard_settings_edit_layout_button_cb (GtkWidget            *widget,
   GObject          *view;
   GtkTreeModel     *model;
   GtkTreeIter       iter;
+  gchar            *current_layout;
+  gchar            *current_variant;
   gchar            *layout;
   gchar           **strings;
 
-  layout = xfce_keyboard_settings_layout_selection (settings);
   view = gtk_builder_get_object (GTK_BUILDER (settings), "xkb_layout_view");
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+  gtk_tree_selection_get_selected (selection, &model, &iter);
+  gtk_tree_model_get (model, &iter,
+                      XKB_TREE_LAYOUTS, &current_layout,
+                      XKB_TREE_VARIANTS, &current_variant,
+                      -1);
+
+  layout = xfce_keyboard_settings_layout_selection (settings, current_layout, current_variant);
   if (layout)
     {
-      model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
-      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
       strings = g_strsplit_set (layout, ",", 0);
-      gtk_tree_selection_get_selected (selection, &model, &iter);
       gtk_list_store_set (GTK_LIST_STORE (model), &iter, XKB_TREE_LAYOUTS, strings[0],
                            XKB_TREE_LAYOUTS_NAMES, strings[1],
                            XKB_TREE_VARIANTS, strings[2],
@@ -1338,7 +1348,7 @@ xfce_keyboard_settings_add_layout_button_cb (GtkWidget            *widget,
   gchar            *layout;
   gchar           **strings;
 
-  layout = xfce_keyboard_settings_layout_selection (settings);
+  layout = xfce_keyboard_settings_layout_selection (settings, NULL, NULL);
   view = gtk_builder_get_object (GTK_BUILDER (settings), "xkb_layout_view");
   if (layout)
     {
@@ -1445,7 +1455,9 @@ xfce_keyboard_settings_layout_activate_cb (GtkTreeView       *tree_view,
 
 
 static gchar *
-xfce_keyboard_settings_layout_selection (XfceKeyboardSettings *settings)
+xfce_keyboard_settings_layout_selection (XfceKeyboardSettings *settings,
+                                         const gchar          *edit_layout,
+                                         const gchar          *edit_variant)
 {
   GObject           *keyboard_layout_selection_dialog;
   GObject           *layout_selection_view;
@@ -1464,6 +1476,7 @@ xfce_keyboard_settings_layout_selection (XfceKeyboardSettings *settings)
 
   keyboard_layout_selection_dialog = gtk_builder_get_object (GTK_BUILDER (settings), "keyboard-layout-selection-dialog");
   layout_selection_view = gtk_builder_get_object (GTK_BUILDER (settings), "layout_selection_view");
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (layout_selection_view));
 
   if (!settings->priv->layout_selection_treestore)
     {
@@ -1478,12 +1491,113 @@ xfce_keyboard_settings_layout_selection (XfceKeyboardSettings *settings)
           (ConfigItemProcessFunc) xfce_keyboard_settings_add_layout_to_list, settings);
       g_signal_connect (GTK_TREE_VIEW (layout_selection_view), "row-activated", G_CALLBACK (xfce_keyboard_settings_layout_activate_cb), keyboard_layout_selection_dialog);
     }
+
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (layout_selection_view));
+  gtk_tree_view_collapse_all (GTK_TREE_VIEW (layout_selection_view));
+
+  /* Selected and expand the layout/variant to be edited */
+  if (edit_layout && g_strcmp0 (edit_layout, ""))
+    {
+      gboolean found;
+
+      gtk_tree_model_get_iter_first (model, &iter);
+      found = FALSE;
+
+      do
+        {
+          gchar *tmp_layout;
+
+          gtk_tree_model_get (model, &iter, XKB_AVAIL_LAYOUTS_TREE_ID, &tmp_layout, -1);
+          path = gtk_tree_model_get_path (model, &iter);
+
+          if (found)
+            break;
+
+          if (g_strcmp0 (tmp_layout, edit_layout) == 0 )
+            {
+              if (edit_variant && g_strcmp0 (edit_variant, "") && gtk_tree_model_iter_has_child (model, &iter))
+                {
+                  GtkTreeIter iter2;
+                  gint n, i;
+
+                  n = gtk_tree_model_iter_n_children (model, &iter);
+
+                  for (i = 0; i < n; i ++)
+                    {
+                      if (gtk_tree_model_iter_nth_child (model, &iter2, &iter, i))
+                        {
+                          gchar *tmp_variant;
+
+                          gtk_tree_model_get (model, &iter2, XKB_AVAIL_LAYOUTS_TREE_ID, &tmp_variant, -1);
+
+                          if (g_strcmp0 (tmp_variant, edit_variant) == 0)
+                            {
+                              GtkTreePath *path2;
+
+                              path2 = gtk_tree_model_get_path (model, &iter2);
+
+                              gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (layout_selection_view),
+                                                                           path2, NULL,
+                                                                           TRUE, 0.5, 0);
+                              gtk_tree_view_expand_row (GTK_TREE_VIEW (layout_selection_view),
+                                                        path,
+                                                        TRUE);
+                              gtk_tree_selection_select_iter (selection, &iter2);
+
+                              found = TRUE;
+                              g_free (tmp_variant);
+                              gtk_tree_path_free (path2);
+                              break;
+                            }
+
+                          g_free (tmp_variant);
+                        }
+                    }
+                }
+              else
+                {
+                  gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (layout_selection_view),
+                                                               path, NULL,
+                                                               TRUE, 0.5, 0);
+                  gtk_tree_selection_select_iter (selection, &iter);
+                  found = TRUE;
+                  break;
+                }
+            }
+
+          gtk_tree_path_free (path);
+          g_free (tmp_layout);
+        }
+      while (gtk_tree_model_iter_next (model, &iter));
+
+      if (!found)
+        {
+          /* We did not find the iter to be edited, fallback to the first one */
+          gtk_tree_model_get_iter_first (model, &iter);
+          path = gtk_tree_model_get_path (model, &iter);
+          gtk_tree_selection_select_iter (selection, &iter);
+
+          gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (layout_selection_view),
+                                        path, NULL,
+                                        TRUE, 0.5, 0);
+        }
+    }
+  else
+    {
+      gtk_tree_model_get_iter_first (model, &iter);
+      path = gtk_tree_model_get_path (model, &iter);
+      gtk_tree_selection_select_iter (selection, &iter);
+
+      gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (layout_selection_view),
+                                    path, NULL,
+                                    TRUE, 0.5, 0);
+    }
+
   val_layout = NULL;
   gtk_widget_show (GTK_WIDGET (keyboard_layout_selection_dialog));
   result = gtk_dialog_run (GTK_DIALOG (keyboard_layout_selection_dialog));
   if (result)
     {
-      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (layout_selection_view));
       gtk_tree_selection_get_selected (selection, &model, &iter);
       gtk_tree_model_get (model, &iter, XKB_AVAIL_LAYOUTS_TREE_ID, &layout,
                                         XKB_AVAIL_LAYOUTS_TREE_DESCRIPTION, &layout_desc, -1);



More information about the Xfce4-commits mailing list