summaryrefslogtreecommitdiff
path: root/panels/region
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2018-09-12 15:28:57 +1200
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2018-10-17 22:34:52 +0000
commit1ea0f875eec584d359509eefe9c24528073fa082 (patch)
tree4efb0072bec65882f8a1e4c2ecb563ef80c94635 /panels/region
parent9a75d4955167a38b2a3439e135b002318ee2264e (diff)
downloadgnome-control-center-1ea0f875eec584d359509eefe9c24528073fa082.tar.gz
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
Diffstat (limited to 'panels/region')
-rw-r--r--panels/region/cc-input-chooser.c256
-rw-r--r--panels/region/cc-input-chooser.h9
-rw-r--r--panels/region/cc-input-chooser.ui26
-rw-r--r--panels/region/cc-region-panel.c87
-rw-r--r--panels/region/region.gresource.xml2
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
@@ -657,18 +657,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,
CcRegionPanel *self)
@@ -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>