GDK W32: no "GDK_SELECTION" event for clipboard
_gdk_win32_display_convert_selection() does not return anything, it generates a selection notify event instead. Depending on how successful it was, the event will have property=GDK_NONE or property="GDK_SELECTION". property="GDK_SELECTION" is the default return value for successful cases, and it tells GTK to grab the data that GDK previously deposited using selection_property_store(). The problem is that the clipboard branch of this function calls open_clipboard_timeout(), which can't return anything meaningful (it's normally a timeout function), and thus doesn't know whether the function succeeded or failed. Due to my oversight, this resulted in GDK generating two selection notification events - one from inside of open_clipboard_timeout() (with the right property, if successful), and one from the catch-all last line (always defaulting to "GDK_SELECTION"). This caused issue #2223, where GTK only expected exactly one notification per request, and got confused because it was getting two. I've looked at the code in open_clipboard_timeout(), and it seems to me that it always generates a notification (a successful one or an unsuccessful one). Thus the branch of the function that calls it directly does not need to follow up with a catch-all notification and can just return. This seems to be fixing issue #2223, at least for me, but i'm not entirely sure that this will not have any adverse side-effects. Clipboard handling in GTK3 is a complicated mess.
This commit is contained in:
@ -2251,6 +2251,7 @@ _gdk_win32_display_convert_selection (GdkDisplay *display,
|
||||
|
||||
queue_open_clipboard (GDK_WIN32_CLIPBOARD_QUEUE_ACTION_CONVERT, display, requestor, target, time);
|
||||
open_clipboard_timeout (NULL);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user