static GtkWidget * input_source_widget_new (GtkWidget *chooser, const gchar *type, const gchar *id) { CcInputChooserPrivate *priv = GET_PRIVATE (chooser); GtkWidget *widget = NULL; if (g_str_equal (type, INPUT_SOURCE_TYPE_XKB)) { const gchar *display_name; gnome_xkb_info_get_layout_info (priv->xkb_info, id, &display_name, NULL, NULL, NULL); widget = padded_label_new (display_name, ROW_LABEL_POSITION_START, ROW_TRAVEL_DIRECTION_NONE, FALSE); g_object_set_data (G_OBJECT (widget), "name", (gpointer) display_name); g_object_set_data_full (G_OBJECT (widget), "unaccented-name", cc_util_normalize_casefold_and_unaccent (display_name), g_free); } else if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) { #ifdef HAVE_IBUS gchar *display_name; GtkWidget *image; display_name = engine_get_display_name (g_hash_table_lookup (priv->ibus_engines, id)); widget = padded_label_new (display_name, ROW_LABEL_POSITION_START, ROW_TRAVEL_DIRECTION_NONE, FALSE); image = gtk_image_new_from_icon_name ("system-run-symbolic", GTK_ICON_SIZE_MENU); set_row_widget_margins (image); gtk_style_context_add_class (gtk_widget_get_style_context (image), "dim-label"); gtk_box_pack_start (GTK_BOX (widget), image, FALSE, TRUE, 0); g_object_set_data_full (G_OBJECT (widget), "name", display_name, g_free); g_object_set_data_full (G_OBJECT (widget), "unaccented-name", cc_util_normalize_casefold_and_unaccent (display_name), g_free); #else widget = NULL; #endif /* HAVE_IBUS */ } if (widget) { g_object_set_data (G_OBJECT (widget), "type", (gpointer) type); g_object_set_data (G_OBJECT (widget), "id", (gpointer) id); } return widget; }
static void update_ibus_active_sources (GtkBuilder *builder) { GtkTreeView *tv; GtkTreeModel *model; GtkTreeIter iter; gchar *type, *id; gboolean ret; tv = GTK_TREE_VIEW (WID ("active_input_sources")); model = gtk_tree_view_get_model (tv); ret = gtk_tree_model_get_iter_first (model, &iter); while (ret) { gtk_tree_model_get (model, &iter, TYPE_COLUMN, &type, ID_COLUMN, &id, -1); if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) { IBusEngineDesc *engine_desc = NULL; gchar *display_name = NULL; engine_desc = g_hash_table_lookup (ibus_engines, id); if (engine_desc) { display_name = engine_get_display_name (engine_desc); gtk_list_store_set (GTK_LIST_STORE (model), &iter, NAME_COLUMN, display_name, -1); g_free (display_name); } } g_free (type); g_free (id); ret = gtk_tree_model_iter_next (model, &iter); } input_chooser_repopulate (GTK_LIST_STORE (model)); }
static void populate_with_active_sources (GtkListStore *store) { GVariant *sources; GVariantIter iter; const gchar *name; const gchar *type; const gchar *id; gchar *display_name; GDesktopAppInfo *app_info; GtkTreeIter tree_iter; sources = g_settings_get_value (input_sources_settings, KEY_INPUT_SOURCES); g_variant_iter_init (&iter, sources); while (g_variant_iter_next (&iter, "(&s&s)", &type, &id)) { display_name = NULL; app_info = NULL; if (g_str_equal (type, INPUT_SOURCE_TYPE_XKB)) { gnome_xkb_info_get_layout_info (xkb_info, id, &name, NULL, NULL, NULL); if (!name) { g_warning ("Couldn't find XKB input source '%s'", id); continue; } display_name = g_strdup (name); } else if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) { #ifdef HAVE_IBUS IBusEngineDesc *engine_desc = NULL; if (ibus_engines) engine_desc = g_hash_table_lookup (ibus_engines, id); if (engine_desc) display_name = engine_get_display_name (engine_desc); app_info = setup_app_info_for_id (id); #else g_warning ("IBus input source type specified but IBus support was not compiled"); continue; #endif } else { g_warning ("Unknown input source type '%s'", type); continue; } gtk_list_store_append (store, &tree_iter); gtk_list_store_set (store, &tree_iter, NAME_COLUMN, display_name ? display_name : id, TYPE_COLUMN, type, ID_COLUMN, id, SETUP_COLUMN, app_info, -1); g_free (display_name); if (app_info) g_object_unref (app_info); } g_variant_unref (sources); }
static void populate_model (GtkListStore *store, GtkListStore *active_sources_store) { GHashTable *active_sources_table; GtkTreeIter iter; const gchar *name; GList *sources, *tmp; gchar *source_id = NULL; active_sources_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); gtk_tree_model_foreach (GTK_TREE_MODEL (active_sources_store), add_source_to_table, active_sources_table); sources = gnome_xkb_info_get_all_layouts (xkb_info); for (tmp = sources; tmp; tmp = tmp->next) { g_free (source_id); source_id = g_strconcat (INPUT_SOURCE_TYPE_XKB, tmp->data, NULL); if (g_hash_table_contains (active_sources_table, source_id)) continue; gnome_xkb_info_get_layout_info (xkb_info, (const gchar *)tmp->data, &name, NULL, NULL, NULL); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, NAME_COLUMN, name, TYPE_COLUMN, INPUT_SOURCE_TYPE_XKB, ID_COLUMN, tmp->data, -1); } g_free (source_id); g_list_free (sources); #ifdef HAVE_IBUS if (ibus_engines) { gchar *display_name; sources = g_hash_table_get_keys (ibus_engines); source_id = NULL; for (tmp = sources; tmp; tmp = tmp->next) { g_free (source_id); source_id = g_strconcat (INPUT_SOURCE_TYPE_IBUS, tmp->data, NULL); if (g_hash_table_contains (active_sources_table, source_id)) continue; display_name = engine_get_display_name (g_hash_table_lookup (ibus_engines, tmp->data)); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, NAME_COLUMN, display_name, TYPE_COLUMN, INPUT_SOURCE_TYPE_IBUS, ID_COLUMN, tmp->data, -1); g_free (display_name); } g_free (source_id); g_list_free (sources); } #endif g_hash_table_destroy (active_sources_table); }