[gtk+] gdkevent: Hold refs to device/source_device
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gdkevent: Hold refs to device/source_device
- Date: Wed, 19 Aug 2015 20:15:17 +0000 (UTC)
commit 25557c1c5d977acb5659e13394961524b67c2ec0
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Aug 3 17:22:29 2015 +0200
gdkevent: Hold refs to device/source_device
The extra reference will be held from GdkEventPrivate data, so there's
a common place to all events. Without this, events queued after devices/
capabilities disappear (eg. on TTY switch) might hold invalid pointers.
Windowing level operations on those devices (queries, grabs...) are
expected to fail at that time, but we should hold meaningful data for
the regular event handling paths.
https://bugzilla.gnome.org/show_bug.cgi?id=753185
gdk/gdkevents.c | 16 ++++++++++++----
1 files changed, 12 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index 2b2c6f8..4052d54 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -658,8 +658,8 @@ gdk_event_copy (const GdkEvent *event)
GdkEventPrivate *private = (GdkEventPrivate *)event;
new_private->screen = private->screen;
- new_private->device = private->device;
- new_private->source_device = private->source_device;
+ new_private->device = private->device ? g_object_ref (private->device) : NULL;
+ new_private->source_device = private->source_device ? g_object_ref (private->source_device) : NULL;
}
switch (event->any.type)
@@ -754,10 +754,18 @@ gdk_event_copy (const GdkEvent *event)
void
gdk_event_free (GdkEvent *event)
{
+ GdkEventPrivate *private;
GdkDisplay *display;
g_return_if_fail (event != NULL);
+ if (gdk_event_is_allocated (event))
+ {
+ private = (GdkEventPrivate *) event;
+ g_clear_object (&private->device);
+ g_clear_object (&private->source_device);
+ }
+
switch (event->any.type)
{
case GDK_KEY_PRESS:
@@ -1519,7 +1527,7 @@ gdk_event_set_device (GdkEvent *event,
private = (GdkEventPrivate *) event;
- private->device = device;
+ g_set_object (&private->device, device);
switch (event->type)
{
@@ -1672,7 +1680,7 @@ gdk_event_set_source_device (GdkEvent *event,
private = (GdkEventPrivate *) event;
- private->source_device = device;
+ g_set_object (&private->source_device, device);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]