[gtk+/xi2: 779/1239] Fix last relevant accesses to display->pointer_info.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+/xi2: 779/1239] Fix last relevant accesses to display->pointer_info.
- Date: Tue, 29 Sep 2009 10:51:06 +0000 (UTC)
commit 2909139e6e5db6ffe7336902a4a08e50a722cf3d
Author: Carlos Garnacho <carlos lanedo com>
Date: Sun Aug 16 22:12:01 2009 +0200
Fix last relevant accesses to display->pointer_info.
motion_hint_serial is missing, but will be moved to the GdkDisplay struct.
gdk/gdkdisplay.c | 75 +++++++++++++++++++++++----------------------
gdk/gdkinternals.h | 3 +-
gdk/gdkwindow.c | 11 ++++---
gdk/x11/gdkdisplay-x11.c | 3 +-
gdk/x11/gdkmain-x11.c | 3 +-
5 files changed, 50 insertions(+), 45 deletions(-)
---
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c
index bf55531..3c7d42b 100644
--- a/gdk/gdkdisplay.c
+++ b/gdk/gdkdisplay.c
@@ -920,13 +920,15 @@ synthesize_crossing_events (GdkDisplay *display,
}
static void
-switch_to_pointer_grab (GdkDisplay *display,
+switch_to_pointer_grab (GdkDisplay *display,
+ GdkDevice *device,
GdkPointerGrabInfo *grab,
GdkPointerGrabInfo *last_grab,
- guint32 time,
- gulong serial)
+ guint32 time,
+ gulong serial)
{
GdkWindow *src_window, *pointer_window;
+ GdkPointerWindowInfo *info;
GdkWindowObject *w;
GList *old_grabs;
GdkModifierType state;
@@ -935,15 +937,16 @@ switch_to_pointer_grab (GdkDisplay *display,
/* Temporarily unset pointer to make sure we send the crossing events below */
old_grabs = display->pointer_grabs;
display->pointer_grabs = NULL;
-
+ info = _gdk_display_get_pointer_info (display, device);
+
if (grab)
{
/* New grab is in effect */
-
+
/* We need to generate crossing events for the grab.
* However, there are never any crossing events for implicit grabs
* TODO: ... Actually, this could happen if the pointer window
- * doesn't have button mask so a parent gets the event...
+ * doesn't have button mask so a parent gets the event...
*/
if (!grab->implicit)
{
@@ -952,22 +955,21 @@ switch_to_pointer_grab (GdkDisplay *display,
if (last_grab)
src_window = last_grab->window;
else
- src_window = display->pointer_info.window_under_pointer;
-
+ src_window = info->window_under_pointer;
+
if (src_window != grab->window)
{
synthesize_crossing_events (display,
src_window, grab->window,
GDK_CROSSING_GRAB, time, serial);
}
-
+
/* !owner_event Grabbing a window that we're not inside, current status is
now NULL (i.e. outside grabbed window) */
- /* FIXME: which device you said? */
- if (!grab->owner_events && display->pointer_info.window_under_pointer != grab->window)
- _gdk_display_set_window_under_pointer (display, display->core_pointer, NULL);
+ if (!grab->owner_events && info->window_under_pointer != grab->window)
+ _gdk_display_set_window_under_pointer (display, device, NULL);
}
-
+
grab->activated = TRUE;
}
else if (last_grab)
@@ -978,15 +980,15 @@ switch_to_pointer_grab (GdkDisplay *display,
GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_ROOT ||
GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_FOREIGN))
pointer_window = NULL;
-
+
/* We force checked what window we're in, so we need to
* update the toplevel_under_pointer info, as that won't get told of
* this change.
*/
- if (display->pointer_info.toplevel_under_pointer)
- g_object_unref (display->pointer_info.toplevel_under_pointer);
- display->pointer_info.toplevel_under_pointer = NULL;
-
+ if (info->toplevel_under_pointer)
+ g_object_unref (info->toplevel_under_pointer);
+ info->toplevel_under_pointer = NULL;
+
if (pointer_window)
{
/* Convert to toplevel */
@@ -998,10 +1000,10 @@ switch_to_pointer_grab (GdkDisplay *display,
y += w->y;
w = w->parent;
}
-
+
/* w is now toplevel and x,y in toplevel coords */
- display->pointer_info.toplevel_under_pointer = g_object_ref (w);
-
+ info->toplevel_under_pointer = g_object_ref (w);
+
/* Find (possibly virtual) child window */
pointer_window =
_gdk_window_find_descendant_at ((GdkWindow *)w,
@@ -1013,28 +1015,27 @@ switch_to_pointer_grab (GdkDisplay *display,
synthesize_crossing_events (display,
last_grab->window, pointer_window,
GDK_CROSSING_UNGRAB, time, serial);
-
+
/* We're now ungrabbed, update the window_under_pointer */
- /* FIXME: which device you said? */
- _gdk_display_set_window_under_pointer (display, display->core_pointer, pointer_window);
-
+ _gdk_display_set_window_under_pointer (display, device, pointer_window);
+
if (last_grab->implicit_ungrab)
generate_grab_broken_event (last_grab->window,
- FALSE, TRUE,
+ FALSE, TRUE,
NULL);
}
-
- display->pointer_grabs = old_grabs;
+ display->pointer_grabs = old_grabs;
}
void
_gdk_display_pointer_grab_update (GdkDisplay *display,
- gulong current_serial)
+ GdkDevice *device,
+ gulong current_serial)
{
GdkPointerGrabInfo *current_grab, *next_grab;
guint32 time;
-
+
time = display->last_event_time;
while (display->pointer_grabs != NULL)
@@ -1043,7 +1044,7 @@ _gdk_display_pointer_grab_update (GdkDisplay *display,
if (current_grab->serial_start > current_serial)
return; /* Hasn't started yet */
-
+
if (current_grab->serial_end > current_serial ||
(current_grab->serial_end == current_serial &&
current_grab->grab_one_pointer_release_event))
@@ -1052,8 +1053,8 @@ _gdk_display_pointer_grab_update (GdkDisplay *display,
its the currently active one or scheduled to be active */
if (!current_grab->activated)
- switch_to_pointer_grab (display, current_grab, NULL, time, current_serial);
-
+ switch_to_pointer_grab (display, device, current_grab, NULL, time, current_serial);
+
break;
}
@@ -1063,7 +1064,7 @@ _gdk_display_pointer_grab_update (GdkDisplay *display,
{
/* This is the next active grab */
next_grab = display->pointer_grabs->next->data;
-
+
if (next_grab->serial_start > current_serial)
next_grab = NULL; /* Actually its not yet active */
}
@@ -1079,11 +1080,11 @@ _gdk_display_pointer_grab_update (GdkDisplay *display,
display->pointer_grabs =
g_list_delete_link (display->pointer_grabs,
display->pointer_grabs);
-
- switch_to_pointer_grab (display,
+
+ switch_to_pointer_grab (display, device,
next_grab, current_grab,
time, current_serial);
-
+
free_pointer_grab (current_grab);
}
}
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index ce26c09..022dde7 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -584,7 +584,8 @@ void _gdk_windowing_launch_failed (GAppLaunchContext *context,
GdkPointerGrabInfo *_gdk_display_get_active_pointer_grab (GdkDisplay *display);
void _gdk_display_pointer_grab_update (GdkDisplay *display,
- gulong current_serial);
+ GdkDevice *device,
+ gulong current_serial);
GdkPointerGrabInfo *_gdk_display_get_last_pointer_grab (GdkDisplay *display);
GdkPointerGrabInfo *_gdk_display_add_pointer_grab (GdkDisplay *display,
GdkWindow *window,
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index e2106ce..d6b48af 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -9267,7 +9267,7 @@ proxy_button_event (GdkEvent *source_event,
serial,
time_,
TRUE);
- _gdk_display_pointer_grab_update (display, serial);
+ _gdk_display_pointer_grab_update (display, device, serial);
}
pointer_window = get_pointer_window (display, toplevel_window, device,
@@ -9416,14 +9416,15 @@ _gdk_windowing_got_event (GdkDisplay *display,
if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
display->last_event_time = gdk_event_get_time (event);
- _gdk_display_pointer_grab_update (display,
- serial);
+ device = gdk_event_get_device (event);
+
+ if (device)
+ _gdk_display_pointer_grab_update (display, device, serial);
event_window = event->any.window;
if (!event_window)
return;
- device = gdk_event_get_device (event);
pointer_info = _gdk_display_get_pointer_info (display, device);
event_private = GDK_WINDOW_OBJECT (event_window);
@@ -9554,7 +9555,7 @@ _gdk_windowing_got_event (GdkDisplay *display,
{
button_release_grab->serial_end = serial;
button_release_grab->implicit_ungrab = TRUE;
- _gdk_display_pointer_grab_update (display, serial);
+ _gdk_display_pointer_grab_update (display, device, serial);
}
}
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index a106222..45fb33a 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -1478,7 +1478,8 @@ pointer_ungrab_callback (GdkDisplay *display,
gpointer data,
gulong serial)
{
- _gdk_display_pointer_grab_update (display, serial);
+ /* FIXME: which device? */
+ _gdk_display_pointer_grab_update (display, display->core_pointer, serial);
}
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c
index b42dc4b..7a9f62b 100644
--- a/gdk/x11/gdkmain-x11.c
+++ b/gdk/x11/gdkmain-x11.c
@@ -142,7 +142,8 @@ has_pointer_grab_callback (GdkDisplay *display,
gpointer data,
gulong serial)
{
- _gdk_display_pointer_grab_update (display, serial);
+ /* FIXME: which device? */
+ _gdk_display_pointer_grab_update (display, display->core_pointer, serial);
}
GdkGrabStatus
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]