[gnome-initial-setup] language-page: Clean up the language page code



commit 0ae9cf3d2f8526061331dbdd2d40936ed2116840
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Feb 13 16:13:13 2013 -0500

    language-page: Clean up the language page code
    
    Have a common structure to keep track of the data associated
    with a language widget, instead of having a set of get_datas.
    
    At the same time, fix some memory leaks that we couldn't before.

 .../pages/language/gis-language-page.c             |   76 ++++++++++++-------
 1 files changed, 48 insertions(+), 28 deletions(-)
---
diff --git a/gnome-initial-setup/pages/language/gis-language-page.c b/gnome-initial-setup/pages/language/gis-language-page.c
index fbf7ed5..4e7daa7 100644
--- a/gnome-initial-setup/pages/language/gis-language-page.c
+++ b/gnome-initial-setup/pages/language/gis-language-page.c
@@ -67,6 +67,14 @@ struct _GisLanguagePagePrivate
 #define OBJ(type,name) ((type)gtk_builder_get_object(GIS_PAGE (page)->builder,(name)))
 #define WID(name) OBJ(GtkWidget*,name)
 
+typedef struct {
+  GtkWidget *box;
+
+  gchar *locale_id;
+  gchar *locale_name;
+  gboolean is_extra;
+} LanguageWidget;
+
 static void
 set_locale_id (GisLanguagePage *page,
                gchar           *new_locale_id)
@@ -84,22 +92,21 @@ sort_languages (gconstpointer a,
                 gconstpointer b,
                 gpointer      data)
 {
-  if (g_object_get_data (G_OBJECT (a), "locale-id") == NULL)
-    return 1;
+  LanguageWidget *la, *lb;
 
-  if (g_object_get_data (G_OBJECT (b), "locale-id") == NULL)
-    return -1;
+  la = g_object_get_data (G_OBJECT (a), "language-widget");
+  lb = g_object_get_data (G_OBJECT (b), "language-widget");
 
-  const char *la = g_object_get_data (G_OBJECT (a), "locale-name");
-  const char *lb = g_object_get_data (G_OBJECT (b), "locale-name");
+  if (la == NULL)
+    return 1;
 
-  gboolean iea = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (a), "is-extra"));
-  gboolean ieb = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (b), "is-extra"));
+  if (lb == NULL)
+    return -1;
 
-  if (iea != ieb) {
-    return ieb - iea;
+  if (la->is_extra != lb->is_extra) {
+    return la->is_extra - lb->is_extra;
   } else {
-    return strcmp (la, lb);
+    return strcmp (la->locale_name, lb->locale_name);
   }
 }
 
@@ -130,32 +137,47 @@ padded_label_new (char *text)
   return widget;
 }
 
+static void
+language_widget_free (gpointer data)
+{
+  LanguageWidget *widget = data;
+
+  /* This is called when the box is destroyed,
+   * so don't bother destroying the widget and
+   * children again. */
+  g_free (widget->locale_id);
+  g_free (widget->locale_name);
+  g_free (widget);
+}
+
 static GtkWidget *
 language_widget_new (char     *locale_id,
                      gboolean  is_extra)
 {
   gchar *locale_name;
-  GtkWidget *widget;
+  LanguageWidget *widget = g_new0 (LanguageWidget, 1);
   gchar *current_locale_id = cc_common_language_get_current_language ();
 
   locale_name = use_language (locale_id);
   setlocale (LC_MESSAGES, current_locale_id);
 
-  widget = padded_label_new (locale_name);
+  widget->box = padded_label_new (locale_name);
+  widget->locale_id = g_strdup (locale_id);
+  widget->locale_name = locale_name;
+  widget->is_extra = is_extra;
 
   if (g_strcmp0 (locale_id, current_locale_id) == 0)
     {
-      gtk_box_pack_start (GTK_BOX (widget),
+      gtk_box_pack_start (GTK_BOX (widget->box),
                           gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU),
                           FALSE, FALSE, 0);
     }
   g_free (current_locale_id);
 
-  g_object_set_data (G_OBJECT (widget), "locale-id", locale_id);
-  g_object_set_data (G_OBJECT (widget), "locale-name", locale_name);
-  g_object_set_data (G_OBJECT (widget), "is-extra", GUINT_TO_POINTER (is_extra));
+  g_object_set_data_full (G_OBJECT (widget->box), "language-widget", widget,
+                          language_widget_free);
 
-  return widget;
+  return widget->box;
 }
 
 static GtkWidget *
@@ -224,6 +246,8 @@ add_all_languages (GisLanguagePage *page)
   GHashTable *initial =  cc_common_language_get_initial_languages ();
 
   add_languages (page, locale_ids, initial);
+
+  g_strfreev (locale_ids);
 }
 
 static gboolean
@@ -232,9 +256,8 @@ language_visible (GtkWidget *child,
 {
   GisLanguagePage *page = user_data;
   GisLanguagePagePrivate *priv = page->priv;
-  gchar *locale_name;
   const gchar *filter_contents;
-  gboolean is_extra;
+  LanguageWidget *widget;
 
   if (child == priv->more_item)
     return !priv->showing_extra;
@@ -243,14 +266,13 @@ language_visible (GtkWidget *child,
   if (child == priv->no_results)
     return TRUE;
 
-  is_extra = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "is-extra"));
-  locale_name = g_object_get_data (G_OBJECT (child), "locale-name");
+  widget = g_object_get_data (G_OBJECT (child), "language-widget");
 
   filter_contents = gtk_entry_get_text (GTK_ENTRY (priv->filter_entry));
-  if (*filter_contents && strcasestr (locale_name, filter_contents) == NULL)
+  if (*filter_contents && strcasestr (widget->locale_name, filter_contents) == NULL)
     return FALSE;
 
-  if (!priv->showing_extra && !is_extra)
+  if (!priv->showing_extra && !widget->is_extra)
     return FALSE;
 
   return TRUE;
@@ -274,8 +296,6 @@ child_activated (EggListBox      *box,
                  GtkWidget       *child,
                  GisLanguagePage *page)
 {
-  gchar *new_locale_id;
-
   if (page->priv->adding_languages)
     return;
 
@@ -287,8 +307,8 @@ child_activated (EggListBox      *box,
     show_more (page);
   else
     {
-      new_locale_id = g_object_get_data (G_OBJECT (child), "locale-id");
-      set_locale_id (page, new_locale_id);
+      LanguageWidget *widget = g_object_get_data (G_OBJECT (child), "language-widget");
+      set_locale_id (page, widget->locale_id);
     }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]