From 8f254814064cd23ae1467c75538cd78c38cba11c Mon Sep 17 00:00:00 2001 From: Paolo Borelli Date: Sat, 5 Mar 2016 19:02:15 +0100 Subject: [PATCH] win32: use a struct for the event source This removes the event_poll_fd global variable and the (ab)use of get_default_display. It is also more consistent with other backends. Also store display --- gdk/win32/gdkdisplay-win32.c | 2 +- gdk/win32/gdkevents-win32.c | 71 +++++++++++++++++++----------------- gdk/win32/gdkprivate-win32.h | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c index 25273b5b38..c739e73812 100644 --- a/gdk/win32/gdkdisplay-win32.c +++ b/gdk/win32/gdkdisplay-win32.c @@ -232,7 +232,7 @@ _gdk_win32_display_open (const gchar *display_name) win32_display->screen = g_object_new (GDK_TYPE_WIN32_SCREEN, NULL); - _gdk_events_init (); + _gdk_events_init (_gdk_display); _gdk_input_ignore_core = FALSE; diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index b326b901b2..1f802af1a8 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -108,6 +108,14 @@ extern gint _gdk_input_ignore_core; GdkCursor *_gdk_win32_grab_cursor; +typedef struct +{ + GSource source; + + GdkDisplay *display; + GPollFD event_poll_fd; +} GdkWin32EventSource; + static GSourceFuncs event_funcs = { gdk_event_prepare, gdk_event_check, @@ -115,8 +123,6 @@ static GSourceFuncs event_funcs = { NULL }; -GPollFD event_poll_fd; - static GdkWindow *mouse_window = NULL; static GdkWindow *mouse_window_ignored_leave = NULL; static gint current_x, current_y; @@ -286,9 +292,10 @@ _gdk_win32_window_procedure (HWND hwnd, } void -_gdk_events_init (void) +_gdk_events_init (GdkDisplay *display) { GSource *source; + GdkWin32EventSource *event_source; #if 0 int i, j, n; @@ -376,20 +383,22 @@ _gdk_events_init (void) GDK_NOTE (EVENTS, g_print ("latin_locale = %08x\n", (guint) latin_locale)); #endif - source = g_source_new (&event_funcs, sizeof (GSource)); + source = g_source_new (&event_funcs, sizeof (GdkWin32EventSource)); g_source_set_name (source, "GDK Win32 event source"); g_source_set_priority (source, GDK_PRIORITY_EVENTS); + event_source = (GdkWin32EventSource *)source; + event_source->display = display; #ifdef G_WITH_CYGWIN - event_poll_fd.fd = open ("/dev/windows", O_RDONLY); - if (event_poll_fd.fd == -1) + event_source->event_poll_fd.fd = open ("/dev/windows", O_RDONLY); + if (event_source->event_poll_fd.fd == -1) g_error ("can't open \"/dev/windows\": %s", g_strerror (errno)); #else - event_poll_fd.fd = G_WIN32_MSG_HANDLE; + event_source->event_poll_fd.fd = G_WIN32_MSG_HANDLE; #endif - event_poll_fd.events = G_IO_IN; + event_source->event_poll_fd.events = G_IO_IN; - g_source_add_poll (source, &event_poll_fd); + g_source_add_poll (source, &event_source->event_poll_fd); g_source_set_can_recurse (source, TRUE); g_source_attach (source, NULL); } @@ -3501,19 +3510,17 @@ static gboolean gdk_event_prepare (GSource *source, gint *timeout) { - GdkDisplay *display; + GdkWin32EventSource *event_source = (GdkWin32EventSource *)source; gboolean retval; - display = gdk_display_get_default (); - gdk_threads_enter (); *timeout = -1; - if (display->event_pause_count > 0) - retval =_gdk_event_queue_find_first (display) != NULL; + if (event_source->display->event_pause_count > 0) + retval =_gdk_event_queue_find_first (event_source->display) != NULL; else - retval = (_gdk_event_queue_find_first (display) != NULL || + retval = (_gdk_event_queue_find_first (event_source->display) != NULL || (modal_win32_dialog == NULL && GetQueueStatus (QS_ALLINPUT) != 0)); @@ -3525,17 +3532,15 @@ gdk_event_prepare (GSource *source, static gboolean gdk_event_check (GSource *source) { - GdkDisplay *display; + GdkWin32EventSource *event_source = (GdkWin32EventSource *)source; gboolean retval; - display = gdk_display_get_default (); - gdk_threads_enter (); - if (display->event_pause_count > 0) - retval = _gdk_event_queue_find_first (display) != NULL; - else if (event_poll_fd.revents & G_IO_IN) - retval = (_gdk_event_queue_find_first (display) != NULL || + if (event_source->display->event_pause_count > 0) + retval = _gdk_event_queue_find_first (event_source->display) != NULL; + else if (event_source->event_poll_fd.revents & G_IO_IN) + retval = (_gdk_event_queue_find_first (event_source->display) != NULL || (modal_win32_dialog == NULL && GetQueueStatus (QS_ALLINPUT) != 0)); else @@ -3548,18 +3553,16 @@ gdk_event_check (GSource *source) static gboolean gdk_event_dispatch (GSource *source, - GSourceFunc callback, - gpointer user_data) + GSourceFunc callback, + gpointer user_data) { - GdkDisplay *display; + GdkWin32EventSource *event_source = (GdkWin32EventSource *)source; GdkEvent *event; - display = gdk_display_get_default (); - gdk_threads_enter (); - _gdk_win32_display_queue_events (display); - event = _gdk_event_unqueue (display); + _gdk_win32_display_queue_events (event_source->display); + event = _gdk_event_unqueue (event_source->display); if (event) { @@ -3569,11 +3572,11 @@ gdk_event_dispatch (GSource *source, /* Do drag & drop if it is still pending */ if (_dnd_source_state == GDK_WIN32_DND_PENDING) - { - _dnd_source_state = GDK_WIN32_DND_DRAGGING; - _gdk_win32_dnd_do_dragdrop (); - _dnd_source_state = GDK_WIN32_DND_NONE; - } + { + _dnd_source_state = GDK_WIN32_DND_DRAGGING; + _gdk_win32_dnd_do_dragdrop (); + _dnd_source_state = GDK_WIN32_DND_NONE; + } } gdk_threads_leave (); diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index b604df6262..b3f89d3ff9 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -540,6 +540,6 @@ gboolean _gdk_win32_window_lacks_wm_decorations (GdkWindow *window); /* Initialization */ void _gdk_win32_windowing_init (void); void _gdk_dnd_init (void); -void _gdk_events_init (void); +void _gdk_events_init (GdkDisplay *display); #endif /* __GDK_PRIVATE_WIN32_H__ */