Rui Matos a7ec84a
From 959146efdd88f20270384ee1186189310de13b1d Mon Sep 17 00:00:00 2001
Rui Matos a7ec84a
From: Rui Matos <tiagomatos@gmail.com>
Rui Matos a7ec84a
Date: Mon, 18 Nov 2013 15:42:02 +0100
Rui Matos a7ec84a
Subject: [PATCH 2/2] gnome-xkb-info: Apply main layout locale metadata to
Rui Matos a7ec84a
 variants
Rui Matos a7ec84a
Rui Matos a7ec84a
If a variant doesn't specify language/country metadata then we should
Rui Matos a7ec84a
file it under its main layout's language/country.
Rui Matos a7ec84a
Rui Matos a7ec84a
https://bugzilla.gnome.org/show_bug.cgi?id=711291
Rui Matos a7ec84a
---
Rui Matos a7ec84a
 libgnome-desktop/gnome-xkb-info.c | 100 ++++++++++++++++++++++++++++----------
Rui Matos a7ec84a
 1 file changed, 74 insertions(+), 26 deletions(-)
Rui Matos a7ec84a
Rui Matos a7ec84a
diff --git a/libgnome-desktop/gnome-xkb-info.c b/libgnome-desktop/gnome-xkb-info.c
Rui Matos a7ec84a
index 0cd089f..480836d 100644
Rui Matos a7ec84a
--- a/libgnome-desktop/gnome-xkb-info.c
Rui Matos a7ec84a
+++ b/libgnome-desktop/gnome-xkb-info.c
Rui Matos a7ec84a
@@ -56,6 +56,8 @@ struct _Layout
Rui Matos a7ec84a
   gchar *description;
Rui Matos a7ec84a
   gboolean is_variant;
Rui Matos a7ec84a
   const Layout *main_layout;
Rui Matos a7ec84a
+  GSList *iso639Ids;
Rui Matos a7ec84a
+  GSList *iso3166Ids;
Rui Matos a7ec84a
 };
Rui Matos a7ec84a
 
Rui Matos a7ec84a
 typedef struct _XkbOption XkbOption;
Rui Matos a7ec84a
@@ -104,6 +106,8 @@ free_layout (gpointer data)
Rui Matos a7ec84a
   g_free (layout->xkb_name);
Rui Matos a7ec84a
   g_free (layout->short_desc);
Rui Matos a7ec84a
   g_free (layout->description);
Rui Matos a7ec84a
+  g_slist_free_full (layout->iso639Ids, g_free);
Rui Matos a7ec84a
+  g_slist_free_full (layout->iso3166Ids, g_free);
Rui Matos a7ec84a
   g_slice_free (Layout, layout);
Rui Matos a7ec84a
 }
Rui Matos a7ec84a
 
Rui Matos a7ec84a
@@ -385,6 +389,60 @@ add_layout_to_table (GHashTable  *table,
Rui Matos a7ec84a
 }
Rui Matos a7ec84a
 
Rui Matos a7ec84a
 static void
Rui Matos a7ec84a
+add_layout_to_locale_tables (Layout     *layout,
Rui Matos a7ec84a
+                             GHashTable *layouts_by_language,
Rui Matos a7ec84a
+                             GHashTable *layouts_by_country)
Rui Matos a7ec84a
+{
Rui Matos a7ec84a
+  GSList *l, *lang_codes, *country_codes;
Rui Matos a7ec84a
+  gchar *language, *country;
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+  lang_codes = layout->iso639Ids;
Rui Matos a7ec84a
+  country_codes = layout->iso3166Ids;
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+  if (layout->is_variant)
Rui Matos a7ec84a
+    {
Rui Matos a7ec84a
+      if (!lang_codes)
Rui Matos a7ec84a
+        lang_codes = layout->main_layout->iso639Ids;
Rui Matos a7ec84a
+      if (!country_codes)
Rui Matos a7ec84a
+        country_codes = layout->main_layout->iso3166Ids;
Rui Matos a7ec84a
+    }
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+  for (l = lang_codes; l; l = l->next)
Rui Matos a7ec84a
+    {
Rui Matos a7ec84a
+      language = gnome_get_language_from_code ((gchar *) l->data, NULL);
Rui Matos a7ec84a
+      if (language)
Rui Matos a7ec84a
+        {
Rui Matos a7ec84a
+          add_layout_to_table (layouts_by_language, language, layout);
Rui Matos a7ec84a
+          g_free (language);
Rui Matos a7ec84a
+        }
Rui Matos a7ec84a
+    }
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+  for (l = country_codes; l; l = l->next)
Rui Matos a7ec84a
+    {
Rui Matos a7ec84a
+      country = gnome_get_country_from_code ((gchar *) l->data, NULL);
Rui Matos a7ec84a
+      if (country)
Rui Matos a7ec84a
+        {
Rui Matos a7ec84a
+          add_layout_to_table (layouts_by_country, country, layout);
Rui Matos a7ec84a
+          g_free (country);
Rui Matos a7ec84a
+        }
Rui Matos a7ec84a
+    }
Rui Matos a7ec84a
+}
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+static void
Rui Matos a7ec84a
+add_iso639 (Layout *layout,
Rui Matos a7ec84a
+            gchar  *id)
Rui Matos a7ec84a
+{
Rui Matos a7ec84a
+  layout->iso639Ids = g_slist_prepend (layout->iso639Ids, id);
Rui Matos a7ec84a
+}
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+static void
Rui Matos a7ec84a
+add_iso3166 (Layout *layout,
Rui Matos a7ec84a
+             gchar  *id)
Rui Matos a7ec84a
+{
Rui Matos a7ec84a
+  layout->iso3166Ids = g_slist_prepend (layout->iso3166Ids, id);
Rui Matos a7ec84a
+}
Rui Matos a7ec84a
+
Rui Matos a7ec84a
+static void
Rui Matos a7ec84a
 parse_end_element (GMarkupParseContext  *context,
Rui Matos a7ec84a
                    const gchar          *element_name,
Rui Matos a7ec84a
                    gpointer              data,
Rui Matos a7ec84a
@@ -412,6 +470,9 @@ parse_end_element (GMarkupParseContext  *context,
Rui Matos a7ec84a
       g_hash_table_replace (priv->layouts_table,
Rui Matos a7ec84a
                             priv->current_parser_layout->id,
Rui Matos a7ec84a
                             priv->current_parser_layout);
Rui Matos a7ec84a
+      add_layout_to_locale_tables (priv->current_parser_layout,
Rui Matos a7ec84a
+                                   priv->layouts_by_language,
Rui Matos a7ec84a
+                                   priv->layouts_by_country);
Rui Matos a7ec84a
       priv->current_parser_layout = NULL;
Rui Matos a7ec84a
     }
Rui Matos a7ec84a
   else if (strcmp (element_name, "variant") == 0)
Rui Matos a7ec84a
@@ -431,12 +492,13 @@ parse_end_element (GMarkupParseContext  *context,
Rui Matos a7ec84a
       g_hash_table_replace (priv->layouts_table,
Rui Matos a7ec84a
                             priv->current_parser_variant->id,
Rui Matos a7ec84a
                             priv->current_parser_variant);
Rui Matos a7ec84a
+      add_layout_to_locale_tables (priv->current_parser_variant,
Rui Matos a7ec84a
+                                   priv->layouts_by_language,
Rui Matos a7ec84a
+                                   priv->layouts_by_country);
Rui Matos a7ec84a
       priv->current_parser_variant = NULL;
Rui Matos a7ec84a
     }
Rui Matos a7ec84a
   else if (strcmp (element_name, "iso639Id") == 0)
Rui Matos a7ec84a
     {
Rui Matos a7ec84a
-      gchar *language;
Rui Matos a7ec84a
-
Rui Matos a7ec84a
       if (!priv->current_parser_iso639Id)
Rui Matos a7ec84a
         {
Rui Matos a7ec84a
           g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
Rui Matos a7ec84a
@@ -444,23 +506,15 @@ parse_end_element (GMarkupParseContext  *context,
Rui Matos a7ec84a
           return;
Rui Matos a7ec84a
         }
Rui Matos a7ec84a
 
Rui Matos a7ec84a
-      language = gnome_get_language_from_code (priv->current_parser_iso639Id, NULL);
Rui Matos a7ec84a
-      if (language)
Rui Matos a7ec84a
-        {
Rui Matos a7ec84a
-          if (priv->current_parser_variant)
Rui Matos a7ec84a
-            add_layout_to_table (priv->layouts_by_language, language, priv->current_parser_variant);
Rui Matos a7ec84a
-          else if (priv->current_parser_layout)
Rui Matos a7ec84a
-            add_layout_to_table (priv->layouts_by_language, language, priv->current_parser_layout);
Rui Matos a7ec84a
-
Rui Matos a7ec84a
-          g_free (language);
Rui Matos a7ec84a
-        }
Rui Matos a7ec84a
+      if (priv->current_parser_variant)
Rui Matos a7ec84a
+        add_iso639 (priv->current_parser_variant, priv->current_parser_iso639Id);
Rui Matos a7ec84a
+      else if (priv->current_parser_layout)
Rui Matos a7ec84a
+        add_iso639 (priv->current_parser_layout, priv->current_parser_iso639Id);
Rui Matos a7ec84a
 
Rui Matos a7ec84a
-      g_clear_pointer (&priv->current_parser_iso639Id, g_free);
Rui Matos a7ec84a
+      priv->current_parser_iso639Id = NULL;
Rui Matos a7ec84a
     }
Rui Matos a7ec84a
   else if (strcmp (element_name, "iso3166Id") == 0)
Rui Matos a7ec84a
     {
Rui Matos a7ec84a
-      gchar *country;
Rui Matos a7ec84a
-
Rui Matos a7ec84a
       if (!priv->current_parser_iso3166Id)
Rui Matos a7ec84a
         {
Rui Matos a7ec84a
           g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
Rui Matos a7ec84a
@@ -468,18 +522,12 @@ parse_end_element (GMarkupParseContext  *context,
Rui Matos a7ec84a
           return;
Rui Matos a7ec84a
         }
Rui Matos a7ec84a
 
Rui Matos a7ec84a
-      country = gnome_get_country_from_code (priv->current_parser_iso3166Id, NULL);
Rui Matos a7ec84a
-      if (country)
Rui Matos a7ec84a
-        {
Rui Matos a7ec84a
-          if (priv->current_parser_variant)
Rui Matos a7ec84a
-            add_layout_to_table (priv->layouts_by_country, country, priv->current_parser_variant);
Rui Matos a7ec84a
-          else if (priv->current_parser_layout)
Rui Matos a7ec84a
-            add_layout_to_table (priv->layouts_by_country, country, priv->current_parser_layout);
Rui Matos a7ec84a
-
Rui Matos a7ec84a
-          g_free (country);
Rui Matos a7ec84a
-        }
Rui Matos a7ec84a
+      if (priv->current_parser_variant)
Rui Matos a7ec84a
+        add_iso3166 (priv->current_parser_variant, priv->current_parser_iso3166Id);
Rui Matos a7ec84a
+      else if (priv->current_parser_layout)
Rui Matos a7ec84a
+        add_iso3166 (priv->current_parser_layout, priv->current_parser_iso3166Id);
Rui Matos a7ec84a
 
Rui Matos a7ec84a
-      g_clear_pointer (&priv->current_parser_iso3166Id, g_free);
Rui Matos a7ec84a
+      priv->current_parser_iso3166Id = NULL;
Rui Matos a7ec84a
     }
Rui Matos a7ec84a
   else if (strcmp (element_name, "group") == 0)
Rui Matos a7ec84a
     {
Rui Matos a7ec84a
-- 
Rui Matos a7ec84a
1.9.0
Rui Matos a7ec84a