[gnome-control-center/gnome-3-14] region: Reuse the input chooser instance



commit fe3e71b60ebabffa596920ad20a247870e857e65
Author: Joaquim Rocha <me joaquimrocha com>
Date:   Thu Feb 26 22:10:40 2015 +0100

    region: Reuse the input chooser instance
    
    The language input chooser is being created and destroyed every time
    it is opened and closed. This is noticeably slow and is hardly
    necessary as the values it contains should not change.
    
    To fix this, these changes reuse the same instance of the input chooser
    (by hiding and showing it) instead of renewing it.
    The input chooser is also now shown using gtk_dialog_run to avoid having
    it destroyed from the default delete event.

 panels/region/cc-input-chooser.c |    7 ++++++
 panels/region/cc-input-chooser.h |    2 +
 panels/region/cc-region-panel.c  |   41 ++++++++++++++++++++++---------------
 3 files changed, 33 insertions(+), 17 deletions(-)
---
diff --git a/panels/region/cc-input-chooser.c b/panels/region/cc-input-chooser.c
index 13500fb..297b79e 100644
--- a/panels/region/cc-input-chooser.c
+++ b/panels/region/cc-input-chooser.c
@@ -394,6 +394,7 @@ show_input_sources_for_locale (GtkWidget   *chooser,
   gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->list));
   gtk_list_box_set_selection_mode (GTK_LIST_BOX (priv->list), GTK_SELECTION_SINGLE);
   gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (priv->list), FALSE);
+  gtk_list_box_unselect_all (GTK_LIST_BOX (priv->list));
 
   if (gtk_widget_is_visible (priv->filter_entry) &&
       !gtk_widget_is_focus (priv->filter_entry))
@@ -1221,3 +1222,9 @@ cc_input_chooser_get_selected (GtkWidget  *chooser,
 
   return TRUE;
 }
+
+void
+cc_input_chooser_reset (GtkWidget *chooser)
+{
+  show_locale_rows (chooser);
+}
diff --git a/panels/region/cc-input-chooser.h b/panels/region/cc-input-chooser.h
index fd6ac97..d552abf 100644
--- a/panels/region/cc-input-chooser.h
+++ b/panels/region/cc-input-chooser.h
@@ -36,6 +36,8 @@ gboolean     cc_input_chooser_get_selected (GtkWidget    *chooser,
                                             gchar       **id,
                                             gchar       **name);
 
+void         cc_input_chooser_reset (GtkWidget *chooser);
+
 G_END_DECLS
 
 #endif /* __CC_INPUT_CHOOSER_H__ */
diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
index b045c34..e89268b 100644
--- a/panels/region/cc-region-panel.c
+++ b/panels/region/cc-region-panel.c
@@ -127,6 +127,7 @@ cc_region_panel_finalize (GObject *object)
 {
        CcRegionPanel *self = CC_REGION_PANEL (object);
        CcRegionPanelPrivate *priv = self->priv;
+       GtkWidget *chooser;
 
         g_cancellable_cancel (priv->cancellable);
         g_clear_object (&priv->cancellable);
@@ -160,6 +161,9 @@ cc_region_panel_finalize (GObject *object)
         g_free (priv->system_language);
         g_free (priv->system_region);
 
+        chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
+        gtk_widget_destroy (chooser);
+
        G_OBJECT_CLASS (cc_region_panel_parent_class)->finalize (object);
 }
 
@@ -1121,16 +1125,14 @@ input_source_already_added (CcRegionPanel *self,
 }
 
 static void
-input_response (GtkWidget *chooser, gint response_id, gpointer data)
+run_input_chooser (CcRegionPanel *self, GtkWidget *chooser)
 {
-       CcRegionPanel *self = data;
-        CcRegionPanelPrivate *priv = self->priv;
         gchar *type;
         gchar *id;
         gchar *name;
         GDesktopAppInfo *app_info = NULL;
 
-        if (response_id == GTK_RESPONSE_OK) {
+        if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
                 if (cc_input_chooser_get_selected (chooser, &type, &id, &name) &&
                     !input_source_already_added (self, id)) {
                         if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
@@ -1144,7 +1146,7 @@ input_response (GtkWidget *chooser, gint response_id, gpointer data)
                                 type = INPUT_SOURCE_TYPE_XKB;
                         }
 
-                        if (priv->login && g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
+                        if (self->priv->login && g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
                                 apologize_for_no_ibus_login (self);
                         } else {
                                 add_input_row (self, type, id, name, app_info);
@@ -1156,8 +1158,7 @@ input_response (GtkWidget *chooser, gint response_id, gpointer data)
                         g_clear_object (&app_info);
                 }
         }
-        gtk_widget_destroy (chooser);
-        g_object_set_data (G_OBJECT (self), "input-chooser", NULL);
+        gtk_widget_hide(chooser);
 }
 
 static void
@@ -1167,20 +1168,26 @@ show_input_chooser (CcRegionPanel *self)
         GtkWidget *chooser;
         GtkWidget *toplevel;
 
-        toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-        chooser = cc_input_chooser_new (GTK_WINDOW (toplevel),
-                                        priv->xkb_info,
+        chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
+
+        if (!chooser) {
+                toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
+                chooser = cc_input_chooser_new (GTK_WINDOW (toplevel),
+                                                priv->xkb_info,
 #ifdef HAVE_IBUS
-                                        priv->ibus_engines
+                                                priv->ibus_engines
 #else
-                                        NULL
+                                                NULL
 #endif
-                );
-        g_signal_connect (chooser, "response",
-                          G_CALLBACK (input_response), self);
-        gtk_window_present (GTK_WINDOW (chooser));
+                                                );
+                g_object_ref (chooser);
+                g_object_set_data_full (G_OBJECT (self), "input-chooser",
+                                        chooser, g_object_unref);
+        } else {
+                cc_input_chooser_reset (chooser);
+        }
 
-        g_object_set_data (G_OBJECT (self), "input-chooser", chooser);
+        run_input_chooser (self, chooser);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]