static gchar * engine_get_display_name (IBusEngineDesc *engine_desc) { const gchar *name; const gchar *language_code; const gchar *language; gchar *display_name; name = ibus_engine_desc_get_longname (engine_desc); language_code = ibus_engine_desc_get_language (engine_desc); language = ibus_get_language_name (language_code); display_name = g_strdup_printf ("%s (%s)", language, name); return display_name; }
static void get_ibus_locale_infos (GtkWidget *chooser) { CcInputChooserPrivate *priv = GET_PRIVATE (chooser); GHashTableIter iter; LocaleInfo *info; const gchar *engine_id; IBusEngineDesc *engine; if (!priv->ibus_engines || priv->is_login) return; g_hash_table_iter_init (&iter, priv->ibus_engines); while (g_hash_table_iter_next (&iter, (gpointer *) &engine_id, (gpointer *) &engine)) { gchar *lang_code = NULL; gchar *country_code = NULL; const gchar *ibus_locale = ibus_engine_desc_get_language (engine); if (gnome_parse_locale (ibus_locale, &lang_code, &country_code, NULL, NULL) && lang_code != NULL && country_code != NULL) { gchar *locale = g_strdup_printf ("%s_%s.UTF-8", lang_code, country_code); info = g_hash_table_lookup (priv->locales, locale); if (info) { const gchar *type, *id; if (gnome_get_input_source_from_locale (locale, &type, &id) && g_str_equal (type, INPUT_SOURCE_TYPE_IBUS) && g_str_equal (id, engine_id)) { add_default_row (chooser, info, type, id); } else { add_row (chooser, info, INPUT_SOURCE_TYPE_IBUS, engine_id); } } else { add_row_other (chooser, INPUT_SOURCE_TYPE_IBUS, engine_id); } g_free (locale); } else if (lang_code != NULL) { GHashTableIter iter; GHashTable *locales_for_language; gchar *language; /* Most IBus engines only specify the language so we try to add them to all locales for that language. */ language = gnome_get_language_from_code (lang_code, NULL); if (language) locales_for_language = g_hash_table_lookup (priv->locales_by_language, language); else locales_for_language = NULL; g_free (language); if (locales_for_language) { g_hash_table_iter_init (&iter, locales_for_language); while (g_hash_table_iter_next (&iter, (gpointer *) &info, NULL)) if (!maybe_set_as_default (chooser, info, engine_id)) add_row (chooser, info, INPUT_SOURCE_TYPE_IBUS, engine_id); } else { add_row_other (chooser, INPUT_SOURCE_TYPE_IBUS, engine_id); } } else { add_row_other (chooser, INPUT_SOURCE_TYPE_IBUS, engine_id); } g_free (country_code); g_free (lang_code); } }