[gtk+] wayland: Don't use the default display



commit c40ba85ace2869f770d1b48552c9f134065f4e03
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Oct 27 21:44:48 2014 -0700

    wayland: Don't use the default display
    
    Pass a display in so that multi-display technology works.

 gdk/wayland/gdkdevice-wayland.c    |   13 ++++++++-----
 gdk/wayland/gdkdnd-wayland.c       |   25 ++++++++++++++-----------
 gdk/wayland/gdkprivate-wayland.h   |    9 +++++----
 gdk/wayland/gdkselection-wayland.c |   34 ++++++++++++++++------------------
 gdk/wayland/gdkwaylandselection.h  |    2 +-
 gtk/gtkselection.c                 |    2 +-
 6 files changed, 45 insertions(+), 40 deletions(-)
---
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index bc52fb1..6716c01 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -543,7 +543,8 @@ data_device_data_offer (void                  *data,
                         struct wl_data_device *data_device,
                         struct wl_data_offer  *_offer)
 {
-  gdk_wayland_selection_set_offer (_offer);
+  GdkWaylandDeviceData *device = (GdkWaylandDeviceData *)data;
+  gdk_wayland_selection_set_offer (device->display, _offer);
 }
 
 static void
@@ -573,7 +574,7 @@ data_device_enter (void                  *data,
 
   gdk_wayland_drop_context_update_targets (device->drop_context);
 
-  dnd_owner = gdk_selection_owner_get (gdk_drag_get_selection (device->drop_context));
+  dnd_owner = gdk_selection_owner_get_for_display (device->display, gdk_drag_get_selection 
(device->drop_context));
 
   if (dnd_owner)
     _gdk_wayland_drag_context_set_source_window (device->drop_context, dnd_owner);
@@ -585,7 +586,7 @@ data_device_enter (void                  *data,
                                         wl_fixed_to_double (y));
   _gdk_wayland_drag_context_emit_event (device->drop_context, GDK_DRAG_ENTER,
                                         GDK_CURRENT_TIME);
-  gdk_wayland_selection_set_offer (offer);
+  gdk_wayland_selection_set_offer (device->display, offer);
 }
 
 static void
@@ -645,7 +646,7 @@ data_device_drop (void                  *data,
   g_debug (G_STRLOC ": %s data_device = %p",
            G_STRFUNC, data_device);
 
-  local_dnd_owner = gdk_selection_owner_get (gdk_drag_get_selection (device->drop_context));
+  local_dnd_owner = gdk_selection_owner_get_for_display (device->display, gdk_drag_get_selection 
(device->drop_context));
 
   if (local_dnd_owner)
     {
@@ -664,10 +665,12 @@ data_device_selection (void                  *data,
                        struct wl_data_device *wl_data_device,
                        struct wl_data_offer  *offer)
 {
+  GdkWaylandDeviceData *device = (GdkWaylandDeviceData *) data;
+
   g_debug (G_STRLOC ": %s wl_data_device = %p wl_data_offer = %p",
            G_STRFUNC, wl_data_device, offer);
 
-  gdk_wayland_selection_set_offer (offer);
+  gdk_wayland_selection_set_offer (device->display, offer);
 }
 
 static const struct wl_data_device_listener data_device_listener = {
diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c
index e04e1ce..141434d 100644
--- a/gdk/wayland/gdkdnd-wayland.c
+++ b/gdk/wayland/gdkdnd-wayland.c
@@ -65,12 +65,13 @@ gdk_wayland_drag_context_finalize (GObject *object)
 {
   GdkWaylandDragContext *wayland_context = GDK_WAYLAND_DRAG_CONTEXT (object);
   GdkDragContext *context = GDK_DRAG_CONTEXT (object);
+  GdkDisplay *display = gdk_window_get_display (context->source_window);
 
   contexts = g_list_remove (contexts, context);
 
   if (context->is_source &&
-      gdk_selection_owner_get (gdk_drag_get_selection (context)) == context->source_window)
-    gdk_wayland_selection_unset_data_source (gdk_drag_get_selection (context));
+      gdk_selection_owner_get_for_display (display, gdk_drag_get_selection (context)) == 
context->source_window)
+    gdk_wayland_selection_unset_data_source (display, gdk_drag_get_selection (context));
 
   if (wayland_context->data_source)
     wl_data_source_destroy (wayland_context->data_source);
@@ -191,10 +192,12 @@ gdk_wayland_drop_context_set_status (GdkDragContext *context,
                                      gboolean        accepted)
 {
   GdkWaylandDragContext *context_wayland;
+  GdkDisplay *display;
   struct wl_data_offer *wl_offer;
 
   context_wayland = GDK_WAYLAND_DRAG_CONTEXT (context);
-  wl_offer = gdk_wayland_selection_get_offer ();
+  display = gdk_window_get_display (context->source_window);
+  wl_offer = gdk_wayland_selection_get_offer (display);
 
   if (!wl_offer)
     return;
@@ -241,8 +244,10 @@ gdk_wayland_drag_context_drop_finish (GdkDragContext *context,
                                      gboolean        success,
                                      guint32         time)
 {
-  if (gdk_selection_owner_get (gdk_drag_get_selection (context)))
-    gdk_wayland_selection_unset_data_source (gdk_drag_get_selection (context));
+  GdkDisplay *display = gdk_window_get_display (context->source_window);
+
+  if (gdk_selection_owner_get_for_display (display, gdk_drag_get_selection (context)))
+    gdk_wayland_selection_unset_data_source (display, gdk_drag_get_selection (context));
 }
 
 static gboolean
@@ -301,14 +306,11 @@ _gdk_wayland_window_register_dnd (GdkWindow *window)
 }
 
 static GdkWindow *
-create_dnd_window (void)
+create_dnd_window (GdkScreen *screen)
 {
   GdkWindowAttr attrs;
-  GdkScreen *screen;
   guint mask;
 
-  screen = gdk_display_get_default_screen (gdk_display_get_default ());
-
   attrs.x = attrs.y = 0;
   attrs.width = attrs.height = 100;
   attrs.wclass = GDK_INPUT_OUTPUT;
@@ -343,7 +345,7 @@ _gdk_wayland_window_drag_begin (GdkWindow *window,
   gdk_drag_context_set_device (context, device);
   display_wayland = GDK_WAYLAND_DISPLAY (gdk_device_get_display (device));
 
-  context_wayland->dnd_window = create_dnd_window ();
+  context_wayland->dnd_window = create_dnd_window (gdk_window_get_screen (window));
   context_wayland->dnd_surface = gdk_wayland_window_get_wl_surface (context_wayland->dnd_window);
   context_wayland->data_source =
     gdk_wayland_selection_get_data_source (window,
@@ -380,8 +382,9 @@ _gdk_wayland_drop_context_new (GdkDevice             *device,
 void
 gdk_wayland_drop_context_update_targets (GdkDragContext *context)
 {
+  GdkDisplay *display = gdk_window_get_display (context->source_window);
   g_list_free (context->targets);
-  context->targets = g_list_copy (gdk_wayland_selection_get_targets ());
+  context->targets = g_list_copy (gdk_wayland_selection_get_targets (display));
 }
 
 void
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 4f6f15b..adfff19 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -224,9 +224,10 @@ GdkWaylandSelection * gdk_wayland_display_get_selection (GdkDisplay *display);
 GdkWaylandSelection * gdk_wayland_selection_new (void);
 void gdk_wayland_selection_free (GdkWaylandSelection *selection);
 
-void gdk_wayland_selection_set_offer (struct wl_data_offer *offer);
-struct wl_data_offer * gdk_wayland_selection_get_offer (void);
-GList * gdk_wayland_selection_get_targets (void);
+void gdk_wayland_selection_set_offer (GdkDisplay           *display,
+                                      struct wl_data_offer *wl_offer);
+struct wl_data_offer * gdk_wayland_selection_get_offer (GdkDisplay *display);
+GList * gdk_wayland_selection_get_targets (GdkDisplay *display);
 
 void     gdk_wayland_selection_store   (GdkWindow    *window,
                                         GdkAtom       type,
@@ -235,7 +236,7 @@ void     gdk_wayland_selection_store   (GdkWindow    *window,
                                         gint          len);
 struct wl_data_source * gdk_wayland_selection_get_data_source (GdkWindow *owner,
                                                                GdkAtom    selection);
-void gdk_wayland_selection_unset_data_source (GdkAtom selection);
+void gdk_wayland_selection_unset_data_source (GdkDisplay *display, GdkAtom selection);
 
 EGLSurface gdk_wayland_window_get_egl_surface (GdkWindow *window,
                                                EGLConfig config);
diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c
index 52d8535..6fdec8f 100644
--- a/gdk/wayland/gdkselection-wayland.c
+++ b/gdk/wayland/gdkselection-wayland.c
@@ -26,6 +26,7 @@
 #include "gdkwayland.h"
 #include "gdkprivate-wayland.h"
 #include "gdkdisplay-wayland.h"
+#include "gdkdndprivate.h"
 #include "gdkselection.h"
 #include "gdkproperty.h"
 #include "gdkprivate.h"
@@ -320,9 +321,9 @@ static const struct wl_data_offer_listener data_offer_listener = {
 };
 
 void
-gdk_wayland_selection_set_offer (struct wl_data_offer *wl_offer)
+gdk_wayland_selection_set_offer (GdkDisplay           *display,
+                                 struct wl_data_offer *wl_offer)
 {
-  GdkDisplay *display = gdk_display_get_default ();
   GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display);
 
   if (selection->offer == wl_offer)
@@ -345,18 +346,16 @@ gdk_wayland_selection_set_offer (struct wl_data_offer *wl_offer)
 }
 
 struct wl_data_offer *
-gdk_wayland_selection_get_offer (void)
+gdk_wayland_selection_get_offer (GdkDisplay *display)
 {
-  GdkDisplay *display = gdk_display_get_default ();
   GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display);
 
   return selection->offer;
 }
 
 GList *
-gdk_wayland_selection_get_targets (void)
+gdk_wayland_selection_get_targets (GdkDisplay *display)
 {
-  GdkDisplay *display = gdk_display_get_default ();
   GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display);
 
   return selection->targets;
@@ -476,7 +475,7 @@ gdk_wayland_selection_store (GdkWindow    *window,
                              const guchar *data,
                              gint          len)
 {
-  GdkDisplay *display = gdk_display_get_default ();
+  GdkDisplay *display = gdk_window_get_display (window);
   GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display);
   GArray *array;
 
@@ -526,7 +525,7 @@ gdk_wayland_selection_store (GdkWindow    *window,
 static SelectionBuffer *
 gdk_wayland_selection_lookup_requestor_buffer (GdkWindow *requestor)
 {
-  GdkDisplay *display = gdk_display_get_default ();
+  GdkDisplay *display = gdk_window_get_display (requestor);
   GdkWaylandSelection *selection = gdk_wayland_display_get_selection (display);
   SelectionBuffer *buffer_data;
   GHashTableIter iter;
@@ -662,16 +661,18 @@ data_source_cancelled (void                  *data,
 {
   GdkWaylandSelection *wayland_selection = data;
   GdkDragContext *context;
+  GdkDisplay *display;
 
   g_debug (G_STRLOC ": %s source = %p",
            G_STRFUNC, source);
 
   context = gdk_wayland_drag_context_lookup_by_data_source (source);
+  display = gdk_window_get_display (context->source_window);
 
   if (source == wayland_selection->dnd_source)
-    gdk_wayland_selection_unset_data_source (atoms[ATOM_DND]);
+    gdk_wayland_selection_unset_data_source (display, atoms[ATOM_DND]);
   else if (source == wayland_selection->clipboard_source)
-    gdk_wayland_selection_unset_data_source (atoms[ATOM_CLIPBOARD]);
+    gdk_wayland_selection_unset_data_source (display, atoms[ATOM_CLIPBOARD]);
 
   if (context)
     gdk_wayland_drag_context_undo_grab (context);
@@ -687,7 +688,7 @@ struct wl_data_source *
 gdk_wayland_selection_get_data_source (GdkWindow *owner,
                                        GdkAtom    selection)
 {
-  GdkDisplay *display = gdk_display_get_default ();
+  GdkDisplay *display = gdk_window_get_display (owner);
   GdkWaylandSelection *wayland_selection = gdk_wayland_display_get_selection (display);
   struct wl_data_source *source = NULL;
   GdkWaylandDisplay *display_wayland;
@@ -741,18 +742,15 @@ gdk_wayland_selection_get_data_source (GdkWindow *owner,
 }
 
 void
-gdk_wayland_selection_unset_data_source (GdkAtom selection)
+gdk_wayland_selection_unset_data_source (GdkDisplay *display, GdkAtom selection)
 {
-  GdkDisplay *display = gdk_display_get_default ();
   GdkWaylandSelection *wayland_selection = gdk_wayland_display_get_selection (display);
 
   if (selection == atoms[ATOM_CLIPBOARD])
     {
       GdkDeviceManager *device_manager;
-      GdkDisplay *display;
       GdkDevice *device;
 
-      display = gdk_display_get_default ();
       device_manager = gdk_display_get_device_manager (display);
       device = gdk_device_manager_get_client_pointer (device_manager);
 
@@ -1023,7 +1021,7 @@ gdk_wayland_selection_add_targets (GdkWindow *window,
       GdkDisplay *display;
       GdkDevice *device;
 
-      display = gdk_display_get_default ();
+      display = gdk_window_get_display (window);
       device_manager = gdk_display_get_device_manager (display);
       device = gdk_device_manager_get_client_pointer (device_manager);
       gdk_wayland_device_set_selection (device, data_source);
@@ -1031,7 +1029,7 @@ gdk_wayland_selection_add_targets (GdkWindow *window,
 }
 
 void
-gdk_wayland_selection_clear_targets (GdkAtom selection)
+gdk_wayland_selection_clear_targets (GdkDisplay *display, GdkAtom selection)
 {
-  gdk_wayland_selection_unset_data_source (selection);
+  gdk_wayland_selection_unset_data_source (display, selection);
 }
diff --git a/gdk/wayland/gdkwaylandselection.h b/gdk/wayland/gdkwaylandselection.h
index a9d42cc..bc58102 100644
--- a/gdk/wayland/gdkwaylandselection.h
+++ b/gdk/wayland/gdkwaylandselection.h
@@ -45,7 +45,7 @@ gdk_wayland_selection_add_targets (GdkWindow *window,
 #define gdk_wayland_selection_clear_targets gdk_wayland_selection_clear_targets_libgtk_only
 GDK_AVAILABLE_IN_ALL
 void
-gdk_wayland_selection_clear_targets (GdkAtom selection);
+gdk_wayland_selection_clear_targets (GdkDisplay *display, GdkAtom selection);
 
 #define gdk_wayland_drag_context_get_dnd_window gdk_wayland_drag_context_get_dnd_window_libgtk_only
 GDK_AVAILABLE_IN_ALL
diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c
index 2adba2e..9ad905b 100644
--- a/gtk/gtkselection.c
+++ b/gtk/gtkselection.c
@@ -885,7 +885,7 @@ gtk_selection_clear_targets (GtkWidget *widget,
 
 #ifdef GDK_WINDOWING_WAYLAND
   if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
-    gdk_wayland_selection_clear_targets (selection);
+    gdk_wayland_selection_clear_targets (gtk_widget_get_display (widget), selection);
 #endif
 
   lists = g_object_get_data (G_OBJECT (widget), gtk_selection_handler_key);


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