summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2018-06-29 14:13:29 +1200
committerRobert Ancell <robert.ancell@canonical.com>2018-09-19 16:31:47 +0200
commita2daee0c7fa3b3a147e0d2e7262bc92655151823 (patch)
tree5a8191264b50ffa34de9502d9e071cd54d1f4310
parentec57ffcdd57ba5cfd8359b42a3528ffcd3b8f0fb (diff)
downloadgnome-control-center-a2daee0c7fa3b3a147e0d2e7262bc92655151823.tar.gz
region: Use GtkTemplate for input chooser dialog
-rw-r--r--panels/region/cc-input-chooser.c439
-rw-r--r--panels/region/cc-input-chooser.h29
-rw-r--r--panels/region/cc-input-chooser.ui (renamed from panels/region/input-chooser.ui)23
-rw-r--r--panels/region/cc-region-panel.c15
-rw-r--r--panels/region/meson.build2
-rw-r--r--panels/region/region.gresource.xml2
-rw-r--r--po/POTFILES.in2
7 files changed, 254 insertions, 258 deletions
diff --git a/panels/region/cc-input-chooser.c b/panels/region/cc-input-chooser.c
index 9646017e3..fcc55b8fa 100644
--- a/panels/region/cc-input-chooser.c
+++ b/panels/region/cc-input-chooser.c
@@ -49,12 +49,15 @@ typedef enum {
ROW_LABEL_POSITION_END
} RowLabelPosition;
-typedef struct {
+struct _CcInputChooser {
+ GtkDialog parent_instance;
+
/* Not owned */
GtkWidget *add_button;
GtkWidget *filter_entry;
- GtkWidget *list;
+ GtkWidget *input_listbox;
GtkWidget *scrolledwindow;
+ GtkWidget *login_label;
GtkAdjustment *adjustment;
GnomeXkbInfo *xkb_info;
GHashTable *ibus_engines;
@@ -69,10 +72,9 @@ typedef struct {
gchar **filter_words;
gboolean is_login;
-} CcInputChooserPrivate;
+};
-#define GET_PRIVATE(chooser) ((CcInputChooserPrivate *) g_object_get_data (G_OBJECT (chooser), "private"))
-#define WID(name) ((GtkWidget *) gtk_builder_get_object (builder, name))
+G_DEFINE_TYPE (CcInputChooser, cc_input_chooser, GTK_TYPE_DIALOG)
typedef struct {
gchar *id;
@@ -210,11 +212,10 @@ locale_row_new (const gchar *text)
}
static GtkListBoxRow *
-input_source_row_new (GtkWidget *chooser,
- const gchar *type,
- const gchar *id)
+input_source_row_new (CcInputChooser *chooser,
+ const gchar *type,
+ const gchar *id)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
GtkWidget *row = NULL;
GtkWidget *widget;
@@ -222,7 +223,7 @@ input_source_row_new (GtkWidget *chooser,
{
const gchar *display_name;
- gnome_xkb_info_get_layout_info (priv->xkb_info, id, &display_name, NULL, NULL, NULL);
+ gnome_xkb_info_get_layout_info (chooser->xkb_info, id, &display_name, NULL, NULL, NULL);
row = gtk_list_box_row_new ();
widget = padded_label_new (display_name,
@@ -240,7 +241,7 @@ input_source_row_new (GtkWidget *chooser,
gchar *display_name;
GtkWidget *image;
- display_name = engine_get_display_name (g_hash_table_lookup (priv->ibus_engines, id));
+ display_name = engine_get_display_name (g_hash_table_lookup (chooser->ibus_engines, id));
row = gtk_list_box_row_new ();
widget = padded_label_new (display_name,
@@ -284,33 +285,30 @@ remove_all_children (GtkContainer *container)
}
static void
-add_input_source_rows_for_locale (GtkWidget *chooser,
- LocaleInfo *info)
+add_input_source_rows_for_locale (CcInputChooser *chooser,
+ LocaleInfo *info)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
GtkWidget *row;
GHashTableIter iter;
const gchar *id;
if (info->default_input_source_row)
- gtk_container_add (GTK_CONTAINER (priv->list), GTK_WIDGET (info->default_input_source_row));
+ gtk_container_add (GTK_CONTAINER (chooser->input_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 (priv->list), row);
+ gtk_container_add (GTK_CONTAINER (chooser->input_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 (priv->list), row);
+ gtk_container_add (GTK_CONTAINER (chooser->input_listbox), row);
}
static void
-show_input_sources_for_locale (GtkWidget *chooser,
- LocaleInfo *info)
+show_input_sources_for_locale (CcInputChooser *chooser,
+ LocaleInfo *info)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
-
- remove_all_children (GTK_CONTAINER (priv->list));
+ remove_all_children (GTK_CONTAINER (chooser->input_listbox));
if (!info->back_row)
{
@@ -318,23 +316,23 @@ show_input_sources_for_locale (GtkWidget *chooser,
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 (priv->list), GTK_WIDGET (info->back_row));
+ gtk_container_add (GTK_CONTAINER (chooser->input_listbox), GTK_WIDGET (info->back_row));
add_input_source_rows_for_locale (chooser, info);
- gtk_widget_show_all (priv->list);
+ gtk_widget_show_all (chooser->input_listbox);
- gtk_adjustment_set_value (priv->adjustment,
- gtk_adjustment_get_lower (priv->adjustment));
- gtk_list_box_set_header_func (GTK_LIST_BOX (priv->list), cc_list_box_update_header_func, NULL, NULL);
- 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));
+ gtk_adjustment_set_value (chooser->adjustment,
+ gtk_adjustment_get_lower (chooser->adjustment));
+ gtk_list_box_set_header_func (GTK_LIST_BOX (chooser->input_listbox), cc_list_box_update_header_func, NULL, NULL);
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->input_listbox));
+ gtk_list_box_set_selection_mode (GTK_LIST_BOX (chooser->input_listbox), GTK_SELECTION_SINGLE);
+ gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (chooser->input_listbox), FALSE);
+ gtk_list_box_unselect_all (GTK_LIST_BOX (chooser->input_listbox));
- if (gtk_widget_is_visible (priv->filter_entry) &&
- !gtk_widget_is_focus (priv->filter_entry))
- gtk_widget_grab_focus (priv->filter_entry);
+ if (gtk_widget_is_visible (chooser->filter_entry) &&
+ !gtk_widget_is_focus (chooser->filter_entry))
+ gtk_widget_grab_focus (chooser->filter_entry);
}
static gboolean
@@ -344,19 +342,18 @@ is_current_locale (const gchar *locale)
}
static void
-show_locale_rows (GtkWidget *chooser)
+show_locale_rows (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
g_autoptr(GHashTable) initial = NULL;
LocaleInfo *info;
GHashTableIter iter;
- remove_all_children (GTK_CONTAINER (priv->list));
+ remove_all_children (GTK_CONTAINER (chooser->input_listbox));
- if (!priv->showing_extra)
+ if (!chooser->showing_extra)
initial = cc_common_language_get_initial_languages ();
- g_hash_table_iter_init (&iter, priv->locales);
+ g_hash_table_iter_init (&iter, chooser->locales);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &info))
{
if (!info->default_input_source_row &&
@@ -369,28 +366,28 @@ show_locale_rows (GtkWidget *chooser)
info->locale_row = g_object_ref_sink (locale_row_new (info->name));
g_object_set_data (G_OBJECT (info->locale_row), "locale-info", info);
- if (!priv->showing_extra &&
+ if (!chooser->showing_extra &&
!g_hash_table_contains (initial, info->id) &&
!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 (priv->list), GTK_WIDGET (info->locale_row));
+ gtk_container_add (GTK_CONTAINER (chooser->input_listbox), GTK_WIDGET (info->locale_row));
}
- gtk_container_add (GTK_CONTAINER (priv->list), GTK_WIDGET (priv->more_row));
+ gtk_container_add (GTK_CONTAINER (chooser->input_listbox), GTK_WIDGET (chooser->more_row));
- gtk_widget_show_all (priv->list);
+ gtk_widget_show_all (chooser->input_listbox);
- gtk_adjustment_set_value (priv->adjustment,
- gtk_adjustment_get_lower (priv->adjustment));
- gtk_list_box_set_header_func (GTK_LIST_BOX (priv->list), cc_list_box_update_header_func, NULL, NULL);
- gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->list));
- gtk_list_box_set_selection_mode (GTK_LIST_BOX (priv->list), GTK_SELECTION_NONE);
- gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (priv->list), TRUE);
+ gtk_adjustment_set_value (chooser->adjustment,
+ gtk_adjustment_get_lower (chooser->adjustment));
+ gtk_list_box_set_header_func (GTK_LIST_BOX (chooser->input_listbox), cc_list_box_update_header_func, NULL, NULL);
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->input_listbox));
+ gtk_list_box_set_selection_mode (GTK_LIST_BOX (chooser->input_listbox), GTK_SELECTION_NONE);
+ gtk_list_box_set_activate_on_single_click (GTK_LIST_BOX (chooser->input_listbox), TRUE);
- if (gtk_widget_is_visible (priv->filter_entry) &&
- !gtk_widget_is_focus (priv->filter_entry))
- gtk_widget_grab_focus (priv->filter_entry);
+ if (gtk_widget_is_visible (chooser->filter_entry) &&
+ !gtk_widget_is_focus (chooser->filter_entry))
+ gtk_widget_grab_focus (chooser->filter_entry);
}
static gint
@@ -398,8 +395,7 @@ list_sort (gconstpointer a,
gconstpointer b,
gpointer data)
{
- GtkWidget *chooser = data;
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
+ CcInputChooser *chooser = data;
LocaleInfo *ia;
LocaleInfo *ib;
const gchar *la;
@@ -407,9 +403,9 @@ list_sort (gconstpointer a,
gint retval;
/* Always goes at the end */
- if (a == priv->more_row)
+ if (a == chooser->more_row)
return 1;
- if (b == priv->more_row)
+ if (b == chooser->more_row)
return -1;
ia = g_object_get_data (G_OBJECT (a), "locale-info");
@@ -479,23 +475,22 @@ match_source_in_table (gchar **words,
static gboolean
list_filter (GtkListBoxRow *row,
- gpointer user_data)
+ gpointer user_data)
{
- GtkDialog *chooser = user_data;
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
+ CcInputChooser *chooser = user_data;
LocaleInfo *info;
gboolean is_extra;
const gchar *source_name;
- if (row == priv->more_row)
- return !priv->showing_extra;
+ if (row == chooser->more_row)
+ return !chooser->showing_extra;
is_extra = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-extra"));
- if (!priv->showing_extra && is_extra)
+ if (!chooser->showing_extra && is_extra)
return FALSE;
- if (!priv->filter_words)
+ if (!chooser->filter_words)
return TRUE;
info = g_object_get_data (G_OBJECT (row), "locale-info");
@@ -503,23 +498,23 @@ list_filter (GtkListBoxRow *row,
if (row == info->back_row)
return TRUE;
- if (match_all (priv->filter_words, info->unaccented_name))
+ if (match_all (chooser->filter_words, info->unaccented_name))
return TRUE;
- if (match_all (priv->filter_words, info->untranslated_name))
+ if (match_all (chooser->filter_words, info->untranslated_name))
return TRUE;
source_name = g_object_get_data (G_OBJECT (row), "unaccented-name");
if (source_name)
{
- if (match_all (priv->filter_words, source_name))
+ if (match_all (chooser->filter_words, source_name))
return TRUE;
}
else
{
- if (match_source_in_table (priv->filter_words, info->layout_rows_by_id))
+ if (match_source_in_table (chooser->filter_words, info->layout_rows_by_id))
return TRUE;
- if (match_source_in_table (priv->filter_words, info->engine_rows_by_id))
+ if (match_source_in_table (chooser->filter_words, info->engine_rows_by_id))
return TRUE;
}
@@ -543,68 +538,62 @@ strvs_differ (gchar **av,
}
static gboolean
-do_filter (GtkWidget *chooser)
+do_filter (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
g_auto(GStrv) previous_words = NULL;
g_autofree gchar *filter_contents = NULL;
- priv->filter_timeout_id = 0;
+ chooser->filter_timeout_id = 0;
filter_contents =
- cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY (priv->filter_entry)));
+ cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY (chooser->filter_entry)));
- previous_words = priv->filter_words;
- priv->filter_words = g_strsplit_set (g_strstrip (filter_contents), " ", 0);
+ previous_words = chooser->filter_words;
+ chooser->filter_words = g_strsplit_set (g_strstrip (filter_contents), " ", 0);
- if (!priv->filter_words[0])
+ if (!chooser->filter_words[0])
{
- gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->list));
- gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->list), NULL);
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->input_listbox));
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (chooser->input_listbox), NULL);
}
- else if (previous_words == NULL || strvs_differ (priv->filter_words, previous_words))
+ else if (previous_words == NULL || strvs_differ (chooser->filter_words, previous_words))
{
- gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->list));
- gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->list), priv->no_results);
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->input_listbox));
+ gtk_list_box_set_placeholder (GTK_LIST_BOX (chooser->input_listbox), chooser->no_results);
}
return G_SOURCE_REMOVE;
}
static void
-filter_changed (GtkWidget *chooser)
+filter_changed (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
-
- if (priv->filter_timeout_id == 0)
- priv->filter_timeout_id = g_timeout_add (FILTER_TIMEOUT, (GSourceFunc) do_filter, chooser);
+ if (chooser->filter_timeout_id == 0)
+ chooser->filter_timeout_id = g_timeout_add (FILTER_TIMEOUT, (GSourceFunc) do_filter, chooser);
}
static void
-show_more (GtkWidget *chooser)
+show_more (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
-
- gtk_widget_show (priv->filter_entry);
- gtk_widget_grab_focus (priv->filter_entry);
+ gtk_widget_show (chooser->filter_entry);
+ gtk_widget_grab_focus (chooser->filter_entry);
- priv->showing_extra = TRUE;
+ chooser->showing_extra = TRUE;
- gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->list));
+ gtk_list_box_invalidate_filter (GTK_LIST_BOX (chooser->input_listbox));
}
static void
-row_activated (GtkListBox *box,
- GtkListBoxRow *row,
- GtkWidget *chooser)
+row_activated (GtkListBox *box,
+ GtkListBoxRow *row,
+ CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
gpointer data;
if (!row)
return;
- if (row == priv->more_row)
+ if (row == chooser->more_row)
{
show_more (chooser);
return;
@@ -620,10 +609,10 @@ row_activated (GtkListBox *box,
data = g_object_get_data (G_OBJECT (row), "name");
if (data)
{
- if (gtk_widget_is_sensitive (priv->add_button))
+ if (gtk_widget_is_sensitive (chooser->add_button))
gtk_dialog_response (GTK_DIALOG (chooser),
gtk_dialog_get_response_for_widget (GTK_DIALOG (chooser),
- priv->add_button));
+ chooser->add_button));
return;
}
@@ -636,10 +625,9 @@ row_activated (GtkListBox *box,
}
static void
-selected_rows_changed (GtkListBox *box,
- GtkWidget *chooser)
+selected_rows_changed (GtkListBox *box,
+ CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
gboolean sensitive = TRUE;
GtkListBoxRow *row;
@@ -647,13 +635,13 @@ selected_rows_changed (GtkListBox *box,
if (!row || g_object_get_data (G_OBJECT (row), "back"))
sensitive = FALSE;
- gtk_widget_set_sensitive (priv->add_button, sensitive);
+ gtk_widget_set_sensitive (chooser->add_button, sensitive);
}
static gboolean
-list_button_release_event (GtkListBox *box,
- GdkEvent *event,
- GtkWidget *chooser)
+list_button_release_event (GtkListBox *box,
+ GdkEvent *event,
+ CcInputChooser *chooser)
{
gdouble x, y;
GtkListBoxRow *row;
@@ -670,10 +658,10 @@ list_button_release_event (GtkListBox *box,
}
static void
-add_default_row (GtkWidget *chooser,
- LocaleInfo *info,
- const gchar *type,
- const gchar *id)
+add_default_row (CcInputChooser *chooser,
+ LocaleInfo *info,
+ const gchar *type,
+ const gchar *id)
{
info->default_input_source_row = input_source_row_new (chooser, type, id);
if (info->default_input_source_row)
@@ -685,11 +673,11 @@ add_default_row (GtkWidget *chooser,
}
static void
-add_rows_to_table (GtkWidget *chooser,
- LocaleInfo *info,
- GList *list,
- const gchar *type,
- const gchar *default_id)
+add_rows_to_table (CcInputChooser *chooser,
+ LocaleInfo *info,
+ GList *list,
+ const gchar *type,
+ const gchar *default_id)
{
GHashTable *table;
GtkListBoxRow *row;
@@ -721,10 +709,10 @@ add_rows_to_table (GtkWidget *chooser,
}
static void
-add_row (GtkWidget *chooser,
- LocaleInfo *info,
- const gchar *type,
- const gchar *id)
+add_row (CcInputChooser *chooser,
+ LocaleInfo *info,
+ const gchar *type,
+ const gchar *id)
{
GList tmp = { 0 };
tmp.data = (gpointer) id;
@@ -732,20 +720,19 @@ add_row (GtkWidget *chooser,
}
static void
-add_row_other (GtkWidget *chooser,
- const gchar *type,
- const gchar *id)
+add_row_other (CcInputChooser *chooser,
+ const gchar *type,
+ const gchar *id)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
- LocaleInfo *info = g_hash_table_lookup (priv->locales, "");
+ LocaleInfo *info = g_hash_table_lookup (chooser->locales, "");
add_row (chooser, info, type, id);
}
#ifdef HAVE_IBUS
static gboolean
-maybe_set_as_default (GtkWidget *chooser,
- LocaleInfo *info,
- const gchar *engine_id)
+maybe_set_as_default (CcInputChooser *chooser,
+ LocaleInfo *info,
+ const gchar *engine_id)
{
const gchar *type, *id;
@@ -764,18 +751,17 @@ maybe_set_as_default (GtkWidget *chooser,
}
static void
-get_ibus_locale_infos (GtkWidget *chooser)
+get_ibus_locale_infos (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
GHashTableIter iter;
LocaleInfo *info;
const gchar *engine_id;
IBusEngineDesc *engine;
- if (!priv->ibus_engines || priv->is_login)
+ if (!chooser->ibus_engines || chooser->is_login)
return;
- g_hash_table_iter_init (&iter, priv->ibus_engines);
+ g_hash_table_iter_init (&iter, chooser->ibus_engines);
while (g_hash_table_iter_next (&iter, (gpointer *) &engine_id, (gpointer *) &engine))
{
g_autofree gchar *lang_code = NULL;
@@ -788,7 +774,7 @@ get_ibus_locale_infos (GtkWidget *chooser)
{
g_autofree gchar *locale = g_strdup_printf ("%s_%s.UTF-8", lang_code, country_code);
- info = g_hash_table_lookup (priv->locales, locale);
+ info = g_hash_table_lookup (chooser->locales, locale);
if (info)
{
const gchar *type, *id;
@@ -820,7 +806,7 @@ get_ibus_locale_infos (GtkWidget *chooser)
language = gnome_get_language_from_code (lang_code, NULL);
if (language)
- locales_for_language = g_hash_table_lookup (priv->locales_by_language, language);
+ locales_for_language = g_hash_table_lookup (chooser->locales_by_language, language);
else
locales_for_language = NULL;
@@ -875,9 +861,8 @@ add_ids_to_set (GHashTable *set,
}
static void
-get_locale_infos (GtkWidget *chooser)
+get_locale_infos (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
g_autoptr(GHashTable) layouts_with_locale = NULL;
LocaleInfo *info;
g_auto(GStrv) locale_ids = NULL;
@@ -885,10 +870,10 @@ get_locale_infos (GtkWidget *chooser)
g_autoptr(GList) all_layouts = NULL;
GList *l;
- priv->locales = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, locale_info_free);
- priv->locales_by_language = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, (GDestroyNotify) g_hash_table_destroy);
+ chooser->locales = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, locale_info_free);
+ chooser->locales_by_language = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify) g_hash_table_destroy);
layouts_with_locale = g_hash_table_new (g_str_hash, g_str_equal);
@@ -911,7 +896,7 @@ get_locale_infos (GtkWidget *chooser)
else
simple_locale = g_strdup_printf ("%s.UTF-8", lang_code);
- if (g_hash_table_contains (priv->locales, simple_locale))
+ if (g_hash_table_contains (chooser->locales, simple_locale))
continue;
info = g_new0 (LocaleInfo, 1);
@@ -921,8 +906,8 @@ get_locale_infos (GtkWidget *chooser)
tmp = gnome_get_language_from_locale (simple_locale, "C");
info->untranslated_name = cc_util_normalize_casefold_and_unaccent (tmp);
- g_hash_table_replace (priv->locales, g_strdup (simple_locale), info);
- add_locale_to_table (priv->locales_by_language, lang_code, info);
+ g_hash_table_replace (chooser->locales, g_strdup (simple_locale), info);
+ add_locale_to_table (chooser->locales_by_language, lang_code, info);
if (gnome_get_input_source_from_locale (simple_locale, &type, &id) &&
g_str_equal (type, INPUT_SOURCE_TYPE_XKB))
@@ -937,13 +922,13 @@ get_locale_infos (GtkWidget *chooser)
info->engine_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, g_object_unref);
- language_layouts = gnome_xkb_info_get_layouts_for_language (priv->xkb_info, lang_code);
+ language_layouts = gnome_xkb_info_get_layouts_for_language (chooser->xkb_info, lang_code);
add_rows_to_table (chooser, info, language_layouts, INPUT_SOURCE_TYPE_XKB, id);
add_ids_to_set (layouts_with_locale, language_layouts);
if (country_code != NULL)
{
- g_autoptr(GList) country_layouts = gnome_xkb_info_get_layouts_for_country (priv->xkb_info, country_code);
+ g_autoptr(GList) country_layouts = gnome_xkb_info_get_layouts_for_country (chooser->xkb_info, country_code);
add_rows_to_table (chooser, info, country_layouts, INPUT_SOURCE_TYPE_XKB, id);
add_ids_to_set (layouts_with_locale, country_layouts);
}
@@ -955,38 +940,24 @@ get_locale_infos (GtkWidget *chooser)
info->name = g_strdup (C_("Input Source", "Other"));
info->unaccented_name = g_strdup ("");
info->untranslated_name = g_strdup ("");
- g_hash_table_replace (priv->locales, info->id, info);
+ g_hash_table_replace (chooser->locales, info->id, info);
info->layout_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, g_object_unref);
info->engine_rows_by_id = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, g_object_unref);
- all_layouts = gnome_xkb_info_get_all_layouts (priv->xkb_info);
+ all_layouts = gnome_xkb_info_get_all_layouts (chooser->xkb_info);
for (l = all_layouts; l; l = l->next)
if (!g_hash_table_contains (layouts_with_locale, l->data))
add_row_other (chooser, INPUT_SOURCE_TYPE_XKB, l->data);
}
-static void
-cc_input_chooser_private_free (gpointer data)
-{
- CcInputChooserPrivate *priv = data;
-
- g_object_unref (priv->more_row);
- g_object_unref (priv->no_results);
- g_hash_table_destroy (priv->locales);
- g_hash_table_destroy (priv->locales_by_language);
- g_strfreev (priv->filter_words);
- if (priv->filter_timeout_id)
- g_source_remove (priv->filter_timeout_id);
- g_free (priv);
-}
static gboolean
-reset_on_escape (GtkWidget *widget,
- GdkEventKey *event,
- GtkWidget *chooser)
+reset_on_escape (GtkWidget *widget,
+ GdkEventKey *event,
+ CcInputChooser *chooser)
{
if (event->keyval == GDK_KEY_Escape)
cc_input_chooser_reset (chooser);
@@ -994,52 +965,80 @@ reset_on_escape (GtkWidget *widget,
return FALSE;
}
-GtkWidget *
-cc_input_chooser_new (GtkWindow *main_window,
- gboolean is_login,
- GnomeXkbInfo *xkb_info,
- GHashTable *ibus_engines)
+static void
+cc_input_chooser_dispose (GObject *object)
{
- g_autoptr(GtkBuilder) builder = NULL;
- GtkWidget *chooser;
- CcInputChooserPrivate *priv;
- g_autoptr(GError) error = NULL;
-
- builder = gtk_builder_new ();
- if (gtk_builder_add_from_resource (builder, "/org/gnome/control-center/region/input-chooser.ui", &error) == 0)
+ CcInputChooser *chooser = CC_INPUT_CHOOSER (object);
+
+ g_clear_object (&chooser->more_row);
+ g_clear_object (&chooser->no_results);
+ g_clear_pointer (&chooser->locales, g_hash_table_destroy);
+ g_clear_pointer (&chooser->locales_by_language, g_hash_table_destroy);
+ g_clear_pointer (&chooser->filter_words, g_strfreev);
+ if (chooser->filter_timeout_id)
{
- g_warning ("failed to load input chooser: %s", error->message);
- return NULL;
+ g_source_remove (chooser->filter_timeout_id);
+ chooser->filter_timeout_id = 0;
}
- chooser = WID ("input-dialog");
- priv = g_new0 (CcInputChooserPrivate, 1);
- g_object_set_data_full (G_OBJECT (chooser), "private", priv, cc_input_chooser_private_free);
- priv->is_login = is_login;
- priv->xkb_info = xkb_info;
- priv->ibus_engines = ibus_engines;
+ G_OBJECT_CLASS (cc_input_chooser_parent_class)->dispose (object);
+}
- priv->add_button = WID ("add-button");
- priv->filter_entry = WID ("filter-entry");
- priv->list = WID ("list");
- priv->scrolledwindow = WID ("scrolledwindow");
- priv->adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scrolledwindow));
+static void
+cc_input_chooser_class_init (CcInputChooserClass *klass)
+{
+ GObjectClass *object_klass = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_klass = GTK_WIDGET_CLASS (klass);
- priv->more_row = g_object_ref_sink (more_row_new ());
- priv->no_results = g_object_ref_sink (no_results_widget_new ());
- gtk_widget_show_all (priv->no_results);
+ object_klass->dispose = cc_input_chooser_dispose;
- gtk_list_box_set_filter_func (GTK_LIST_BOX (priv->list), list_filter, chooser, NULL);
- gtk_list_box_set_sort_func (GTK_LIST_BOX (priv->list), (GtkListBoxSortFunc)list_sort, chooser, NULL);
- g_signal_connect (priv->list, "row-activated", G_CALLBACK (row_activated), chooser);
- g_signal_connect (priv->list, "selected-rows-changed", G_CALLBACK (selected_rows_changed), chooser);
- g_signal_connect (priv->list, "button-release-event", G_CALLBACK (list_button_release_event), chooser);
+ gtk_widget_class_set_template_from_resource (widget_klass, "/org/gnome/control-center/region/cc-input-chooser.ui");
- g_signal_connect_swapped (priv->filter_entry, "search-changed", G_CALLBACK (filter_changed), chooser);
- g_signal_connect (priv->filter_entry, "key-release-event", G_CALLBACK (reset_on_escape), chooser);
+ 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);
+}
- if (priv->is_login)
- gtk_widget_show (WID ("login-label"));
+void
+cc_input_chooser_init (CcInputChooser *chooser)
+{
+ gtk_widget_init_template (GTK_WIDGET (chooser));
+
+ chooser->adjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (chooser->scrolledwindow));
+
+ chooser->more_row = g_object_ref_sink (more_row_new ());
+ chooser->no_results = g_object_ref_sink (no_results_widget_new ());
+ gtk_widget_show_all (chooser->no_results);
+
+ gtk_list_box_set_filter_func (GTK_LIST_BOX (chooser->input_listbox), list_filter, chooser, NULL);
+ gtk_list_box_set_sort_func (GTK_LIST_BOX (chooser->input_listbox), (GtkListBoxSortFunc)list_sort, chooser, NULL);
+ g_signal_connect (chooser->input_listbox, "row-activated", G_CALLBACK (row_activated), chooser);
+ g_signal_connect (chooser->input_listbox, "selected-rows-changed", G_CALLBACK (selected_rows_changed), chooser);
+ g_signal_connect (chooser->input_listbox, "button-release-event", G_CALLBACK (list_button_release_event), chooser);
+
+ g_signal_connect_swapped (chooser->filter_entry, "search-changed", G_CALLBACK (filter_changed), chooser);
+ g_signal_connect (chooser->filter_entry, "key-release-event", G_CALLBACK (reset_on_escape), chooser);
+
+ if (chooser->is_login)
+ gtk_widget_show (chooser->login_label);
+}
+
+CcInputChooser *
+cc_input_chooser_new (gboolean is_login,
+ GnomeXkbInfo *xkb_info,
+ GHashTable *ibus_engines)
+{
+ CcInputChooser *chooser;
+
+ chooser = g_object_new (CC_TYPE_INPUT_CHOOSER,
+ "use-header-bar", 1,
+ NULL);
+
+ chooser->is_login = is_login;
+ chooser->xkb_info = xkb_info;
+ chooser->ibus_engines = ibus_engines;
get_locale_infos (chooser);
#ifdef HAVE_IBUS
@@ -1047,39 +1046,38 @@ cc_input_chooser_new (GtkWindow *main_window,
#endif /* HAVE_IBUS */
show_locale_rows (chooser);
- gtk_window_set_transient_for (GTK_WINDOW (chooser), main_window);
-
return chooser;
}
void
-cc_input_chooser_set_ibus_engines (GtkWidget *chooser,
- GHashTable *ibus_engines)
+cc_input_chooser_set_ibus_engines (CcInputChooser *chooser,
+ GHashTable *ibus_engines)
{
-#ifdef HAVE_IBUS
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
+ g_return_if_fail (CC_IS_INPUT_CHOOSER (chooser));
+#ifdef HAVE_IBUS
/* This should only be called once when IBus shows up in case it
wasn't up yet when the user opened the input chooser dialog. */
- g_return_if_fail (priv->ibus_engines == NULL);
+ g_return_if_fail (chooser->ibus_engines == NULL);
- priv->ibus_engines = ibus_engines;
+ chooser->ibus_engines = ibus_engines;
get_ibus_locale_infos (chooser);
show_locale_rows (chooser);
#endif /* HAVE_IBUS */
}
gboolean
-cc_input_chooser_get_selected (GtkWidget *chooser,
- gchar **type,
- gchar **id,
- gchar **name)
+cc_input_chooser_get_selected (CcInputChooser *chooser,
+ gchar **type,
+ gchar **id,
+ gchar **name)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
GtkListBoxRow *selected;
const gchar *t, *i, *n;
- selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (priv->list));
+ g_return_val_if_fail (CC_IS_INPUT_CHOOSER (chooser), FALSE);
+
+ selected = gtk_list_box_get_selected_row (GTK_LIST_BOX (chooser->input_listbox));
if (!selected)
return FALSE;
@@ -1098,12 +1096,13 @@ cc_input_chooser_get_selected (GtkWidget *chooser,
}
void
-cc_input_chooser_reset (GtkWidget *chooser)
+cc_input_chooser_reset (CcInputChooser *chooser)
{
- CcInputChooserPrivate *priv = GET_PRIVATE (chooser);
- priv->showing_extra = FALSE;
- gtk_entry_set_text (GTK_ENTRY (priv->filter_entry), "");
- gtk_widget_hide (priv->filter_entry);
- g_clear_pointer (&priv->filter_words, g_strfreev);
+ g_return_if_fail (CC_IS_INPUT_CHOOSER (chooser));
+
+ chooser->showing_extra = FALSE;
+ gtk_entry_set_text (GTK_ENTRY (chooser->filter_entry), "");
+ gtk_widget_hide (chooser->filter_entry);
+ g_clear_pointer (&chooser->filter_words, g_strfreev);
show_locale_rows (chooser);
}
diff --git a/panels/region/cc-input-chooser.h b/panels/region/cc-input-chooser.h
index f4fbdc7d6..b7402f559 100644
--- a/panels/region/cc-input-chooser.h
+++ b/panels/region/cc-input-chooser.h
@@ -15,30 +15,27 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __CC_INPUT_CHOOSER_H__
-#define __CC_INPUT_CHOOSER_H__
+#pragma once
#include <gtk/gtk.h>
#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libgnome-desktop/gnome-xkb-info.h>
-
G_BEGIN_DECLS
-GtkWidget *cc_input_chooser_new (GtkWindow *parent,
- gboolean is_login,
- GnomeXkbInfo *xkb_info,
- GHashTable *ibus_engines);
-void cc_input_chooser_set_ibus_engines (GtkWidget *chooser,
- GHashTable *ibus_engines);
-gboolean cc_input_chooser_get_selected (GtkWidget *chooser,
- gchar **type,
- gchar **id,
- gchar **name);
+#define CC_TYPE_INPUT_CHOOSER (cc_input_chooser_get_type ())
+G_DECLARE_FINAL_TYPE (CcInputChooser, cc_input_chooser, CC, INPUT_CHOOSER, GtkDialog)
-void cc_input_chooser_reset (GtkWidget *chooser);
+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
-
-#endif /* __CC_INPUT_CHOOSER_H__ */
diff --git a/panels/region/input-chooser.ui b/panels/region/cc-input-chooser.ui
index 79a9d77fd..65a9948de 100644
--- a/panels/region/input-chooser.ui
+++ b/panels/region/cc-input-chooser.ui
@@ -1,15 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
- <object class="GtkDialog" id="input-dialog">
+ <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>
- <property name="use_header_bar">1</property>
<child type="action">
- <object class="GtkButton" id="cancel-button">
+ <object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -18,7 +17,7 @@
</object>
</child>
<child type="action">
- <object class="GtkButton" id="add-button">
+ <object class="GtkButton" id="add_button">
<property name="label" translatable="yes">_Add</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -29,7 +28,7 @@
</object>
</child>
<child internal-child="vbox">
- <object class="GtkBox" id="vbox">
+ <object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">0</property>
@@ -46,10 +45,10 @@
<property name="margin-bottom">6</property>
<property name="min-content-height">300</property>
<child>
- <object class="GtkViewport" id="viewport">
+ <object class="GtkViewport">
<property name="visible">True</property>
<child>
- <object class="GtkListBox" id="list">
+ <object class="GtkListBox" id="input_listbox">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="vexpand">True</property>
@@ -62,7 +61,7 @@
</object>
</child>
<child>
- <object class="GtkSearchEntry" id="filter-entry">
+ <object class="GtkSearchEntry" id="filter_entry">
<property name="visible">False</property>
<property name="hexpand">True</property>
<property name="margin-start">6</property>
@@ -72,7 +71,7 @@
</object>
</child>
<child>
- <object class="GtkLabel" id="login-label">
+ <object class="GtkLabel" id="login_label">
<property name="visible">False</property>
<property name="wrap">True</property>
<property name="label" translatable="yes">Input methods can’t be used on the login screen</property>
@@ -87,8 +86,8 @@
</object>
</child>
<action-widgets>
- <action-widget response="-5" default="true">add-button</action-widget>
- <action-widget response="-6">cancel-button</action-widget>
+ <action-widget response="-5" default="true">add_button</action-widget>
+ <action-widget response="-6">cancel_button</action-widget>
</action-widgets>
- </object>
+ </template>
</interface>
diff --git a/panels/region/cc-region-panel.c b/panels/region/cc-region-panel.c
index 98e2f5b1e..137dc4423 100644
--- a/panels/region/cc-region-panel.c
+++ b/panels/region/cc-region-panel.c
@@ -662,7 +662,7 @@ update_ibus_active_sources (CcRegionPanel *self)
static void
update_input_chooser (CcRegionPanel *self)
{
- GtkWidget *chooser;
+ CcInputChooser *chooser;
chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
if (!chooser)
@@ -969,7 +969,7 @@ input_source_already_added (CcRegionPanel *self,
}
static void
-run_input_chooser (CcRegionPanel *self, GtkWidget *chooser)
+run_input_chooser (CcRegionPanel *self, CcInputChooser *chooser)
{
if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
g_autofree gchar *type = NULL;
@@ -994,21 +994,21 @@ run_input_chooser (CcRegionPanel *self, GtkWidget *chooser)
update_input (self);
}
}
- gtk_widget_hide(chooser);
+ gtk_widget_hide (GTK_WIDGET (chooser));
}
static void
show_input_chooser (CcRegionPanel *self)
{
- GtkWidget *chooser;
- GtkWidget *toplevel;
+ CcInputChooser *chooser;
chooser = g_object_get_data (G_OBJECT (self), "input-chooser");
if (!chooser) {
+ GtkWidget *toplevel;
+
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
- chooser = cc_input_chooser_new (GTK_WINDOW (toplevel),
- self->login,
+ chooser = cc_input_chooser_new (self->login,
self->xkb_info,
#ifdef HAVE_IBUS
self->ibus_engines
@@ -1016,6 +1016,7 @@ show_input_chooser (CcRegionPanel *self)
NULL
#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);
diff --git a/panels/region/meson.build b/panels/region/meson.build
index fd1872cf7..4140558e2 100644
--- a/panels/region/meson.build
+++ b/panels/region/meson.build
@@ -27,7 +27,7 @@ sources = files(
resource_data = files(
'cc-format-chooser.ui',
- 'input-chooser.ui',
+ 'cc-input-chooser.ui',
'region.ui'
)
diff --git a/panels/region/region.gresource.xml b/panels/region/region.gresource.xml
index f1072ec1d..b37d2a4d0 100644
--- a/panels/region/region.gresource.xml
+++ b/panels/region/region.gresource.xml
@@ -4,6 +4,6 @@
<file preprocess="xml-stripblanks">region.ui</file>
<file preprocess="xml-stripblanks">cc-format-chooser.ui</file>
<file preprocess="xml-stripblanks">cc-input-row.ui</file>
- <file preprocess="xml-stripblanks">input-chooser.ui</file>
+ <file preprocess="xml-stripblanks">cc-input-chooser.ui</file>
</gresource>
</gresources>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index af349d46f..3fdd82afa 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -157,9 +157,9 @@ panels/privacy/privacy.ui
panels/region/cc-format-chooser.c
panels/region/cc-format-chooser.ui
panels/region/cc-input-chooser.c
+panels/region/cc-input-chooser.ui
panels/region/cc-region-panel.c
panels/region/gnome-region-panel.desktop.in.in
-panels/region/input-chooser.ui
panels/region/region.ui
panels/search/cc-search-locations-dialog.c
panels/search/cc-search-panel.c