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

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Feb 1 20:03:58 EET 2007
Author: mitch
Date: 2007-02-01 20:03:56 +0200 (Thu, 01 Feb 2007)
New Revision: 9547

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

	* gtk/gtkmenu.c: port over the remaining context_menu stuff.



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-01 16:39:07 UTC (rev 9546)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-02-01 18:03:56 UTC (rev 9547)
@@ -1,5 +1,9 @@
 2007-02-01  Michael Natterer  <mitch at imendio.com>
 
+	* gtk/gtkmenu.c: port over the remaining context_menu stuff.
+
+2007-02-01  Michael Natterer  <mitch at imendio.com>
+
 	Merge from upstream trunk:
 
 	* gtk/gtkmenu.c (gtk_menu_button_press)

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-01 16:39:07 UTC (rev 9546)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c	2007-02-01 18:03:56 UTC (rev 9547)
@@ -27,6 +27,10 @@
 #define GTK_MENU_INTERNALS
 #include <config.h>
 #include <string.h> /* memset */
+#ifdef MAEMO_CHANGES
+#include <math.h>
+#include <stdlib.h>
+#endif /* MAEMO_CHANGES */
 #include "gdk/gdkkeysyms.h"
 #include "gtkaccellabel.h"
 #include "gtkaccelmap.h"
@@ -2659,7 +2663,63 @@
   GTK_WIDGET_CLASS (gtk_menu_parent_class)->show (widget);
 }
 
+#ifdef MAEMO_CHANGES
+static GtkWidget *
+find_active_menu_item (GdkEventButton *event)
+{
+  GtkWidget *menu_item;
+
+  menu_item = gtk_get_event_widget ((GdkEvent*) event);
+  while (menu_item && !GTK_IS_MENU_ITEM (menu_item))
+    menu_item = menu_item->parent;
+
+  return menu_item;
+}
+
 static gboolean
+pointer_in_menu_tree (GtkWidget *widget)
+{
+  GtkMenuShell *mshell;
+  gint width, height, x, y;
+
+  mshell = GTK_MENU_SHELL (widget);
+
+  gdk_window_get_pointer (widget->window, &x, &y, NULL);
+  gdk_drawable_get_size (widget->window, &width, &height);
+
+  if ((x <= width) && (x >= 0) && (y <= height) && (y >= 0))
+    return TRUE;
+
+  if ((mshell->parent_menu_shell != NULL) &&
+      GTK_IS_MENU (mshell->parent_menu_shell))
+    return pointer_in_menu_tree (mshell->parent_menu_shell);
+
+  return FALSE;
+}
+
+static gint
+distance_traveled (GtkWidget *widget)
+{
+  GtkMenuPrivate *priv;
+  GdkScreen *screen;
+  GdkDisplay *display;
+  gint x, y, dx, dy;
+
+  priv = gtk_menu_get_private (GTK_MENU (widget));
+
+  screen = gtk_widget_get_screen (widget);
+  display = gdk_screen_get_display (screen);
+
+  gdk_display_get_pointer (display, NULL, &x, &y, NULL);
+
+  dx = (priv->popup_pointer_x - x);
+  dy = (priv->popup_pointer_y - y);
+
+  return abs ((int) sqrt ((double) (dx * dx + dy * dy)));
+}
+#endif /* MAEMO_CHANGES */
+
+static gboolean
 gtk_menu_button_scroll (GtkMenu        *menu,
                         GdkEventButton *event)
 {
@@ -2696,6 +2756,17 @@
   if (gtk_menu_button_scroll (GTK_MENU (widget), event))
     return TRUE;
 
+#ifdef MAEMO_CHANGES
+  if (!find_active_menu_item (event))
+    {
+      /*  Don't pass down to menu shell if a non-menuitem part of the menu
+       *  was clicked.
+       */
+      if (pointer_in_menu_tree (widget))
+        return TRUE;
+    }
+#endif /* MAEMO_CHANGES */
+
   return GTK_WIDGET_CLASS (gtk_menu_parent_class)->button_press_event (widget, event);
 }
 
@@ -2719,6 +2790,35 @@
   if (gtk_menu_button_scroll (GTK_MENU (widget), event))
     return TRUE;
 
+#ifdef MAEMO_CHANGES
+  if (!find_active_menu_item (event))
+    {
+      if (priv->context_menu &&
+          (priv->popup_pointer_x >= 0) &&
+          (priv->popup_pointer_y >= 0))
+        {
+          gint distance;
+
+          distance = distance_traveled (widget);
+
+          priv->popup_pointer_x = -1;
+          priv->popup_pointer_y = -1;
+
+          /*  Don't popdown if we traveled less than 20px since popup
+           *  point, as per the Nokia 770 specs.
+           */
+          if (distance < 20)
+            return TRUE;
+        }
+
+      /*  Don't pass down to menu shell if a non-menuitem part of the menu
+       *  was clicked.
+       */
+      if (pointer_in_menu_tree (widget))
+        return TRUE;
+    }
+#endif /* MAEMO_CHANGES */
+
   return GTK_WIDGET_CLASS (gtk_menu_parent_class)->button_release_event (widget, event);
 }
 
@@ -2958,14 +3058,39 @@
   menu_item = gtk_get_event_widget ((GdkEvent*) event);
   if (!GTK_IS_MENU_ITEM (menu_item) ||
       !GTK_IS_MENU (menu_item->parent))
+#ifdef MAEMO_CHANGES
+    {
+      GtkMenuPrivate *priv = gtk_menu_get_private (GTK_MENU (widget));
+
+      if (priv->context_menu)
+        {
+          /* Context menu mode. If we dragged out of the menu, close
+           * the menu, as by the specs.
+           */
+          if (!pointer_in_menu_tree (widget) &&
+              (distance_traveled (widget) >= 20) &&
+              (event->state & GDK_BUTTON1_MASK))
+            {
+              gtk_menu_shell_deactivate (GTK_MENU_SHELL (widget));
+
+              return TRUE;
+            }
+        }
+
+      return FALSE;
+    }
+#else
     return FALSE;
+#endif /* MAEMO_CHANGES */
 
   menu_shell = GTK_MENU_SHELL (menu_item->parent);
   menu = GTK_MENU (menu_shell);
 
+#ifndef MAEMO_CHANGES
   if (definitely_within_item (menu_item, event->x, event->y))
     menu_shell->activate_time = 0;
-  
+#endif /* !MAEMO_CHANGES */
+
   need_enter = (menu->navigation_region != NULL || menu_shell->ignore_enter);
 
   /* Check to see if we are within an active submenu's navigation region
@@ -4059,7 +4184,6 @@
 {
   GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (menu));
   gboolean touchscreen_mode;
-  gboolean was_scrolling;
 
   gtk_menu_remove_scroll_timeout (menu);
   


More information about the maemo-commits mailing list