[goocanvas] Use gdk_event_copy() rather than just copying the event struct.
- From: Damon Chaplin <damon src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goocanvas] Use gdk_event_copy() rather than just copying the event struct.
- Date: Sat, 2 Nov 2013 11:01:02 +0000 (UTC)
commit b39f1462e7491fe186c431ea100643859a9f90ac
Author: Damon Chaplin <damon gnome org>
Date: Sat Nov 2 11:00:07 2013 +0000
Use gdk_event_copy() rather than just copying the event struct.
ChangeLog | 8 +++++++-
src/goocanvas.c | 48 ++++++++++++++++++++++++++++--------------------
2 files changed, 35 insertions(+), 21 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 1ce4852..80ddfff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
+2013-11-02 Damon Chaplin <damon gnome org>
+
+ * src/goocanvas.c (emit_pointer_event): use gdk_event_copy() rather
+ than a struct copy, to copy the private stuff like device etc. #665637
+
2013-11-01 Damon Chaplin <damon gnome org>
- * demo/*.c: fixed a lot of warnings.
+ * src/*.c:
+ * demo/*.c: fixed a lot of warnings, mainly about deprecated stuff.
2013-11-01 Damon Chaplin <damon gnome org>
diff --git a/src/goocanvas.c b/src/goocanvas.c
index 552a973..a5a3e51 100644
--- a/src/goocanvas.c
+++ b/src/goocanvas.c
@@ -3059,9 +3059,10 @@ emit_pointer_event (GooCanvas *canvas,
gchar *signal_name,
GdkEvent *original_event)
{
- GdkEvent event = *original_event;
+ GdkEvent *event;
GooCanvasItem *target_item = canvas->pointer_item;
double *x, *y, *x_root, *y_root;
+ gboolean retval;
/* Check if an item has grabbed the pointer. */
if (canvas->pointer_grab_item)
@@ -3069,7 +3070,8 @@ emit_pointer_event (GooCanvas *canvas,
/* When the pointer is grabbed, it receives all the pointer motion,
button press/release events and its own enter/leave notify events.
Enter/leave notify events for other items are discarded. */
- if ((event.type == GDK_ENTER_NOTIFY || event.type == GDK_LEAVE_NOTIFY)
+ if ((original_event->type == GDK_ENTER_NOTIFY
+ || original_event->type == GDK_LEAVE_NOTIFY)
&& canvas->pointer_item != canvas->pointer_grab_item)
return FALSE;
@@ -3080,34 +3082,36 @@ emit_pointer_event (GooCanvas *canvas,
if (target_item && !ITEM_IS_VALID (target_item))
return FALSE;
+ event = gdk_event_copy (original_event);
+
/* Translate the x & y coordinates to the item's space. */
- switch (event.type)
+ switch (event->type)
{
case GDK_MOTION_NOTIFY:
- x = &event.motion.x;
- y = &event.motion.y;
- x_root = &event.motion.x_root;
- y_root = &event.motion.y_root;
+ x = &event->motion.x;
+ y = &event->motion.y;
+ x_root = &event->motion.x_root;
+ y_root = &event->motion.y_root;
break;
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
- x = &event.crossing.x;
- y = &event.crossing.y;
- x_root = &event.crossing.x_root;
- y_root = &event.crossing.y_root;
+ x = &event->crossing.x;
+ y = &event->crossing.y;
+ x_root = &event->crossing.x_root;
+ y_root = &event->crossing.y_root;
break;
case GDK_SCROLL:
- x = &event.scroll.x;
- y = &event.scroll.y;
- x_root = &event.scroll.x_root;
- y_root = &event.scroll.y_root;
+ x = &event->scroll.x;
+ y = &event->scroll.y;
+ x_root = &event->scroll.x_root;
+ y_root = &event->scroll.y_root;
break;
default:
/* It must be a button press/release event. */
- x = &event.button.x;
- y = &event.button.y;
- x_root = &event.button.x_root;
- y_root = &event.button.y_root;
+ x = &event->button.x;
+ y = &event->button.y;
+ x_root = &event->button.x_root;
+ y_root = &event->button.y_root;
break;
}
@@ -3129,7 +3133,11 @@ emit_pointer_event (GooCanvas *canvas,
/* Convert to the item's coordinate space. */
goo_canvas_convert_to_item_space (canvas, target_item, x, y);
- return propagate_event (canvas, target_item, signal_name, &event);
+ retval = propagate_event (canvas, target_item, signal_name, event);
+
+ gdk_event_free (event);
+
+ return retval;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]