wayland: Prepare against NULL selection owners on data_source requests
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 29 Jun 2015 14:32:01 +0000 (16:32 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 29 Jun 2015 16:39:05 +0000 (18:39 +0200)
Currently, due to the lack of progress information in the Wayland DnD
protocol, we assume a DnD operation is finished after the first
data_source.send is finished (It's either that or leaving stuck grabs).

This however breaks previous assumptions that dest widgets can request
the data multiple times, even in response to GtkWidget::drag-motion.
This leaves us with a NULL owner for the DnD atom when we aren't
finished receiving wl_data_source events yet, causing a crash.

This commit fixes the crash, the behavior left is still far from
desirable though...

gdk/wayland/gdkselection-wayland.c

index 455b0e663782c2887b3313dc8aa77abdf2e86814..640fa4e11278786b8410a689d6f7162b9a75f08e 100644 (file)
@@ -705,7 +705,7 @@ data_source_target (void                  *data,
 {
   GdkWaylandSelection *wayland_selection = data;
   GdkDragContext *context = NULL;
-  GdkWindow *window;
+  GdkWindow *window = NULL;
 
   g_debug (G_STRLOC ": %s source = %p, mime_type = %s",
            G_STRFUNC, source, mime_type);
@@ -732,7 +732,8 @@ data_source_target (void                  *data,
     }
   else if (source == wayland_selection->clipboard_source)
     window = wayland_selection->clipboard_owner;
-  else
+
+  if (!window)
     return;
 
   gdk_wayland_selection_request_target (wayland_selection, window,
@@ -771,6 +772,9 @@ data_source_send (void                  *data,
       return;
     }
 
+  if (!window)
+    return;
+
   if (!gdk_wayland_selection_request_target (wayland_selection, window,
                                              gdk_atom_intern (mime_type, FALSE),
                                              fd))