From 4b944e5ceb9bccdac7b6e190fc806a6a9a4e608d Mon Sep 17 00:00:00 2001 From: Richard Hult Date: Mon, 10 Dec 2007 19:17:45 +0000 Subject: [PATCH] Merged from trunk: 2007-12-10 Richard Hult Merged from trunk: * gdk/quartz/gdkprivate-quartz.h: * gdk/quartz/gdkeventloop-quartz.c: (_gdk_quartz_event_loop_get_pending), (_gdk_quartz_event_loop_check_pending), (_gdk_quartz_event_loop_release_event), (gdk_event_prepare), (gdk_event_check), (gdk_event_dispatch): * gdk/quartz/gdkevents-quartz.c: (gdk_events_pending) (_gdk_events_queue): Fix a bug where we could end up trying to handle the same event more than once. Based on patch from Paul Davis. svn path=/branches/gtk-2-12/; revision=19144 --- ChangeLog | 15 ++++++++ gdk/quartz/gdkeventloop-quartz.c | 63 +++++++++++++++++++++----------- gdk/quartz/gdkevents-quartz.c | 15 ++++---- gdk/quartz/gdkprivate-quartz.h | 5 ++- 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index d47e9868e4..1fd7ac5cb8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2007-12-10 Richard Hult + + Merged from trunk: + + * gdk/quartz/gdkprivate-quartz.h: + * gdk/quartz/gdkeventloop-quartz.c: + (_gdk_quartz_event_loop_get_pending), + (_gdk_quartz_event_loop_check_pending), + (_gdk_quartz_event_loop_release_event), (gdk_event_prepare), + (gdk_event_check), (gdk_event_dispatch): + * gdk/quartz/gdkevents-quartz.c: (gdk_events_pending) + (_gdk_events_queue): Fix a bug where we could end up trying to + handle the same event more than once. Based on patch from Paul + Davis. + 2007-12-10 Tor Lillqvist Merged from trunk: diff --git a/gdk/quartz/gdkeventloop-quartz.c b/gdk/quartz/gdkeventloop-quartz.c index d9e9ad85e7..a696a39e75 100644 --- a/gdk/quartz/gdkeventloop-quartz.c +++ b/gdk/quartz/gdkeventloop-quartz.c @@ -24,12 +24,37 @@ static guint n_pollfds; static CFRunLoopSourceRef select_main_thread_source; static CFRunLoopRef main_thread_run_loop; +gboolean +_gdk_quartz_event_loop_check_pending (void) +{ + return current_event != NULL; +} + +NSEvent* +_gdk_quartz_event_loop_get_pending (void) +{ + NSEvent *event; + + event = current_event; + current_event = NULL; + + return event; +} + +void +_gdk_quartz_event_loop_release_event (NSEvent *event) +{ + [event release]; +} + static gboolean gdk_event_prepare (GSource *source, gint *timeout) { NSEvent *event; gboolean retval; + + GDK_THREADS_ENTER (); GDK_QUARTZ_ALLOC_POOL; @@ -45,19 +70,27 @@ gdk_event_prepare (GSource *source, GDK_QUARTZ_RELEASE_POOL; + GDK_THREADS_LEAVE (); + return retval; } static gboolean gdk_event_check (GSource *source) { + gboolean retval; + + GDK_THREADS_ENTER (); + if (_gdk_event_queue_find_first (_gdk_display) != NULL || - current_event) - return TRUE; + _gdk_quartz_event_loop_check_pending ()) + retval = TRUE; + else + retval = FALSE; - /* FIXME: We should maybe try to fetch an event again here */ + GDK_THREADS_LEAVE (); - return FALSE; + return retval; } static gboolean @@ -67,6 +100,8 @@ gdk_event_dispatch (GSource *source, { GdkEvent *event; + GDK_THREADS_ENTER (); + GDK_QUARTZ_ALLOC_POOL; _gdk_events_queue (_gdk_display); @@ -83,6 +118,8 @@ gdk_event_dispatch (GSource *source, GDK_QUARTZ_RELEASE_POOL; + GDK_THREADS_LEAVE (); + return TRUE; } @@ -264,11 +301,6 @@ poll_func (GPollFD *ufds, guint nfds, gint timeout_) { ufds[0].revents = G_IO_IN; - /* FIXME: We can't assert here, but we might need to have a - * queue for events instead. - */ - /*g_assert (current_event == NULL);*/ - current_event = [event retain]; n_active ++; @@ -298,16 +330,3 @@ _gdk_quartz_event_loop_init (void) } -NSEvent * -_gdk_quartz_event_loop_get_current (void) -{ - return current_event; -} - -void -_gdk_quartz_event_loop_release_current (void) -{ - [current_event release]; - current_event = NULL; -} - diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 01dea29dca..832646cd6b 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -130,7 +130,7 @@ gboolean gdk_events_pending (void) { return (_gdk_event_queue_find_first (_gdk_display) || - (_gdk_quartz_event_loop_get_current () != NULL)); + (_gdk_quartz_event_loop_check_pending ())); } GdkEvent* @@ -1829,14 +1829,15 @@ gdk_event_translate (NSEvent *nsevent) void _gdk_events_queue (GdkDisplay *display) { - NSEvent *current_event = _gdk_quartz_event_loop_get_current (); + NSEvent *event; - if (current_event) + event = _gdk_quartz_event_loop_get_pending (); + if (event) { - if (!gdk_event_translate (current_event)) - [NSApp sendEvent:current_event]; - - _gdk_quartz_event_loop_release_current (); + if (!gdk_event_translate (event)) + [NSApp sendEvent:event]; + + _gdk_quartz_event_loop_release_event (event); } } diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index c3b7b0bc63..e322e43405 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -158,8 +158,9 @@ extern GdkWindow *_gdk_quartz_keyboard_grab_window; extern GdkWindow *_gdk_quartz_pointer_grab_window; /* Event loop */ -NSEvent * _gdk_quartz_event_loop_get_current (void); -void _gdk_quartz_event_loop_release_current (void); +gboolean _gdk_quartz_event_loop_check_pending (void); +NSEvent * _gdk_quartz_event_loop_get_pending (void); +void _gdk_quartz_event_loop_release_event (NSEvent *event); /* FIXME: image */ GdkImage *_gdk_quartz_image_copy_to_image (GdkDrawable *drawable,