diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2018-06-29 14:13:29 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2018-09-19 16:31:47 +0200 |
commit | a2daee0c7fa3b3a147e0d2e7262bc92655151823 (patch) | |
tree | 5a8191264b50ffa34de9502d9e071cd54d1f4310 | |
parent | ec57ffcdd57ba5cfd8359b42a3528ffcd3b8f0fb (diff) | |
download | gnome-control-center-a2daee0c7fa3b3a147e0d2e7262bc92655151823.tar.gz |
region: Use GtkTemplate for input chooser dialog
-rw-r--r-- | panels/region/cc-input-chooser.c | 439 | ||||
-rw-r--r-- | panels/region/cc-input-chooser.h | 29 | ||||
-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.c | 15 | ||||
-rw-r--r-- | panels/region/meson.build | 2 | ||||
-rw-r--r-- | panels/region/region.gresource.xml | 2 | ||||
-rw-r--r-- | po/POTFILES.in | 2 |
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 |