[gnome-desktop] gnome-xkb-info: Honor the 'show-all-sources' gsettings key
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-desktop] gnome-xkb-info: Honor the 'show-all-sources' gsettings key
- Date: Tue, 4 Sep 2012 11:59:01 +0000 (UTC)
commit ca86bf5c92098c3daa53dd5970a3e9150c3c9678
Author: Rui Matos <tiagomatos gmail com>
Date: Mon Sep 3 01:44:07 2012 +0200
gnome-xkb-info: Honor the 'show-all-sources' gsettings key
When this key is set to true we also load XKB layouts and options from
xkeyboard-config's .extras.xml file.
https://bugzilla.gnome.org/show_bug.cgi?id=682240
libgnome-desktop/gnome-xkb-info.c | 83 ++++++++++++++++++++++++------------
1 files changed, 55 insertions(+), 28 deletions(-)
---
diff --git a/libgnome-desktop/gnome-xkb-info.c b/libgnome-desktop/gnome-xkb-info.c
index 48b0bcb..7a58155 100644
--- a/libgnome-desktop/gnome-xkb-info.c
+++ b/libgnome-desktop/gnome-xkb-info.c
@@ -203,7 +203,7 @@ gnome_xkb_info_free_var_defs (XkbRF_VarDefsRec *var_defs)
}
static gchar *
-get_xml_rules_file_path (void)
+get_xml_rules_file_path (const gchar *suffix)
{
XkbRF_VarDefsRec *xkb_var_defs;
gchar *rules_file;
@@ -212,7 +212,7 @@ get_xml_rules_file_path (void)
gnome_xkb_info_get_var_defs (&rules_file, &xkb_var_defs);
gnome_xkb_info_free_var_defs (xkb_var_defs);
- xml_rules_file = g_strdup_printf ("%s.xml", rules_file);
+ xml_rules_file = g_strdup_printf ("%s%s", rules_file, suffix);
g_free (rules_file);
return xml_rules_file;
@@ -500,24 +500,39 @@ static const GMarkupParser markup_parser = {
};
static void
-parse_rules_file (GnomeXkbInfo *self)
+parse_rules_file (GnomeXkbInfo *self,
+ const gchar *path,
+ GError **error)
{
- GnomeXkbInfoPrivate *priv = self->priv;
gchar *buffer;
gsize length;
GMarkupParseContext *context;
- GError *error = NULL;
- gchar *file_path = get_xml_rules_file_path ();
+ GError *sub_error = NULL;
- g_file_get_contents (file_path, &buffer, &length, &error);
- g_free (file_path);
- if (error)
+ g_file_get_contents (path, &buffer, &length, &sub_error);
+ if (sub_error)
{
- g_warning ("Failed to read XKB rules file: %s", error->message);
- g_error_free (error);
+ g_propagate_error (error, sub_error);
return;
}
+ context = g_markup_parse_context_new (&markup_parser, 0, self, NULL);
+ g_markup_parse_context_parse (context, buffer, length, &sub_error);
+ g_markup_parse_context_free (context);
+ g_free (buffer);
+ if (sub_error)
+ g_propagate_error (error, sub_error);
+}
+
+static void
+parse_rules (GnomeXkbInfo *self)
+{
+ GnomeXkbInfoPrivate *priv = self->priv;
+ GSettings *settings;
+ gboolean show_all_sources;
+ gchar *file_path;
+ GError *error = NULL;
+
/* Maps option group ids to XkbOptionGroup structs. Owns the
XkbOptionGroup structs. */
priv->option_groups_table = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -527,23 +542,35 @@ parse_rules_file (GnomeXkbInfo *self)
/* Maps layout ids to Layout structs. Owns the Layout structs. */
priv->layouts_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, free_layout);
- context = g_markup_parse_context_new (&markup_parser, 0, self, NULL);
- g_markup_parse_context_parse (context, buffer, length, &error);
- g_markup_parse_context_free (context);
- g_free (buffer);
+ file_path = get_xml_rules_file_path (".xml");
+ parse_rules_file (self, file_path, &error);
if (error)
- {
- g_warning ("Failed to parse XKB rules file: %s", error->message);
- g_error_free (error);
- g_hash_table_destroy (priv->option_groups_table);
- priv->option_groups_table = NULL;
- g_hash_table_destroy (priv->layouts_by_short_desc);
- priv->layouts_by_short_desc = NULL;
- g_hash_table_destroy (priv->layouts_by_iso639);
- priv->layouts_by_iso639 = NULL;
- g_hash_table_destroy (priv->layouts_table);
- priv->layouts_table = NULL;
- }
+ goto cleanup;
+ g_free (file_path);
+
+ settings = g_settings_new ("org.gnome.desktop.input-sources");
+ show_all_sources = g_settings_get_boolean (settings, "show-all-sources");
+ g_object_unref (settings);
+
+ if (!show_all_sources)
+ return;
+
+ file_path = get_xml_rules_file_path (".extras.xml");
+ parse_rules_file (self, file_path, &error);
+ if (error)
+ goto cleanup;
+ g_free (file_path);
+
+ return;
+
+ cleanup:
+ g_warning ("Failed to load XKB rules file %s: %s", file_path, error->message);
+ g_clear_pointer (&error, g_error_free);
+ g_clear_pointer (&file_path, g_free);
+ g_clear_pointer (&priv->option_groups_table, g_hash_table_destroy);
+ g_clear_pointer (&priv->layouts_by_short_desc, g_hash_table_destroy);
+ g_clear_pointer (&priv->layouts_by_iso639, g_hash_table_destroy);
+ g_clear_pointer (&priv->layouts_table, g_hash_table_destroy);
}
static gboolean
@@ -552,7 +579,7 @@ ensure_rules_are_parsed (GnomeXkbInfo *self)
GnomeXkbInfoPrivate *priv = self->priv;
if (!priv->layouts_table)
- parse_rules_file (self);
+ parse_rules (self);
return !!priv->layouts_table;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]