[maemo-commits] [maemo-commits] r17094 - in projects/haf/trunk/gtk+: . gtk tests

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Jan 12 13:38:20 EET 2009
Author: kris
Date: 2009-01-12 13:38:18 +0200 (Mon, 12 Jan 2009)
New Revision: 17094

Modified:
   projects/haf/trunk/gtk+/ChangeLog
   projects/haf/trunk/gtk+/gtk/gtktreeprivate.h
   projects/haf/trunk/gtk+/gtk/gtktreeview.c
   projects/haf/trunk/gtk+/tests/testhildontreeview.c
Log:
2009-01-12  Kristian Rietveld  <kris at imendio.com>

	Fixes: NB#91657 - HildonPickerDialog closes immediatly when used
	with some dynamic tree model

	* gtk/gtktreeview.c (gtk_tree_view_class_init): add
	"hildon-row-tapped" signal,
	(gtk_tree_view_button_press): set queued_tapped_row to the
	last row pressed,
	(gtk_tree_view_button_release): emit "hildon-row-tapped" if
	the queued_tapped_row row reference still exists,
	(gtk_tree_view_init), (gtk_tree_view_destroy),
	(gtk_tree_view_bin_motion), (gtk_tree_view_set_model),
	(gtk_tree_view_maybe_begin_dragging_row),
	(gtk_tree_view_grab_notify): maintain queued_tapped_row.

	* gtk/gtktreeprivate.h: add queued_tapped_row.

	* tests/testhildontreeview.c (hildon_row_tapped): display
	message as soon as a "hildon-row-tapped" signal is received.



Modified: projects/haf/trunk/gtk+/ChangeLog
===================================================================
--- projects/haf/trunk/gtk+/ChangeLog	2009-01-12 10:53:31 UTC (rev 17093)
+++ projects/haf/trunk/gtk+/ChangeLog	2009-01-12 11:38:18 UTC (rev 17094)
@@ -1,3 +1,24 @@
+2009-01-12  Kristian Rietveld  <kris at imendio.com>
+
+	Fixes: NB#91657 - HildonPickerDialog closes immediatly when used
+	with some dynamic tree model
+
+	* gtk/gtktreeview.c (gtk_tree_view_class_init): add
+	"hildon-row-tapped" signal,
+	(gtk_tree_view_button_press): set queued_tapped_row to the
+	last row pressed,
+	(gtk_tree_view_button_release): emit "hildon-row-tapped" if
+	the queued_tapped_row row reference still exists,
+	(gtk_tree_view_init), (gtk_tree_view_destroy),
+	(gtk_tree_view_bin_motion), (gtk_tree_view_set_model),
+	(gtk_tree_view_maybe_begin_dragging_row),
+	(gtk_tree_view_grab_notify): maintain queued_tapped_row.
+
+	* gtk/gtktreeprivate.h: add queued_tapped_row.
+
+	* tests/testhildontreeview.c (hildon_row_tapped): display
+	message as soon as a "hildon-row-tapped" signal is received.
+
 2009-01-12  Claudio Saavedra  <csaavedra at igalia.com>
 
 	Merged from trunk:

Modified: projects/haf/trunk/gtk+/gtk/gtktreeprivate.h
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtktreeprivate.h	2009-01-12 10:53:31 UTC (rev 17093)
+++ projects/haf/trunk/gtk+/gtk/gtktreeprivate.h	2009-01-12 11:38:18 UTC (rev 17094)
@@ -278,6 +278,7 @@
   GtkTreeRowReference *queued_select_row;
   GtkTreeRowReference *queued_expand_row;
   GtkTreeRowReference *queued_activate_row;
+  GtkTreeRowReference *queued_tapped_row;
 
   GtkRBNode *highlighted_node;
   GtkRBTree *highlighted_tree;

Modified: projects/haf/trunk/gtk+/gtk/gtktreeview.c
===================================================================
--- projects/haf/trunk/gtk+/gtk/gtktreeview.c	2009-01-12 10:53:31 UTC (rev 17093)
+++ projects/haf/trunk/gtk+/gtk/gtktreeview.c	2009-01-12 11:38:18 UTC (rev 17094)
@@ -128,6 +128,7 @@
   START_INTERACTIVE_SEARCH,
 #ifdef MAEMO_CHANGES
   ROW_INSENSITIVE,
+  HILDON_ROW_TAPPED,
 #endif /* MAEMO_CHANGES */
   LAST_SIGNAL
 };
@@ -1218,6 +1219,16 @@
                   _gtk_marshal_VOID__OBJECT,
                   G_TYPE_NONE, 1,
                   GTK_TYPE_TREE_PATH);
+
+  tree_view_signals[HILDON_ROW_TAPPED] =
+      g_signal_new ("hildon_row_tapped",
+                    G_TYPE_FROM_CLASS (o_class),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                    0,
+                    NULL, NULL,
+                    _gtk_marshal_VOID__BOXED,
+                    G_TYPE_NONE, 1,
+                    GTK_TYPE_TREE_PATH);
 #endif /* MAEMO_CHANGES */
 
   /* Key bindings */
@@ -1496,6 +1507,7 @@
   tree_view->priv->queued_select_row = NULL;
   tree_view->priv->queued_expand_row = NULL;
   tree_view->priv->queued_activate_row = NULL;
+  tree_view->priv->queued_tapped_row = NULL;
 
   tree_view->priv->highlighted_node = NULL;
   tree_view->priv->highlighted_tree = NULL;
@@ -1799,6 +1811,12 @@
       gtk_tree_row_reference_free (tree_view->priv->queued_activate_row);
       tree_view->priv->queued_activate_row = NULL;
     }
+
+  if (tree_view->priv->queued_tapped_row != NULL)
+    {
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
+    }
 #endif /* MAEMO_CHANGES */
 
   if (tree_view->priv->column_drop_func_data &&
@@ -3007,6 +3025,14 @@
             gtk_tree_view_column_focus_cell (column, focus_cell);
 
 #ifdef MAEMO_CHANGES
+          /* The most reliable way is to use another row reference,
+           * instead of trying to get it done with the intricate
+           * logic below.
+           */
+          gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+          tree_view->priv->queued_tapped_row =
+              gtk_tree_row_reference_new (tree_view->priv->model, path);
+
           if (mode == HILDON_FREMANTLE
               && tree_view->priv->hildon_ui_mode == HILDON_UI_MODE_NORMAL)
             {
@@ -3528,6 +3554,24 @@
       gtk_tree_row_reference_free (tree_view->priv->queued_expand_row);
       tree_view->priv->queued_expand_row = NULL;
     }
+
+  /* The hildon-row-tapped signal is executed as the last, so that
+   * any action (selection change, activation, expansion/collapse)
+   * has already been processed.
+   */
+  if (gtk_tree_row_reference_valid (tree_view->priv->queued_tapped_row))
+    {
+      GtkTreePath *path;
+
+      path = gtk_tree_row_reference_get_path (tree_view->priv->queued_tapped_row);
+      g_signal_emit (tree_view, tree_view_signals[HILDON_ROW_TAPPED],
+                     0, path);
+
+      gtk_tree_path_free (path);
+
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
+    }
 #endif /* MAEMO_CHANGES */
 
   if (tree_view->priv->button_pressed_node == NULL)
@@ -4621,6 +4665,9 @@
       gtk_tree_row_reference_free (tree_view->priv->queued_expand_row);
       tree_view->priv->queued_expand_row = NULL;
 
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
+
       free_queued_activate_row (tree_view);
 
       if (mode == HILDON_DIABLO
@@ -4664,6 +4711,9 @@
         free_queued_activate_row (tree_view);
       else if (tree_view->priv->hildon_ui_mode == HILDON_UI_MODE_EDIT)
         free_queued_select_row (tree_view);
+
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
     }
 #endif /* MAEMO_CHANGES */
 
@@ -8081,6 +8131,12 @@
       tree_view->priv->queued_expand_row = NULL;
     }
 
+  if (tree_view->priv->queued_tapped_row)
+    {
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
+    }
+
   free_queued_select_row (tree_view);
   free_queued_activate_row (tree_view);
 #endif /* MAEMO_CHANGES */
@@ -12101,6 +12157,8 @@
       tree_view->priv->queued_activate_row = NULL;
       gtk_tree_row_reference_free (tree_view->priv->queued_expand_row);
       tree_view->priv->queued_expand_row = NULL;
+      gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+      tree_view->priv->queued_tapped_row = NULL;
 #endif /* MAEMO_CHANGES */
 
       tree_view->priv->scroll_to_column = NULL;
@@ -16603,6 +16661,12 @@
 	  tree_view->priv->queued_expand_row = NULL;
 	}
 
+      if (tree_view->priv->queued_tapped_row)
+        {
+	  gtk_tree_row_reference_free (tree_view->priv->queued_tapped_row);
+	  tree_view->priv->queued_tapped_row = NULL;
+	}
+
       free_queued_activate_row (tree_view);
 #endif /* MAEMO_CHANGES */
     }

Modified: projects/haf/trunk/gtk+/tests/testhildontreeview.c
===================================================================
--- projects/haf/trunk/gtk+/tests/testhildontreeview.c	2009-01-12 10:53:31 UTC (rev 17093)
+++ projects/haf/trunk/gtk+/tests/testhildontreeview.c	2009-01-12 11:38:18 UTC (rev 17094)
@@ -49,10 +49,22 @@
                         GtkTreeViewColumn *column,
                         gpointer           user_data)
 {
-  g_print ("row-activated emitted.\n");
+  gchar *str = gtk_tree_path_to_string (path);
+  g_print ("row-activated emitted at %s.\n", str);
+  g_free (str);
 }
 
 static void
+hildon_row_tapped (GtkWidget   *tree_view,
+                   GtkTreePath *path,
+                   gpointer     user_data)
+{
+  gchar *str = gtk_tree_path_to_string (path);
+  g_print ("hildon-row-tapped emitted at %s.\n", str);
+  g_free (str);
+}
+
+static void
 row_insensitive_callback (GtkWidget         *tree_view,
                           GtkTreePath       *path,
                           gpointer           user_data)
@@ -164,6 +176,8 @@
                     G_CALLBACK (row_activated_callback), NULL);
   g_signal_connect (tree_view, "row-insensitive",
                     G_CALLBACK (row_insensitive_callback), NULL);
+  g_signal_connect (tree_view, "hildon-row-tapped",
+                    G_CALLBACK (hildon_row_tapped), NULL);
 
   gtk_widget_set_size_request (tree_view, 480, 800);
   gtk_container_add (GTK_CONTAINER (sw), tree_view);


More information about the maemo-commits mailing list