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 show_selected_layout (GtkButton *button, gpointer data) { GtkBuilder *builder = data; GtkTreeModel *model; GtkTreeIter iter; gchar *type; gchar *id; gchar *kbd_viewer_args; const gchar *xkb_layout; const gchar *xkb_variant; g_debug ("show selected layout"); if (!get_selected_iter (builder, &model, &iter)) return; gtk_tree_model_get (model, &iter, TYPE_COLUMN, &type, ID_COLUMN, &id, -1); if (g_str_equal (type, INPUT_SOURCE_TYPE_XKB)) { gnome_xkb_info_get_layout_info (xkb_info, id, NULL, NULL, &xkb_layout, &xkb_variant); if (!xkb_layout || !xkb_layout[0]) { g_warning ("Couldn't find XKB input source '%s'", id); goto exit; } } 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) { xkb_layout = ibus_engine_desc_get_layout (engine_desc); xkb_variant = ""; } else { g_warning ("Couldn't find IBus input source '%s'", id); goto exit; } #else g_warning ("IBus input source type specified but IBus support was not compiled"); goto exit; #endif } else { g_warning ("Unknown input source type '%s'", type); goto exit; } if (xkb_variant[0]) kbd_viewer_args = g_strdup_printf ("gkbd-keyboard-display -l \"%s\t%s\"", xkb_layout, xkb_variant); else kbd_viewer_args = g_strdup_printf ("gkbd-keyboard-display -l %s", xkb_layout); g_spawn_command_line_async (kbd_viewer_args, NULL); g_free (kbd_viewer_args); exit: g_free (type); g_free (id); }
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); }