[gnome-desktop] gnome-xkb-info: Honor the 'show-all-sources' gsettings key



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]