[gnome-control-center] region: Update CcInputChooser GTK+ code



commit 1ea0f875eec584d359509eefe9c24528073fa082
Author: Robert Ancell <robert ancell canonical com>
Date:   Wed Sep 12 15:28:57 2018 +1200

    region: Update CcInputChooser GTK+ code
    
    - Move more code into the .ui file
    - Don't save the dialog between runs - it's cheap to generate on demand
    - Hold references on data passed to dialog
    - Connect signals in "swapped" form
    - Use standard naming format for signal callbacks

 panels/region/cc-input-chooser.c   | 256 +++++++++++++++++--------------------
 panels/region/cc-input-chooser.h   |   9 +-
 panels/region/cc-input-chooser.ui  |  26 ++--
 panels/region/cc-region-panel.c    |  87 +++++--------
 panels/region/region.gresource.xml |   2 +-
 5 files changed, 169 insertions(+), 211 deletions(-)
---
diff --git a/panels/region/cc-input-chooser.c b/panels/region/cc-input-chooser.c
index 4b9445175..84f9782d8 100644
--- a/panels/region/cc-input-chooser.c
+++ b/panels/region/cc-input-chooser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Red Hat, Inc.
+ * Copyright © 2013 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -37,46 +37,47 @@
 
 #define FILTER_TIMEOUT 150 /* ms */
 
-typedef enum {
+typedef enum
+{
   ROW_TRAVEL_DIRECTION_NONE,
   ROW_TRAVEL_DIRECTION_FORWARD,
   ROW_TRAVEL_DIRECTION_BACKWARD
 } RowTravelDirection;
 
-typedef enum {
+typedef enum
+{
   ROW_LABEL_POSITION_START,
   ROW_LABEL_POSITION_CENTER,
   ROW_LABEL_POSITION_END
 } RowLabelPosition;
 
-struct _CcInputChooser {
-  GtkDialog parent_instance;
-
-  /* Not owned */
-  GtkWidget *add_button;
-  GtkWidget *filter_entry;
-  GtkWidget *input_listbox;
-  GtkWidget *scrolledwindow;
-  GtkWidget *login_label;
-  GtkAdjustment *adjustment;
-  GnomeXkbInfo *xkb_info;
-  GHashTable *ibus_engines;
-
-  /* Owned */
-  GtkListBoxRow *more_row;
-  GtkWidget *no_results;
-  GHashTable *locales;
-  GHashTable *locales_by_language;
-  gboolean showing_extra;
-  guint filter_timeout_id;
-  gchar **filter_words;
-
-  gboolean is_login;
+struct _CcInputChooser
+{
+  GtkDialog          parent_instance;
+
+  GtkButton         *add_button;
+  GtkSearchEntry    *filter_entry;
+  GtkListBox        *input_sources_listbox;
+  GtkLabel          *login_label;
+  GtkListBoxRow     *more_row;
+  GtkWidget         *no_results;
+  GtkAdjustment     *scroll_adjustment;
+
+  GnomeXkbInfo      *xkb_info;
+  GHashTable        *ibus_engines;
+  GHashTable        *locales;
+  GHashTable        *locales_by_language;
+  gboolean           showing_extra;
+  guint              filter_timeout_id;
+  gchar            **filter_words;
+
+  gboolean           is_login;
 };
 
 G_DEFINE_TYPE (CcInputChooser, cc_input_chooser, GTK_TYPE_DIALOG)
 
-typedef struct {
+typedef struct
+{
   gchar *id;
   gchar *name;
   gchar *unaccented_name;
@@ -296,22 +297,22 @@ add_input_source_rows_for_locale (CcInputChooser *self,
   const gchar *id;
 
   if (info->default_input_source_row)
-    gtk_container_add (GTK_CONTAINER (self->input_listbox), GTK_WIDGET (info->default_input_source_row));
+    gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), GTK_WIDGET 
(info->default_input_source_row));
 
   g_hash_table_iter_init (&iter, info->layout_rows_by_id);
   while (g_hash_table_iter_next (&iter, (gpointer *) &id, (gpointer *) &row))
-    gtk_container_add (GTK_CONTAINER (self->input_listbox), row);
+    gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), row);
 
   g_hash_table_iter_init (&iter, info->engine_rows_by_id);
   while (g_hash_table_iter_next (&iter, (gpointer *) &id, (gpointer *) &row))
-    gtk_container_add (GTK_CONTAINER (self->input_listbox), row);
+    gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), row);
 }
 
 static void
 show_input_sources_for_locale (CcInputChooser *self,
                                LocaleInfo     *info)
 {
-  remove_all_children (GTK_CONTAINER (self->input_listbox));
+  remove_all_children (GTK_CONTAINER (self->input_sources_listbox));
 
   if (!info->back_row)
     {
@@ -320,21 +321,21 @@ show_input_sources_for_locale (CcInputChooser *self,
       g_object_set_data (G_OBJECT (info->back_row), "back", GINT_TO_POINTER (TRUE));
       g_object_set_data (G_OBJECT (info->back_row), "locale-info", info);
     }
-  gtk_container_add (GTK_CONTAINER (self->input_listbox), GTK_WIDGET (info->back_row));
+  gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), GTK_WIDGET (info->back_row));
 
   add_input_source_rows_for_locale (self, info);
 
-  gtk_adjustment_set_value (self->adjustment,
-                            gtk_adjustment_get_lower (self->adjustment));
-  gtk_list_box_set_header_func (GTK_LIST_BOX (self->input_listbox), cc_list_box_update_header_func, NULL, 
NULL);
-  gtk_list_box_invalidate_filter (GTK_LIST_BOX (self->input_listbox));
-  gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->input_listbox), GTK_SELECTION_SINGLE);
-  gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (self->input_listbox), FALSE);
-  gtk_list_box_unselect_all (GTK_LIST_BOX (self->input_listbox));
-
-  if (gtk_widget_is_visible (self->filter_entry) &&
-      !gtk_widget_is_focus (self->filter_entry))
-    gtk_widget_grab_focus (self->filter_entry);
+  gtk_adjustment_set_value (self->scroll_adjustment,
+                            gtk_adjustment_get_lower (self->scroll_adjustment));
+  gtk_list_box_set_header_func (self->input_sources_listbox, cc_list_box_update_header_func, NULL, NULL);
+  gtk_list_box_invalidate_filter (self->input_sources_listbox);
+  gtk_list_box_set_selection_mode (self->input_sources_listbox, GTK_SELECTION_SINGLE);
+  gtk_list_box_set_activate_on_single_click (self->input_sources_listbox, FALSE);
+  gtk_list_box_unselect_all (self->input_sources_listbox);
+
+  if (gtk_widget_is_visible (GTK_WIDGET (self->filter_entry)) &&
+      !gtk_widget_is_focus (GTK_WIDGET (self->filter_entry)))
+    gtk_widget_grab_focus (GTK_WIDGET (self->filter_entry));
 }
 
 static gboolean
@@ -350,7 +351,7 @@ show_locale_rows (CcInputChooser *self)
   LocaleInfo *info;
   GHashTableIter iter;
 
-  remove_all_children (GTK_CONTAINER (self->input_listbox));
+  remove_all_children (GTK_CONTAINER (self->input_sources_listbox));
 
   if (!self->showing_extra)
     initial = cc_common_language_get_initial_languages ();
@@ -374,27 +375,27 @@ show_locale_rows (CcInputChooser *self)
               !is_current_locale (info->id))
             g_object_set_data (G_OBJECT (info->locale_row), "is-extra", GINT_TO_POINTER (TRUE));
         }
-      gtk_container_add (GTK_CONTAINER (self->input_listbox), GTK_WIDGET (info->locale_row));
+      gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), GTK_WIDGET (info->locale_row));
     }
 
-  gtk_container_add (GTK_CONTAINER (self->input_listbox), GTK_WIDGET (self->more_row));
+  gtk_container_add (GTK_CONTAINER (self->input_sources_listbox), GTK_WIDGET (self->more_row));
 
-  gtk_adjustment_set_value (self->adjustment,
-                            gtk_adjustment_get_lower (self->adjustment));
-  gtk_list_box_set_header_func (GTK_LIST_BOX (self->input_listbox), cc_list_box_update_header_func, NULL, 
NULL);
-  gtk_list_box_invalidate_filter (GTK_LIST_BOX (self->input_listbox));
-  gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->input_listbox), GTK_SELECTION_NONE);
-  gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (self->input_listbox), TRUE);
+  gtk_adjustment_set_value (self->scroll_adjustment,
+                            gtk_adjustment_get_lower (self->scroll_adjustment));
+  gtk_list_box_set_header_func (self->input_sources_listbox, cc_list_box_update_header_func, NULL, NULL);
+  gtk_list_box_invalidate_filter (self->input_sources_listbox);
+  gtk_list_box_set_selection_mode (self->input_sources_listbox, GTK_SELECTION_NONE);
+  gtk_list_box_set_activate_on_single_click (self->input_sources_listbox, TRUE);
 
-  if (gtk_widget_is_visible (self->filter_entry) &&
-      !gtk_widget_is_focus (self->filter_entry))
-    gtk_widget_grab_focus (self->filter_entry);
+  if (gtk_widget_is_visible (GTK_WIDGET (self->filter_entry)) &&
+      !gtk_widget_is_focus (GTK_WIDGET (self->filter_entry)))
+    gtk_widget_grab_focus (GTK_WIDGET (self->filter_entry));
 }
 
 static gint
-list_sort (gconstpointer a,
-           gconstpointer b,
-           gpointer      data)
+list_sort (GtkListBoxRow *a,
+           GtkListBoxRow *b,
+           gpointer       data)
 {
   CcInputChooser *self = data;
   LocaleInfo *ia;
@@ -554,20 +555,20 @@ do_filter (CcInputChooser *self)
 
   if (!self->filter_words[0])
     {
-      gtk_list_box_invalidate_filter (GTK_LIST_BOX (self->input_listbox));
-      gtk_list_box_set_placeholder (GTK_LIST_BOX (self->input_listbox), NULL);
+      gtk_list_box_invalidate_filter (self->input_sources_listbox);
+      gtk_list_box_set_placeholder (self->input_sources_listbox, NULL);
     }
   else if (previous_words == NULL || strvs_differ (self->filter_words, previous_words))
     {
-      gtk_list_box_invalidate_filter (GTK_LIST_BOX (self->input_listbox));
-      gtk_list_box_set_placeholder (GTK_LIST_BOX (self->input_listbox), self->no_results);
+      gtk_list_box_invalidate_filter (self->input_sources_listbox);
+      gtk_list_box_set_placeholder (self->input_sources_listbox, self->no_results);
     }
 
   return G_SOURCE_REMOVE;
 }
 
 static void
-filter_changed (CcInputChooser *self)
+on_filter_entry_search_changed_cb (CcInputChooser *self)
 {
   if (self->filter_timeout_id == 0)
     self->filter_timeout_id = g_timeout_add (FILTER_TIMEOUT, (GSourceFunc) do_filter, self);
@@ -576,18 +577,16 @@ filter_changed (CcInputChooser *self)
 static void
 show_more (CcInputChooser *self)
 {
-  gtk_widget_show (self->filter_entry);
-  gtk_widget_grab_focus (self->filter_entry);
+  gtk_widget_show (GTK_WIDGET (self->filter_entry));
+  gtk_widget_grab_focus (GTK_WIDGET (self->filter_entry));
 
   self->showing_extra = TRUE;
 
-  gtk_list_box_invalidate_filter (GTK_LIST_BOX (self->input_listbox));
+  gtk_list_box_invalidate_filter (self->input_sources_listbox);
 }
 
 static void
-row_activated (GtkListBox     *box,
-               GtkListBoxRow  *row,
-               CcInputChooser *self)
+on_input_sources_listbox_row_activated_cb (CcInputChooser *self, GtkListBoxRow  *row)
 {
   gpointer data;
 
@@ -610,10 +609,10 @@ row_activated (GtkListBox     *box,
   data = g_object_get_data (G_OBJECT (row), "name");
   if (data)
     {
-      if (gtk_widget_is_sensitive (self->add_button))
+      if (gtk_widget_is_sensitive (GTK_WIDGET (self->add_button)))
         gtk_dialog_response (GTK_DIALOG (self),
                              gtk_dialog_get_response_for_widget (GTK_DIALOG (self),
-                                                                 self->add_button));
+                                                                 GTK_WIDGET (self->add_button)));
       return;
     }
 
@@ -626,29 +625,26 @@ row_activated (GtkListBox     *box,
 }
 
 static void
-selected_rows_changed (GtkListBox     *box,
-                       CcInputChooser *self)
+on_input_sources_listbox_selected_rows_changed_cb (CcInputChooser *self)
 {
   gboolean sensitive = TRUE;
   GtkListBoxRow *row;
 
-  row = gtk_list_box_get_selected_row (box);
+  row = gtk_list_box_get_selected_row (self->input_sources_listbox);
   if (!row || g_object_get_data (G_OBJECT (row), "back"))
     sensitive = FALSE;
 
-  gtk_widget_set_sensitive (self->add_button, sensitive);
+  gtk_widget_set_sensitive (GTK_WIDGET (self->add_button), sensitive);
 }
 
 static gboolean
-list_button_release_event (GtkListBox     *box,
-                           GdkEvent       *event,
-                           CcInputChooser *self)
+on_input_sources_listbox_button_release_event_cb (CcInputChooser *self, GdkEvent *event)
 {
   gdouble x, y;
   GtkListBoxRow *row;
 
   gdk_event_get_coords (event, &x, &y);
-  row = gtk_list_box_get_row_at_y (box, y);
+  row = gtk_list_box_get_row_at_y (self->input_sources_listbox, y);
   if (row && g_object_get_data (G_OBJECT (row), "back"))
     {
       g_signal_emit_by_name (row, "activate", NULL);
@@ -876,7 +872,7 @@ get_locale_infos (CcInputChooser *self)
   self->locales = g_hash_table_new_full (g_str_hash, g_str_equal,
                                          g_free, locale_info_free);
   self->locales_by_language = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                     g_free, (GDestroyNotify) g_hash_table_destroy);
+                                                     g_free, (GDestroyNotify) g_hash_table_unref);
 
   layouts_with_locale = g_hash_table_new (g_str_hash, g_str_equal);
 
@@ -956,14 +952,16 @@ get_locale_infos (CcInputChooser *self)
       add_row_other (self, INPUT_SOURCE_TYPE_XKB, l->data);
 }
 
-
 static gboolean
-reset_on_escape (GtkWidget      *widget,
-                 GdkEventKey    *event,
-                 CcInputChooser *self)
+on_filter_entry_key_release_event_cb (CcInputChooser *self, GdkEventKey *event)
 {
-  if (event->keyval == GDK_KEY_Escape)
-    cc_input_chooser_reset (self);
+  if (event->keyval == GDK_KEY_Escape) {
+    self->showing_extra = FALSE;
+    gtk_entry_set_text (GTK_ENTRY (self->filter_entry), "");
+    gtk_widget_hide (GTK_WIDGET (self->filter_entry));
+    g_clear_pointer (&self->filter_words, g_strfreev);
+    show_locale_rows (self);
+  }
 
   return FALSE;
 }
@@ -975,57 +973,43 @@ cc_input_chooser_dispose (GObject *object)
 
   g_clear_object (&self->more_row);
   g_clear_object (&self->no_results);
-  g_clear_pointer (&self->locales, g_hash_table_destroy);
-  g_clear_pointer (&self->locales_by_language, g_hash_table_destroy);
+  g_clear_object (&self->xkb_info);
+  g_clear_pointer (&self->ibus_engines, g_hash_table_unref);
+  g_clear_pointer (&self->locales, g_hash_table_unref);
+  g_clear_pointer (&self->locales_by_language, g_hash_table_unref);
   g_clear_pointer (&self->filter_words, g_strfreev);
-  if (self->filter_timeout_id)
-    {
-      g_source_remove (self->filter_timeout_id);
-      self->filter_timeout_id = 0;
-    }
+  g_clear_handle_id (&self->filter_timeout_id, g_source_remove);
 
   G_OBJECT_CLASS (cc_input_chooser_parent_class)->dispose (object);
 }
 
-static void
+void
 cc_input_chooser_class_init (CcInputChooserClass *klass)
 {
-  GObjectClass *object_klass = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_klass = GTK_WIDGET_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  object_klass->dispose = cc_input_chooser_dispose;
+  object_class->dispose = cc_input_chooser_dispose;
 
-  gtk_widget_class_set_template_from_resource (widget_klass, 
"/org/gnome/control-center/region/cc-input-chooser.ui");
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/region/cc-input-chooser.ui");
 
-  gtk_widget_class_bind_template_child (widget_klass, CcInputChooser, add_button);
-  gtk_widget_class_bind_template_child (widget_klass, CcInputChooser, filter_entry);
-  gtk_widget_class_bind_template_child (widget_klass, CcInputChooser, input_listbox);
-  gtk_widget_class_bind_template_child (widget_klass, CcInputChooser, scrolledwindow);
-  gtk_widget_class_bind_template_child (widget_klass, CcInputChooser, login_label);
+  gtk_widget_class_bind_template_child (widget_class, CcInputChooser, add_button);
+  gtk_widget_class_bind_template_child (widget_class, CcInputChooser, filter_entry);
+  gtk_widget_class_bind_template_child (widget_class, CcInputChooser, input_sources_listbox);
+  gtk_widget_class_bind_template_child (widget_class, CcInputChooser, login_label);
+  gtk_widget_class_bind_template_child (widget_class, CcInputChooser, scroll_adjustment);
+
+  gtk_widget_class_bind_template_callback (widget_class, on_input_sources_listbox_row_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_input_sources_listbox_selected_rows_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_input_sources_listbox_button_release_event_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_filter_entry_search_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_filter_entry_key_release_event_cb);
 }
 
 void
 cc_input_chooser_init (CcInputChooser *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
-
-  self->adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow));
-
-  self->more_row = g_object_ref_sink (more_row_new ());
-  self->no_results = g_object_ref_sink (no_results_widget_new ());
-  gtk_widget_show (self->no_results);
-
-  gtk_list_box_set_filter_func (GTK_LIST_BOX (self->input_listbox), list_filter, self, NULL);
-  gtk_list_box_set_sort_func (GTK_LIST_BOX (self->input_listbox), (GtkListBoxSortFunc)list_sort, self, NULL);
-  g_signal_connect (self->input_listbox, "row-activated", G_CALLBACK (row_activated), self);
-  g_signal_connect (self->input_listbox, "selected-rows-changed", G_CALLBACK (selected_rows_changed), self);
-  g_signal_connect (self->input_listbox, "button-release-event", G_CALLBACK (list_button_release_event), 
self);
-
-  g_signal_connect_swapped (self->filter_entry, "search-changed", G_CALLBACK (filter_changed), self);
-  g_signal_connect (self->filter_entry, "key-release-event", G_CALLBACK (reset_on_escape), self);
-
-  if (self->is_login)
-    gtk_widget_show (self->login_label);
 }
 
 CcInputChooser *
@@ -1034,14 +1018,26 @@ cc_input_chooser_new (gboolean      is_login,
                       GHashTable   *ibus_engines)
 {
   CcInputChooser *self;
+  g_autoptr(GError) error = NULL;
 
   self = g_object_new (CC_TYPE_INPUT_CHOOSER,
                        "use-header-bar", 1,
                        NULL);
 
   self->is_login = is_login;
-  self->xkb_info = xkb_info;
-  self->ibus_engines = ibus_engines;
+  self->xkb_info = g_object_ref (xkb_info);
+  if (ibus_engines)
+    self->ibus_engines = g_hash_table_ref (ibus_engines);
+
+  self->more_row = g_object_ref_sink (more_row_new ());
+  self->no_results = g_object_ref_sink (no_results_widget_new ());
+  gtk_widget_show_all (self->no_results);
+
+  gtk_list_box_set_filter_func (self->input_sources_listbox, list_filter, self, NULL);
+  gtk_list_box_set_sort_func (self->input_sources_listbox, list_sort, self, NULL);
+
+  if (self->is_login)
+    gtk_widget_show (GTK_WIDGET (self->login_label));
 
   get_locale_infos (self);
 #ifdef HAVE_IBUS
@@ -1080,7 +1076,7 @@ cc_input_chooser_get_selected (CcInputChooser *self,
 
   g_return_val_if_fail (CC_IS_INPUT_CHOOSER (self), FALSE);
 
-  selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (self->input_listbox));
+  selected = gtk_list_box_get_selected_row (self->input_sources_listbox);
   if (!selected)
     return FALSE;
 
@@ -1097,15 +1093,3 @@ cc_input_chooser_get_selected (CcInputChooser *self,
 
   return TRUE;
 }
-
-void
-cc_input_chooser_reset (CcInputChooser *self)
-{
-  g_return_if_fail (CC_IS_INPUT_CHOOSER (self));
-
-  self->showing_extra = FALSE;
-  gtk_entry_set_text (GTK_ENTRY (self->filter_entry), "");
-  gtk_widget_hide (self->filter_entry);
-  g_clear_pointer (&self->filter_words, g_strfreev);
-  show_locale_rows (self);
-}
diff --git a/panels/region/cc-input-chooser.h b/panels/region/cc-input-chooser.h
index b7402f559..bc75d9299 100644
--- a/panels/region/cc-input-chooser.h
+++ b/panels/region/cc-input-chooser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Red Hat, Inc
+ * Copyright © 2013 Red Hat, Inc
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -27,15 +27,16 @@ G_BEGIN_DECLS
 #define CC_TYPE_INPUT_CHOOSER (cc_input_chooser_get_type ())
 G_DECLARE_FINAL_TYPE (CcInputChooser, cc_input_chooser, CC, INPUT_CHOOSER, GtkDialog)
 
-CcInputChooser *cc_input_chooser_new              (gboolean        is_login,
-                                                   GnomeXkbInfo   *xkb_info,
+CcInputChooser *cc_input_chooser_new              (gboolean       is_login,
+                                                   GnomeXkbInfo  *xkb_info,
                                                    GHashTable     *ibus_engines);
+
 void            cc_input_chooser_set_ibus_engines (CcInputChooser *chooser,
                                                    GHashTable     *ibus_engines);
+
 gboolean        cc_input_chooser_get_selected     (CcInputChooser *chooser,
                                                    gchar         **type,
                                                    gchar         **id,
                                                    gchar         **name);
-void            cc_input_chooser_reset            (CcInputChooser *chooser);
 
 G_END_DECLS
diff --git a/panels/region/cc-input-chooser.ui b/panels/region/cc-input-chooser.ui
index 65a9948de..8d72357e2 100644
--- a/panels/region/cc-input-chooser.ui
+++ b/panels/region/cc-input-chooser.ui
@@ -3,7 +3,6 @@
   <!-- interface-requires gtk+ 3.0 -->
   <template class="CcInputChooser" parent="GtkDialog">
     <property name="title" translatable="yes">Add an Input Source</property>
-    <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="destroy_with_parent">True</property>
     <property name="resizable">True</property>
@@ -33,7 +32,7 @@
         <property name="orientation">vertical</property>
         <property name="spacing">0</property>
         <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow">
+          <object class="GtkScrolledWindow">
             <property name="visible">True</property>
             <property name="hscrollbar-policy">never</property>
             <property name="vscrollbar-policy">automatic</property>
@@ -44,18 +43,17 @@
             <property name="margin-top">6</property>
             <property name="margin-bottom">6</property>
             <property name="min-content-height">300</property>
+            <property name="vadjustment">scroll_adjustment</property>
             <child>
-              <object class="GtkViewport">
+              <object class="GtkListBox" id="input_sources_listbox">
                 <property name="visible">True</property>
-                <child>
-                  <object class="GtkListBox" id="input_listbox">
-                    <property name="visible">True</property>
-                    <property name="can-focus">True</property>
-                    <property name="vexpand">True</property>
-                    <property name="halign">fill</property>
-                    <property name="valign">fill</property>
-                  </object>
-                </child>
+                <property name="can-focus">True</property>
+                <property name="vexpand">True</property>
+                <property name="halign">fill</property>
+                <property name="valign">fill</property>
+                <signal name="row-activated" handler="on_input_sources_listbox_row_activated_cb" 
object="CcInputChooser" swapped="yes" />
+                <signal name="selected-rows-changed" 
handler="on_input_sources_listbox_selected_rows_changed_cb" object="CcInputChooser" swapped="yes" />
+                <signal name="button-release-event" 
handler="on_input_sources_listbox_button_release_event_cb" object="CcInputChooser" swapped="yes" />
               </object>
             </child>
           </object>
@@ -68,6 +66,8 @@
             <property name="margin-end">6</property>
             <property name="margin-top">6</property>
             <property name="margin-bottom">6</property>
+            <signal name="search-changed" handler="on_filter_entry_search_changed_cb" 
object="CcInputChooser" swapped="yes" />
+            <signal name="key-release-event" handler="on_filter_entry_key_release_event_cb" 
object="CcInputChooser" swapped="yes" />
           </object>
         </child>
         <child>
@@ -90,4 +90,6 @@
       <action-widget response="-6">cancel_button</action-widget>
     </action-widgets>
   </template>
+  <object class="GtkAdjustment" id="scroll_adjustment">
+  </object>
 </interface>
diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
index bf21e1511..2c6b29e46 100644
--- a/panels/region/cc-region-panel.c
+++ b/panels/region/cc-region-panel.c
@@ -656,18 +656,6 @@ update_ibus_active_sources (CcRegionPanel *self)
         }
 }
 
-static void
-update_input_chooser (CcRegionPanel *self)
-{
-        CcInputChooser *chooser;
-
-        chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
-        if (!chooser)
-                return;
-
-        cc_input_chooser_set_ibus_engines (chooser, self->ibus_engines);
-}
-
 static void
 fetch_ibus_engines_result (GObject       *object,
                            GAsyncResult  *result,
@@ -698,7 +686,6 @@ fetch_ibus_engines_result (GObject       *object,
         }
 
         update_ibus_active_sources (self);
-        update_input_chooser (self);
 }
 
 static void
@@ -966,62 +953,46 @@ input_source_already_added (CcRegionPanel *self,
 }
 
 static void
-run_input_chooser (CcRegionPanel *self, CcInputChooser *chooser)
+show_input_chooser (CcRegionPanel *self)
 {
-        if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
-                g_autofree gchar *type = NULL;
-                g_autofree gchar *id = NULL;
-                g_autofree gchar *name = NULL;
-
-                if (cc_input_chooser_get_selected (chooser, &type, &id, &name) &&
-                    !input_source_already_added (self, id)) {
-                        g_autoptr(GDesktopAppInfo) app_info = NULL;
+        CcInputChooser *chooser;
+        g_autofree gchar *type = NULL;
+        g_autofree gchar *id = NULL;
+        g_autofree gchar *name = NULL;
 
-                        if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
+        chooser = cc_input_chooser_new (self->login,
+                                        self->xkb_info,
 #ifdef HAVE_IBUS
-                                app_info = setup_app_info_for_id (id);
+                                        self->ibus_engines
+#else
+                                        NULL
 #endif
-                        } else {
-                                g_free (type);
-                                type = g_strdup (INPUT_SOURCE_TYPE_XKB);
-                        }
+                                        );
+        gtk_window_set_transient_for (GTK_WINDOW (chooser), GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET 
(self))));
 
-                        add_input_row (self, type, id, name, app_info);
-                        update_buttons (self);
-                        update_input (self);
-                }
+        if (gtk_dialog_run (GTK_DIALOG (chooser)) != GTK_RESPONSE_OK) {
+                gtk_widget_destroy (GTK_WIDGET (chooser));
+                return;
         }
-        gtk_widget_hide (GTK_WIDGET (chooser));
-}
-
-static void
-show_input_chooser (CcRegionPanel *self)
-{
-        CcInputChooser *chooser;
-
-        chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
 
-        if (!chooser) {
-                GtkWidget *toplevel;
+        if (cc_input_chooser_get_selected (chooser, &type, &id, &name) &&
+            !input_source_already_added (self, id)) {
+                g_autoptr(GDesktopAppInfo) app_info = NULL;
 
-                toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-                chooser = cc_input_chooser_new (self->login,
-                                                self->xkb_info,
+                if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
 #ifdef HAVE_IBUS
-                                                self->ibus_engines
-#else
-                                                NULL
+                        app_info = setup_app_info_for_id (id);
 #endif
-                                                );
-                gtk_window_set_transient_for (GTK_WINDOW (chooser), GTK_WINDOW (toplevel));
-                g_object_ref (chooser);
-                g_object_set_data_full (G_OBJECT (self), "input-chooser",
-                                        chooser, g_object_unref);
-        } else {
-                cc_input_chooser_reset (chooser);
-        }
+                } else {
+                        g_free (type);
+                        type = g_strdup (INPUT_SOURCE_TYPE_XKB);
+                }
 
-        run_input_chooser (self, chooser);
+                add_input_row (self, type, id, name, app_info);
+                update_buttons (self);
+                update_input (self);
+        }
+        gtk_widget_destroy (GTK_WIDGET (chooser));
 }
 
 static void
diff --git a/panels/region/region.gresource.xml b/panels/region/region.gresource.xml
index 7109d03a9..47b787e7d 100644
--- a/panels/region/region.gresource.xml
+++ b/panels/region/region.gresource.xml
@@ -2,8 +2,8 @@
 <gresources>
   <gresource prefix="/org/gnome/control-center/region">
     <file preprocess="xml-stripblanks">cc-format-chooser.ui</file>
-    <file preprocess="xml-stripblanks">cc-input-row.ui</file>
     <file preprocess="xml-stripblanks">cc-input-chooser.ui</file>
+    <file preprocess="xml-stripblanks">cc-input-row.ui</file>
     <file preprocess="xml-stripblanks">cc-region-panel.ui</file>
   </gresource>
 </gresources>


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