[gimp] Bug 584408 - If brush selection popup overlaps color gradient, clicks pass through



commit 77439d689e810eb4455d9f5576f1f4492b19c290
Author: Michael Natterer <mitch gimp org>
Date:   Mon Jun 1 22:55:43 2009 +0200

    Bug 584408 - If brush selection popup overlaps color gradient, clicks pass through
    
    Keep track of the drag state the widget is in so it doesn't get confused
    by release or motion events that don't have a related press event.
---
 libgimpwidgets/gimpcolorselect.c |  124 ++++++++++++++++++++++++++------------
 1 files changed, 85 insertions(+), 39 deletions(-)

diff --git a/libgimpwidgets/gimpcolorselect.c b/libgimpwidgets/gimpcolorselect.c
index 80ec40d..3442b6a 100644
--- a/libgimpwidgets/gimpcolorselect.c
+++ b/libgimpwidgets/gimpcolorselect.c
@@ -74,6 +74,13 @@ typedef enum
   UPDATE_CALLER     = 1 << 6
 } ColorSelectUpdateType;
 
+typedef enum
+{
+  DRAG_NONE,
+  DRAG_XY,
+  DRAG_Z
+} ColorSelectDragMode;
+
 
 #define GIMP_COLOR_SELECT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_COLOR_SELECT, GimpColorSelectClass))
 #define GIMP_IS_COLOR_SELECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_COLOR_SELECT))
@@ -96,6 +103,8 @@ struct _GimpColorSelect
   ColorSelectFillType  z_color_fill;
   ColorSelectFillType  xy_color_fill;
   GdkGC               *gc;
+
+  ColorSelectDragMode  drag_mode;
 };
 
 struct _GimpColorSelectClass
@@ -240,6 +249,7 @@ gimp_color_select_init (GimpColorSelect *select)
   select->z_color_fill  = COLOR_SELECT_HUE;
   select->xy_color_fill = COLOR_SELECT_SATURATION_VALUE;
   select->gc            = NULL;
+  select->drag_mode     = DRAG_NONE;
 
   hbox = gtk_hbox_new (FALSE, 4);
   gtk_box_pack_start (GTK_BOX (select), hbox, TRUE, TRUE, 0);
@@ -636,38 +646,56 @@ gimp_color_select_xy_events (GtkWidget       *widget,
                              GdkEvent        *event,
                              GimpColorSelect *select)
 {
-  GdkEventButton *bevent;
-  GdkEventMotion *mevent;
-  gint            width, height;
-  gint            x, y;
+  gint width, height;
+  gint x, y;
 
   switch (event->type)
     {
     case GDK_BUTTON_PRESS:
-      bevent = (GdkEventButton *) event;
-      x = bevent->x;
-      y = bevent->y;
-
-      gdk_pointer_grab (gtk_widget_get_window (select->xy_color), FALSE,
-                        GDK_POINTER_MOTION_HINT_MASK |
-                        GDK_BUTTON_MOTION_MASK       |
-                        GDK_BUTTON_RELEASE_MASK,
-                        NULL, NULL, bevent->time);
+      {
+        GdkEventButton *bevent = (GdkEventButton *) event;
+
+        if (select->drag_mode != DRAG_NONE || bevent->button != 1)
+          return FALSE;
+
+        x = bevent->x;
+        y = bevent->y;
+
+        gdk_pointer_grab (gtk_widget_get_window (select->xy_color), FALSE,
+                          GDK_POINTER_MOTION_HINT_MASK |
+                          GDK_BUTTON_MOTION_MASK       |
+                          GDK_BUTTON_RELEASE_MASK,
+                          NULL, NULL, bevent->time);
+        select->drag_mode = DRAG_XY;
+      }
       break;
 
     case GDK_BUTTON_RELEASE:
-      bevent = (GdkEventButton *) event;
-      x = bevent->x;
-      y = bevent->y;
+      {
+        GdkEventButton *bevent = (GdkEventButton *) event;
+
+        if (select->drag_mode != DRAG_XY || bevent->button != 1)
+          return FALSE;
 
-      gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
-                                  bevent->time);
+        x = bevent->x;
+        y = bevent->y;
+
+        gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
+                                    bevent->time);
+        select->drag_mode = DRAG_NONE;
+      }
       break;
 
     case GDK_MOTION_NOTIFY:
-      mevent = (GdkEventMotion *) event;
-      x = mevent->x;
-      y = mevent->y;
+      {
+        GdkEventMotion *mevent = (GdkEventMotion *) event;
+
+        if (select->drag_mode != DRAG_XY)
+          return FALSE;
+
+        x = mevent->x;
+        y = mevent->y;
+      }
       break;
 
     default:
@@ -724,35 +752,53 @@ gimp_color_select_z_events (GtkWidget       *widget,
                             GdkEvent        *event,
                             GimpColorSelect *select)
 {
-  GdkEventButton *bevent;
-  GdkEventMotion *mevent;
-  gint            height;
-  gint            z;
+  gint height;
+  gint z;
 
   switch (event->type)
     {
     case GDK_BUTTON_PRESS:
-      bevent = (GdkEventButton *) event;
-      z = bevent->y;
-
-      gdk_pointer_grab (gtk_widget_get_window (select->z_color), FALSE,
-                        GDK_POINTER_MOTION_HINT_MASK |
-                        GDK_BUTTON_MOTION_MASK       |
-                        GDK_BUTTON_RELEASE_MASK,
-                        NULL, NULL, bevent->time);
+      {
+        GdkEventButton *bevent = (GdkEventButton *) event;
+
+        if (select->drag_mode != DRAG_NONE || bevent->button != 1)
+          return FALSE;
+
+        z = bevent->y;
+
+        gdk_pointer_grab (gtk_widget_get_window (select->z_color), FALSE,
+                          GDK_POINTER_MOTION_HINT_MASK |
+                          GDK_BUTTON_MOTION_MASK       |
+                          GDK_BUTTON_RELEASE_MASK,
+                          NULL, NULL, bevent->time);
+        select->drag_mode = DRAG_Z;
+      }
       break;
 
     case GDK_BUTTON_RELEASE:
-      bevent = (GdkEventButton *) event;
-      z = bevent->y;
+      {
+        GdkEventButton *bevent = (GdkEventButton *) event;
+
+        if (select->drag_mode != DRAG_Z || bevent->button != 1)
+          return FALSE;
 
-      gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
-                                  bevent->time);
+        z = bevent->y;
+
+        gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
+                                    bevent->time);
+        select->drag_mode = DRAG_NONE;
+      }
       break;
 
     case GDK_MOTION_NOTIFY:
-      mevent = (GdkEventMotion *) event;
-      z = mevent->y;
+      {
+        GdkEventMotion *mevent = (GdkEventMotion *) event;
+
+        if (select->drag_mode != DRAG_Z)
+          return FALSE;
+
+        z = mevent->y;
+      }
       break;
 
     default:



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