[gtk+] GDK W32: Special handling for DELETE requests



commit f0d04f82f8c2835b9c062bb72fa4409328c4c9ed
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Sun Nov 26 13:06:24 2017 +0000

    GDK W32: Special handling for DELETE requests
    
    1) Ensure that any DELETE requests from the target are sent to GDK, even if
       both the source and the target are in the same process and it
       is therefore possible to use a shortcut and call the handler directly
       in GTK layer
    2) Ensure that target GDK doesn't do anything when GTK asks it to send
       a DELETE request, just report back immediately (the code up the stack
       does not check for successfullness when request is DELETE, so not giving
       it any data is OK).
    
    The source code already synthesizes a DELETE request, so that side is
    also taken care of.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=786509

 gdk/win32/gdkselection-win32.c |    9 +++++++++
 gtk/gtkselection.c             |    9 +++++++++
 2 files changed, 18 insertions(+), 0 deletions(-)
---
diff --git a/gdk/win32/gdkselection-win32.c b/gdk/win32/gdkselection-win32.c
index f53eae3..64f5a53 100644
--- a/gdk/win32/gdkselection-win32.c
+++ b/gdk/win32/gdkselection-win32.c
@@ -2168,6 +2168,15 @@ convert_dnd_selection_to_target (GdkAtom    target,
   fmt.lindex = -1;
   fmt.tymed = TYMED_HGLOBAL;
 
+  /* We rely on GTK+ applications to synthesize the DELETE request
+   * for themselves, since they do know whether a DnD operation was a
+   * move and whether was successful. Therefore, we do not need to
+   * actually send anything here. Just report back without storing
+   * any data.
+   */
+  if (target == _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_DELETE))
+    return result;
+
   for (format = 0, with_transmute = 0; format == 0 && with_transmute < 2; with_transmute++)
     {
       for (i = 0;
diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c
index 53603c6..b848485 100644
--- a/gtk/gtkselection.c
+++ b/gtk/gtkselection.c
@@ -830,6 +830,15 @@ gtk_selection_convert (GtkWidget *widget,
   display = gtk_widget_get_display (widget);
   owner_window = gdk_selection_owner_get_for_display (display, selection);
   
+#ifdef GDK_WINDOWING_WIN32
+  /* Special handling for DELETE requests,
+   * make sure this goes down into GDK layer.
+   */
+  if (GDK_IS_WIN32_DISPLAY (display) &&
+      target == gdk_atom_intern_static_string ("DELETE"))
+    owner_window = NULL;
+#endif
+
   if (owner_window != NULL)
     {
       GtkWidget *owner_widget;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]