|
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 |
|