[maemo-commits] [maemo-commits] r14079 - in projects/haf/trunk/hildon-desktop: . src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Sep 25 16:17:00 EEST 2007
Author: jobi
Date: 2007-09-25 16:16:59 +0300 (Tue, 25 Sep 2007)
New Revision: 14079

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/src/hd-app-menu-tree.c
Log:

2007-09-25 Johan Bilien  <johan.bilien at nokia.com>

	* src/hd-app-menu-tree.c (hd_app_menu_tree_navigation_row_deleted):
	- set the cursor in an idle loop rather than directly, to prevent
	accessing the deleted row's data. Fixes: NB#68961



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-09-25 13:16:27 UTC (rev 14078)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-09-25 13:16:59 UTC (rev 14079)
@@ -1,3 +1,9 @@
+2007-09-25 Johan Bilien  <johan.bilien at nokia.com>
+
+	* src/hd-app-menu-tree.c (hd_app_menu_tree_navigation_row_deleted):
+	- set the cursor in an idle loop rather than directly, to prevent
+	accessing the deleted row's data. Fixes: NB#68961
+
 2007-09-25  Lucas Rocha  <lucas.rocha at nokia.com>
 
 	* src/hd-switcher-menu.c (hd_switcher_menu_clear_item_activated):

Modified: projects/haf/trunk/hildon-desktop/src/hd-app-menu-tree.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-app-menu-tree.c	2007-09-25 13:16:27 UTC (rev 14078)
+++ projects/haf/trunk/hildon-desktop/src/hd-app-menu-tree.c	2007-09-25 13:16:59 UTC (rev 14079)
@@ -50,6 +50,9 @@
                               GObjectConstructParam  *construct_params);
 
 static void
+hd_app_menu_tree_finalize (GObject *object);
+
+static void
 hd_app_menu_tree_set_property (GObject         *object,
                                guint            property_id,
                                const GValue    *value,
@@ -112,6 +115,9 @@
 
   GtkTreeSelection     *navigation_selection;
   GtkTreeSelection     *content_selection;
+
+  GtkTreePath          *cursor_path;
+  guint                 set_cursor_idle;
 };
 
 G_DEFINE_TYPE (HDAppMenuTree, hd_app_menu_tree, GTK_TYPE_HPANED);
@@ -136,6 +142,7 @@
   object_class->constructor = hd_app_menu_tree_constructor;
   object_class->set_property = hd_app_menu_tree_set_property;
   object_class->get_property = hd_app_menu_tree_get_property;
+  object_class->finalize     = hd_app_menu_tree_finalize;
 
   pspec = g_param_spec_object ("model",
                                "model",
@@ -328,6 +335,24 @@
 }
 
 static void
+hd_app_menu_tree_finalize (GObject *object)
+{
+  HDAppMenuTreePrivate *priv = HD_APP_MENU_TREE (object)->priv;
+
+  if (priv->set_cursor_idle)
+  {
+    g_source_remove (priv->set_cursor_idle);
+    priv->set_cursor_idle = 0;
+  }
+
+  if (priv->cursor_path)
+  {
+    gtk_tree_path_free (priv->cursor_path);
+    priv->cursor_path = NULL;
+  }
+}
+
+static void
 hd_app_menu_tree_set_property (GObject         *object,
                                guint            property_id,
                                const GValue    *value,
@@ -854,19 +879,44 @@
   return valid_location;
 }
 
-static void
-hd_app_menu_tree_navigation_row_deleted (HDAppMenuTree *tree,
-                                         GtkTreePath   *path)
+static gboolean
+hd_app_menu_tree_navigation_set_cursor (HDAppMenuTree *tree)
 {
+
   HDAppMenuTreePrivate *priv = tree->priv;
 
-  gtk_tree_path_prev (path);
   gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->navigation_pane),
-                            path,
+                            priv->cursor_path,
                             NULL,
                             FALSE);
+
+  gtk_tree_path_free (priv->cursor_path);
+  priv->cursor_path = NULL;
+  priv->set_cursor_idle = 0;
+
+  return FALSE;
 }
 
+static void
+hd_app_menu_tree_navigation_row_deleted (HDAppMenuTree *tree,
+                                         GtkTreePath   *path)
+{
+  HDAppMenuTreePrivate *priv = tree->priv;
+
+  if (priv->cursor_path)
+    gtk_tree_path_free (priv->cursor_path);
+
+  if (priv->set_cursor_idle)
+    g_source_remove (priv->set_cursor_idle);
+
+  tree->priv->cursor_path = gtk_tree_path_copy (path);
+  gtk_tree_path_prev (tree->priv->cursor_path);
+
+  priv->set_cursor_idle =
+      g_idle_add ((GSourceFunc)hd_app_menu_tree_navigation_set_cursor,
+                  tree);
+}
+
 void
 hd_app_menu_tree_set_model (HDAppMenuTree *tree, GtkTreeModel *model)
 {


More information about the maemo-commits mailing list