From 5d0bfdd840ce4be70f09625f35233b377de228d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Mon, 18 Sep 2017 16:49:11 +0000 Subject: [PATCH] GDK W32: Ensure that selection request is processed To do that, run the message loop for one second or until the side-effect of running the selection request handler is achieved (as opposed to running it until the event is no longer queued). The disavantage of this method is that if the event handling is somehow missed (due to a variety of reasons - after all, it's not a straight path from an event being queued to property_change() being called), this will loop for one second. Since we do process events during that time, this will not hang the application, but might still restrict some of the functionality. https://bugzilla.gnome.org/show_bug.cgi?id=786509 --- gdk/win32/gdkdnd-win32.c | 9 ++++++--- gdk/win32/gdkselection-win32.c | 3 +++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c index daba91e888..ab10892ff9 100644 --- a/gdk/win32/gdkdnd-win32.c +++ b/gdk/win32/gdkdnd-win32.c @@ -1042,6 +1042,7 @@ idataobject_getdata (LPDATAOBJECT This, GdkEvent e; gint i; GdkAtom target; + gint64 loopend; GDK_NOTE (DND, g_print ("idataobject_getdata %p %s ", This, _gdk_win32_cf_to_string (pFormatEtc->cfFormat))); @@ -1105,10 +1106,12 @@ idataobject_getdata (LPDATAOBJECT This, gdk_event_put (&e); - process_pending_events (gdk_device_get_display (gdk_drag_context_get_device (ctx->context))); + /* Don't hold up longer than one second */ + loopend = g_get_monotonic_time () + 1000000000; - win32_sel->property_change_format = 0; - win32_sel->property_change_data = 0; + while (win32_sel->property_change_data != 0 && + g_get_monotonic_time () < loopend) + process_pending_events (gdk_device_get_display (gdk_drag_context_get_device (ctx->context))); if (pMedium->hGlobal == NULL) { GDK_NOTE (DND, g_print (" E_UNEXPECTED\n")); diff --git a/gdk/win32/gdkselection-win32.c b/gdk/win32/gdkselection-win32.c index a164bb9020..879b90d0b9 100644 --- a/gdk/win32/gdkselection-win32.c +++ b/gdk/win32/gdkselection-win32.c @@ -2393,6 +2393,9 @@ _gdk_win32_selection_property_change (GdkWin32Selection *win32_sel, g_free (set_data); } + + win32_sel->property_change_format = 0; + win32_sel->property_change_data = 0; } else {