[gtk+/gtk-3-22] wayland: emit GDK_SELECTION_CLEAR on owner changes



commit 8af29e375643fef3f2ba4aa8368050afd86a018e
Author: Christophe Fergeau <cfergeau redhat com>
Date:   Tue Nov 28 17:44:06 2017 +0100

    wayland: emit GDK_SELECTION_CLEAR on owner changes
    
    The wayland backend currently never emits GDK_SELECTION_CLEAR events.
    GtkClipboard uses this signal in order to clear the clipboard owner when
    the selection is set to something outside the application.
    This commit ensures the wayland backend emits GDK_SELECTION_CLEAR before
    setting the clipboard owner to NULL, as this means we lost the
    selection.
    
    Signed-off-by: Christophe Fergeau <cfergeau redhat com>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=790031

 gdk/wayland/gdkselection-wayland.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c
index 0012feb..88ae24d 100644
--- a/gdk/wayland/gdkselection-wayland.c
+++ b/gdk/wayland/gdkselection-wayland.c
@@ -113,6 +113,7 @@ struct _GdkWaylandSelection
 
 static void selection_buffer_read (SelectionBuffer *buffer);
 static void async_write_data_write (AsyncWriteData *write_data);
+static void emit_selection_clear (GdkDisplay *display, GdkAtom selection);
 
 static void
 selection_buffer_notify (SelectionBuffer *buffer)
@@ -921,6 +922,7 @@ data_source_cancelled (void                  *data,
   if (context)
     gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_ERROR);
 
+  emit_selection_clear (display, atom);
   gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE);
   gdk_wayland_selection_unset_data_source (display, atom);
 }
@@ -1031,6 +1033,7 @@ primary_source_cancelled (void                                *data,
   display = gdk_display_get_default ();
 
   atom = atoms[ATOM_PRIMARY];
+  emit_selection_clear (display, atom);
   gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE);
   gdk_wayland_selection_unset_data_source (display, atom);
 }
@@ -1272,6 +1275,27 @@ emit_empty_selection_notify (GdkWindow *requestor,
   gdk_event_free (event);
 }
 
+static void
+emit_selection_clear (GdkDisplay *display,
+                      GdkAtom     selection)
+{
+  GdkEvent *event;
+  GdkWindow *window;
+
+  event = gdk_event_new (GDK_SELECTION_CLEAR);
+  event->selection.selection = selection;
+  event->selection.time = GDK_CURRENT_TIME;
+
+  window = _gdk_wayland_display_get_selection_owner (display, selection);
+  if (window != NULL) {
+    event->selection.window = g_object_ref (window);
+    event->selection.requestor = g_object_ref (window);
+  }
+
+  gdk_event_put (event);
+  gdk_event_free (event);
+}
+
 void
 _gdk_wayland_display_convert_selection (GdkDisplay *display,
                                         GdkWindow  *requestor,


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