static gboolean filter_xkb_config (void) { XklConfigItem *item; gchar *lname; gchar *vname; gchar **lv; gboolean any_change = FALSE; xkl_debug (100, "Filtering configuration against the registry\n"); if (!ensure_xkl_registry ()) return FALSE; lv = current_kbd_config.layouts_variants; item = xkl_config_item_new (); while (*lv) { xkl_debug (100, "Checking [%s]\n", *lv); if (gkbd_keyboard_config_split_items (*lv, &lname, &vname)) { gboolean should_be_dropped = FALSE; g_snprintf (item->name, sizeof (item->name), "%s", lname); if (!xkl_config_registry_find_layout (xkl_registry, item)) { xkl_debug (100, "Bad layout [%s]\n", lname); should_be_dropped = TRUE; } else if (vname) { g_snprintf (item->name, sizeof (item->name), "%s", vname); if (!xkl_config_registry_find_variant (xkl_registry, lname, item)) { xkl_debug (100, "Bad variant [%s(%s)]\n", lname, vname); should_be_dropped = TRUE; } } if (should_be_dropped) { gkbd_strv_behead (lv); any_change = TRUE; continue; } } lv++; } g_object_unref (item); return any_change; }
gchar * gkbd_indicator_config_get_images_file (GkbdIndicatorConfig * ind_config, GkbdKeyboardConfig * kbd_config, int group) { char *image_file = NULL; GtkIconInfo *icon_info = NULL; if (!ind_config->show_flags) return NULL; if ((kbd_config->layouts_variants != NULL) && (g_strv_length (kbd_config->layouts_variants) > group)) { char *full_layout_name = kbd_config->layouts_variants[group]; if (full_layout_name != NULL) { char *l, *v; gkbd_keyboard_config_split_items (full_layout_name, &l, &v); if (l != NULL) { /* probably there is something in theme? */ icon_info = gtk_icon_theme_lookup_icon (ind_config->icon_theme, l, 48, 0); /* Unbelievable but happens */ if (icon_info != NULL && gtk_icon_info_get_filename (icon_info) == NULL) { gtk_icon_info_free (icon_info); icon_info = NULL; } } } } /* fallback to the default value */ if (icon_info == NULL) { icon_info = gtk_icon_theme_lookup_icon (ind_config->icon_theme, "stock_dialog-error", 48, 0); } if (icon_info != NULL) { image_file = g_strdup (gtk_icon_info_get_filename (icon_info)); gtk_icon_info_free (icon_info); } return image_file; }
void xkb_layout_preview_set_drawing_layout (GtkWidget * kbdraw, const gchar * id) { #ifdef HAVE_X11_EXTENSIONS_XKB_H if (kbdraw != NULL && id != NULL) { XklConfigRec *data; char **p, *layout, *variant; XkbComponentNamesRec component_names; data = xkl_config_rec_new (); if (xkl_config_rec_get_from_server (data, engine)) { if ((p = data->layouts) != NULL) g_strfreev (data->layouts); if ((p = data->variants) != NULL) g_strfreev (data->variants); data->layouts = g_new0 (char *, 2); data->variants = g_new0 (char *, 2); if (gkbd_keyboard_config_split_items (id, &layout, &variant) && variant != NULL) { data->layouts[0] = (layout == NULL) ? NULL : g_strdup (layout); data->variants[0] = (variant == NULL) ? NULL : g_strdup (variant); } else { data->layouts[0] = (id == NULL) ? NULL : g_strdup (id); data->variants[0] = NULL; } if (xkl_xkb_config_native_prepare (engine, data, &component_names)) { gkbd_keyboard_drawing_set_keyboard (GKBD_KEYBOARD_DRAWING (kbdraw), &component_names); xkl_xkb_config_native_cleanup (engine, &component_names); } } g_object_unref (G_OBJECT (data)); }
static gboolean filter_xkb_config (void) { XklConfigItem *item; gchar *lname; gchar *vname; GSList *lv; GSList *filtered; gboolean any_change = FALSE; xkl_debug (100, "Filtering configuration against the registry\n"); if (!xkl_registry) { xkl_registry = xkl_config_registry_get_instance (xkl_engine); /* load all materials, unconditionally! */ if (!xkl_config_registry_load (xkl_registry, TRUE)) { g_object_unref (xkl_registry); xkl_registry = NULL; return FALSE; } } lv = current_kbd_config.layouts_variants; item = xkl_config_item_new (); while (lv) { xkl_debug (100, "Checking [%s]\n", lv->data); if (gkbd_keyboard_config_split_items (lv->data, &lname, &vname)) { g_snprintf (item->name, sizeof (item->name), "%s", lname); if (!xkl_config_registry_find_layout (xkl_registry, item)) { xkl_debug (100, "Bad layout [%s]\n", lname); filtered = lv; lv = lv->next; g_free (filtered->data); current_kbd_config.layouts_variants = g_slist_delete_link (current_kbd_config.layouts_variants, filtered); any_change = TRUE; continue; } if (vname) { g_snprintf (item->name, sizeof (item->name), "%s", vname); if (!xkl_config_registry_find_variant (xkl_registry, lname, item)) { xkl_debug (100, "Bad variant [%s(%s)]\n", lname, vname); filtered = lv; lv = lv->next; g_free (filtered->data); current_kbd_config.layouts_variants = g_slist_delete_link (current_kbd_config. layouts_variants, filtered); any_change = TRUE; continue; } } } lv = lv->next; } g_object_unref (item); return any_change; }