[maemo-commits] [maemo-commits] r9891 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Feb 15 11:55:16 EET 2007
Author: mitch
Date: 2007-02-15 11:55:13 +0200 (Thu, 15 Feb 2007)
New Revision: 9891

Modified:
   projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h
Log:
2007-02-15  Michael Natterer  <mitch at imendio.com>

	Port over the remaining logic changes from maemo-gtk-2-6. The
	menus should behave as specified now.

	* gtk/gtkmenushell.c: add private memmbers "activated_submenu" and
	"first_click".

	(gtk_menu_shell_button_press)
	(gtk_menu_shell_button_release)
	(gtk_menu_shell_button_enter_notify)
	(gtk_menu_shell_button_leave_notify): activate submenus on button
	events.

	(gtk_menu_shell_real_select_item): don't activate submenus on item
	selection.

	(gtk_menu_shell_activate_item)
	(gtk_menu_shell_select_submenu_first)
	(gtk_menu_shell_activate_current): changed submenu activation
	and deactivation behavior.

	(gtk_real_menu_shell_move_current): deactivate submenu when
	keyboard-navigating to parent.

	(_gtk_menu_shell_set_first_click): new private api.

	* gtk/gtkmenushell.h: add _gtk_menu_shell_set_first_click().

	* gtk/gtkmenu.c (gtk_menu_popup): call
	_gtk_menu_shell_set_first_click().



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-15 09:36:11 UTC (rev 9890)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-15 09:55:13 UTC (rev 9891)
@@ -1,3 +1,35 @@
+2007-02-15  Michael Natterer  <mitch at imendio.com>
+
+	Port over the remaining logic changes from maemo-gtk-2-6. The
+	menus should behave as specified now.
+
+	* gtk/gtkmenushell.c: add private memmbers "activated_submenu" and
+	"first_click".
+
+	(gtk_menu_shell_button_press)
+	(gtk_menu_shell_button_release)
+	(gtk_menu_shell_button_enter_notify)
+	(gtk_menu_shell_button_leave_notify): activate submenus on button
+	events.
+
+	(gtk_menu_shell_real_select_item): don't activate submenus on item
+	selection.
+
+	(gtk_menu_shell_activate_item)
+	(gtk_menu_shell_select_submenu_first)
+	(gtk_menu_shell_activate_current): changed submenu activation
+	and deactivation behavior.
+
+	(gtk_real_menu_shell_move_current): deactivate submenu when
+	keyboard-navigating to parent.
+
+	(_gtk_menu_shell_set_first_click): new private api.
+
+	* gtk/gtkmenushell.h: add _gtk_menu_shell_set_first_click().
+
+	* gtk/gtkmenu.c (gtk_menu_popup): call
+	_gtk_menu_shell_set_first_click().
+
 2007-02-14  Kristian Rietveld  <kris at imendio.com>
 
 	* gtk/gtktreeview.c (gtk_tree_view_grab_notify): stop possibly

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c	2007-02-15 09:36:11 UTC (rev 9890)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c	2007-02-15 09:55:13 UTC (rev 9891)
@@ -1540,9 +1540,9 @@
                              &priv->popup_pointer_x,
                              &priv->popup_pointer_y,
                              NULL);
-#endif /* MAEMO_CHANGES */
 
-#ifdef MAEMO_CHANGES
+  _gtk_menu_shell_set_first_click (menu_shell);
+
   /* if no item is selected, select the first one */
   if (!menu_shell->active_menu_item)
     gtk_menu_shell_select_first (menu_shell, TRUE);

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c	2007-02-15 09:36:11 UTC (rev 9890)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c	2007-02-15 09:55:13 UTC (rev 9891)
@@ -32,6 +32,9 @@
 #include "gtkkeyhash.h"
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
+#ifdef MAEMO_CHANGES
+#include "gtkmenu.h"
+#endif /* MAEMO_CHANGES */
 #include "gtkmenubar.h"
 #include "gtkmenuitem.h"
 #include "gtkmenushell.h"
@@ -140,6 +143,10 @@
   GtkKeyHash *key_hash;
 
   gboolean take_focus;
+#ifdef MAEMO_CHANGES
+  gboolean activated_submenu;
+  gboolean first_click;
+#endif /* MAEMO_CHANGES */
 };
 
 static void gtk_menu_shell_set_property      (GObject           *object,
@@ -388,6 +395,10 @@
   priv->mnemonic_hash = NULL;
   priv->key_hash = NULL;
   priv->take_focus = TRUE;
+#ifdef MAEMO_CHANGES
+  priv->activated_submenu = FALSE;
+  priv->first_click = FALSE;
+#endif /* MAEMO_CHANGES */
 }
 
 static void
@@ -540,6 +551,9 @@
 gtk_menu_shell_button_press (GtkWidget      *widget,
 			     GdkEventButton *event)
 {
+#ifdef MAEMO_CHANGES
+  GtkMenuShellPrivate *priv;
+#endif /* MAEMO_CHANGES */
   GtkMenuShell *menu_shell;
   GtkWidget *menu_item;
 
@@ -551,17 +565,28 @@
 
   menu_shell = GTK_MENU_SHELL (widget);
 
+#ifdef MAEMO_CHANGES
+  priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
+  menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event);
+#endif /* MAEMO_CHANGES */
+
+#ifdef MAEMO_CHANGES
+  if (!menu_shell->active)
+#else
   if (menu_shell->parent_menu_shell)
     {
       return gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event);
     }
   else if (!menu_shell->active || !menu_shell->button)
+#endif /* MAEMO_CHANGES */
     {
       _gtk_menu_shell_activate (menu_shell);
       
       menu_shell->button = event->button;
 
+#ifndef MAEMO_CHANGES
       menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event);
+#endif /* MAEMO_CHANGES */
 
       if (menu_item && _gtk_menu_item_is_selectable (menu_item))
 	{
@@ -579,6 +604,29 @@
     }
   else
     {
+#ifdef MAEMO_CHANGES
+      priv->first_click = FALSE;
+
+      /* Activate submenu on button press, so that we can drag-move into it if
+       * necessary.
+       */
+      if (menu_item && _gtk_menu_item_is_selectable (menu_item) &&
+          GTK_MENU_ITEM (menu_item)->submenu != NULL &&
+          !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu))
+        {
+          /* Hildon-crack: The item could be unselected when the tap
+           * occurs, make sure it gets selected. The real fix is bug#11670,
+           * remove this crack when it is done.
+           * NB#9417
+           */
+          gtk_menu_shell_select_item (menu_shell, menu_item);
+
+          gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE);
+
+          priv->activated_submenu = TRUE;
+        }
+#endif /* MAEMO_CHANGES */
+
       widget = gtk_get_event_widget ((GdkEvent*) event);
       if (widget == GTK_WIDGET (menu_shell))
 	{
@@ -614,6 +662,9 @@
 gtk_menu_shell_button_release (GtkWidget      *widget,
 			       GdkEventButton *event)
 {
+#ifdef MAEMO_CHANGES
+  GtkMenuShellPrivate *priv;
+#endif /* MAEMO_CHANGES */
   GtkMenuShell *menu_shell;
   GtkWidget *menu_item;
   gint deactivate;
@@ -622,6 +673,80 @@
   g_return_val_if_fail (event != NULL, FALSE);
 
   menu_shell = GTK_MENU_SHELL (widget);
+
+#ifdef MAEMO_CHANGES
+
+  priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
+
+  menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent*) event);
+
+  if (menu_item && _gtk_menu_item_is_selectable (menu_item))
+    {
+      if (GTK_MENU_ITEM (menu_item)->submenu == NULL)
+        {
+          GtkSettings *settings = gtk_widget_get_settings (widget);
+          int timeout;
+
+          g_object_get (settings, "gtk-timeout-initial", &timeout, NULL);
+
+          /* Prevent immediate activation on first click, this is mainly
+           * for combo popups and the like. */
+          if (!priv->first_click ||
+              (menu_shell->activate_time == 0) ||
+              ((event->time - menu_shell->activate_time) > timeout))
+            gtk_menu_shell_activate_item (menu_shell, menu_item, TRUE);
+
+          /* activate_item will take care of deactivation if needed */
+          deactivate = FALSE;
+        }
+      else
+        {
+          /* If we ended up on an item with a submenu, leave the menu up. */
+          deactivate = FALSE;
+
+          /* popdown the submenu if we didn't pop it up in this click */
+          if (!priv->activated_submenu &&
+              GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement != GTK_TOP_BOTTOM)
+            _gtk_menu_item_popdown_submenu (menu_item);
+        }
+    }
+  else if (menu_item &&
+           !_gtk_menu_item_is_selectable (menu_item) &&
+           GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement != GTK_TOP_BOTTOM)
+    {
+      deactivate = FALSE;
+    }
+  else if (menu_shell->parent_menu_shell)
+    {
+      /* Forward to parent (deactivate, mostly) if we have one */
+      gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event);
+
+      deactivate = FALSE;
+    }
+  else
+    {
+      /* Not over a menuitem of any kind, no parent shell, so deactivate. */
+      deactivate = TRUE;
+    }
+
+  if (priv->first_click)
+    {
+      /* We only ever want to prevent deactivation on the first
+       * press/release. */
+      priv->first_click = FALSE;
+
+      deactivate = FALSE;
+    }
+
+  if (deactivate)
+    {
+      gtk_menu_shell_deactivate (menu_shell);
+      g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0);
+    }
+
+  priv->activated_submenu = FALSE;
+
+#else /* !MAEMO_CHANGES */
   if (menu_shell->active)
     {
       if (menu_shell->button && (event->button != menu_shell->button))
@@ -692,6 +817,7 @@
 	  g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0);
 	}
     }
+#endif /* MAEMO_CHANGES */
 
   return TRUE;
 }
@@ -728,6 +854,9 @@
 gtk_menu_shell_enter_notify (GtkWidget        *widget,
 			     GdkEventCrossing *event)
 {
+#ifdef MAEMO_CHANGES
+  GtkMenuShellPrivate *priv;
+#endif /* MAEMO_CHANGES */
   GtkMenuShell *menu_shell;
   GtkWidget *menu_item;
 
@@ -736,6 +865,10 @@
 
   menu_shell = GTK_MENU_SHELL (widget);
 
+#ifdef MAEMO_CHANGES
+  priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
+#endif /* MAEMO_CHANGES */
+
   if (menu_shell->active)
     {
       menu_item = gtk_get_event_widget ((GdkEvent*) event);
@@ -756,6 +889,20 @@
 	      (GTK_WIDGET_STATE (menu_item) != GTK_STATE_PRELIGHT))
 	    {
 	      gtk_menu_shell_select_item (menu_shell, menu_item);
+
+#ifdef MAEMO_CHANGES
+              /* If the pen is down, and there is a submenu that is not
+               * yet visible, activate it
+               */
+              if ((event->state & GDK_BUTTON1_MASK) &&
+                  GTK_MENU_ITEM (menu_item)->submenu != NULL &&
+                  !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu))
+                {
+                  gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE);
+
+                  priv->activated_submenu = TRUE;
+                }
+#endif /* MAEMO_CHANGES */
 	    }
 	}
       else if (menu_shell->parent_menu_shell)
@@ -791,8 +938,14 @@
       if (!_gtk_menu_item_is_selectable (event_widget))
 	return TRUE;
 
+#ifdef MAEMO_CHANGES
       if ((menu_shell->active_menu_item == event_widget) &&
+          ((menu_item->submenu == NULL) ||
+           (!GTK_WIDGET_VISIBLE (menu_item->submenu))))
+#else
+      if ((menu_shell->active_menu_item == event_widget) &&
 	  (menu_item->submenu == NULL))
+#endif /* MAEMO_CHANGES */
 	{
 	  if ((event->detail != GDK_NOTIFY_INFERIOR) &&
 	      (GTK_WIDGET_STATE (menu_item) != GTK_STATE_NORMAL))
@@ -883,6 +1036,12 @@
 {
   if (menu_shell->active)
     {
+#ifdef MAEMO_CHANGES
+      GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
+
+      priv->first_click = FALSE;
+#endif /* MAEMO_CHANGES */
+
       menu_shell->button = 0;
       menu_shell->active = FALSE;
       menu_shell->activate_time = 0;
@@ -988,11 +1147,13 @@
 				  GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement);
   gtk_menu_item_select (GTK_MENU_ITEM (menu_shell->active_menu_item));
 
+#ifndef MAEMO_CHANGES
   /* This allows the bizarre radio buttons-with-submenus-display-history
    * behavior
    */
   if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)
     gtk_widget_activate (menu_shell->active_menu_item);
+#endif /* !MAEMO_CHANGES */
 }
 
 void
@@ -1014,6 +1175,9 @@
 {
   GSList *slist, *shells = NULL;
   gboolean deactivate = force_deactivate;
+#ifdef MAEMO_CHANGES
+  gboolean submenu = FALSE;
+#endif /* MAEMO_CHANGES */
 
   g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
   g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
@@ -1024,7 +1188,16 @@
   g_object_ref (menu_shell);
   g_object_ref (menu_item);
 
+#ifdef MAEMO_CHANGES
+  if (GTK_MENU_ITEM (menu_item)->submenu != NULL)
+    submenu = TRUE;
+#endif /* MAEMO_CHANGES */
+
+#ifdef MAEMO_CHANGES
+  if (deactivate && !submenu)
+#else
   if (deactivate)
+#endif /* MAEMO_CHANGES */
     {
       GtkMenuShell *parent_menu_shell = menu_shell;
 
@@ -1044,15 +1217,29 @@
        */
       gdk_display_sync (gtk_widget_get_display (menu_item));
     }
+#ifdef MAEMO_CHANGES
+  else if (submenu)
+    {
+      _gtk_menu_item_set_placement (GTK_MENU_ITEM (menu_item),
+                                    GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement);
+    }
+#endif /* MAEMO_CHANGES */
 
   gtk_widget_activate (menu_item);
 
+#ifdef MAEMO_CHANGES
+  if (!submenu)
+    {
+#endif /* MAEMO_CHANGES */
   for (slist = shells; slist; slist = slist->next)
     {
       g_signal_emit (slist->data, menu_shell_signals[SELECTION_DONE], 0);
       g_object_unref (slist->data);
     }
   g_slist_free (shells);
+#ifdef MAEMO_CHANGES
+    }
+#endif /* MAEMO_CHANGES */
 
   g_object_unref (menu_shell);
   g_object_unref (menu_item);
@@ -1192,7 +1379,11 @@
   
   if (menu_item->submenu)
     {
+#ifdef MAEMO_CHANGES
+      gtk_menu_shell_activate_item (menu_shell, GTK_WIDGET (menu_item), FALSE);
+#else
       _gtk_menu_item_popup_submenu (GTK_WIDGET (menu_item));
+#endif /* MAEMO_CHANGES */
       gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu), TRUE);
       if (GTK_MENU_SHELL (menu_item->submenu)->active_menu_item)
 	return TRUE;
@@ -1216,6 +1407,19 @@
   switch (direction)
     {
     case GTK_MENU_DIR_PARENT:
+
+#ifdef MAEMO_CHANGES
+      if(!parent_menu_shell || GTK_IS_MENU_BAR (parent_menu_shell))
+        break;
+
+      /* menu should be closed when returning from submenu.
+       * WARNING: This function is from GtkMenu, which normally
+       * shouldn't be called from GtkMenuShell, but currently
+       * there are no better alternatives.
+       */
+      gtk_menu_popdown (GTK_MENU (menu_shell));
+#endif /* MAEMO_CHANGES */
+
       if (parent_menu_shell)
 	{
 	  if (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement == 
@@ -1255,6 +1459,7 @@
 	    break;
 	}
 
+#ifndef MAEMO_CHANGES
       /* Try to find a menu running the opposite direction */
       while (parent_menu_shell && 
 	     (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement ==
@@ -1277,6 +1482,7 @@
 
 	  gtk_menu_shell_select_submenu_first (parent_menu_shell);
 	}
+#endif /* !MAEMO_CHANGES */
       break;
       
     case GTK_MENU_DIR_PREV:
@@ -1303,13 +1509,16 @@
   if (menu_shell->active_menu_item &&
       _gtk_menu_item_is_selectable (menu_shell->active_menu_item))
   {
-   
+#ifndef MAEMO_CHANGES
     if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu == NULL)
+#endif /* !MAEMO_CHANGES */
       gtk_menu_shell_activate_item (menu_shell,
 				    menu_shell->active_menu_item,
 				    force_hide);
+#ifndef MAEMO_CHANGES
     else
       _gtk_menu_item_popup_submenu (menu_shell->active_menu_item);
+#endif /* !MAEMO_CHANGES */
   }
 }
 
@@ -1566,5 +1775,15 @@
     }
 }
 
+#ifdef MAEMO_CHANGES
+void
+_gtk_menu_shell_set_first_click (GtkMenuShell *menu_shell)
+{
+  GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
+
+  priv->first_click = TRUE;
+}
+#endif /* MAEMO_CHANGES */
+
 #define __GTK_MENU_SHELL_C__
 #include "gtkaliasdef.c"

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h	2007-02-15 09:36:11 UTC (rev 9890)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h	2007-02-15 09:55:13 UTC (rev 9891)
@@ -126,6 +126,10 @@
 void     gtk_menu_shell_set_take_focus (GtkMenuShell *menu_shell,
                                         gboolean      take_focus);
 
+#ifdef MAEMO_CHANGES
+void    _gtk_menu_shell_set_first_click (GtkMenuShell *menu_shell);
+#endif /* MAEMO_CHANGES */
+
 G_END_DECLS
 
 #endif /* __GTK_MENU_SHELL_H__ */


More information about the maemo-commits mailing list