[gimp] Bug 584408 - If brush selection popup overlaps color gradient, clicks pass through
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Subject: [gimp] Bug 584408 - If brush selection popup overlaps color gradient, clicks pass through
- Date: Mon, 1 Jun 2009 16:57:29 -0400 (EDT)
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]