diff options
author | Tor Lillqvist <tml@novell.com> | 2006-02-08 17:26:59 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2006-02-08 17:26:59 +0000 |
commit | 70c468374fdf0787e375b2266a9b0818abe7d0c5 (patch) | |
tree | 35ca899b29d6d004b404e7497f26d9003e51a3f8 /gdk | |
parent | 86bf974f5e27486dbe45894bdf2a823bfb7cbfc2 (diff) | |
download | gdk-pixbuf-70c468374fdf0787e375b2266a9b0818abe7d0c5.tar.gz |
Consistenly use assign_object() when assigning GdkWindow pointers so that
2006-02-08 Tor Lillqvist <tml@novell.com>
* gdk/win32/gdkevents-win32.c (gdk_pointer_grab)
(gdk_display_pointer_ungrab, gdk_keyboard_grab)
(gdk_display_keyboard_ungrab): Consistenly use assign_object()
when assigning GdkWindow pointers so that the ref counting doesn't
get off whack.
(gdk_event_translate) <WM_MOUSEMOVE>: When the pointer is grabbed
with owner_events FALSE, generate enter and leave events only for
the grab window. (#321054)
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 089673bc3..a69499b5c 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -585,7 +585,7 @@ gdk_pointer_grab (GdkWindow *window, if (p_grab_window != NULL && p_grab_window != window) generate_grab_broken_event (p_grab_window, FALSE, window); - p_grab_window = window; + assign_object (&p_grab_window, window); if (p_grab_cursor != NULL) { @@ -642,7 +642,7 @@ gdk_display_pointer_ungrab (GdkDisplay *display, /* FIXME: Generate GDK_CROSSING_UNGRAB events */ - p_grab_window = NULL; + assign_object (&p_grab_window, NULL); if (p_grab_cursor != NULL) { if (GetCursor () == p_grab_cursor) @@ -759,7 +759,7 @@ gdk_keyboard_grab (GdkWindow *window, if (k_grab_window != NULL && k_grab_window != window) generate_grab_broken_event (k_grab_window, TRUE, window); - k_grab_window = window; + assign_object (&k_grab_window, window); if (!k_grab_owner_events) { @@ -824,7 +824,7 @@ gdk_display_keyboard_ungrab (GdkDisplay *display, } } - k_grab_window = NULL; + assign_object (&k_grab_window, NULL); } gboolean @@ -2749,7 +2749,22 @@ gdk_event_translate (MSG *msg, GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); if (real_window != current_window) - synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg); + { + if (p_grab_owner_events) + { + synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg); + } + else if (current_window == p_grab_window) + { + synthesize_leave_event (p_grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + assign_object (¤t_window, _gdk_root); + } + else if (real_window == p_grab_window) + { + synthesize_enter_event (p_grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + assign_object (¤t_window, p_grab_window); + } + } } else { |