From 05bf87cf14097880238064d47d76265d5bc1a003 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 23 May 2018 18:30:14 +0200 Subject: [PATCH] drop: Add GdkDrop:surface property This replaces gdk_drag_context_get_dest_surface(). --- gdk/gdkdrop.c | 51 ++++++++++++++++++++++++++++++++ gdk/gdkdrop.h | 2 ++ gdk/wayland/gdkdevice-wayland.c | 5 +--- gdk/wayland/gdkdnd-wayland.c | 21 +++++-------- gdk/wayland/gdkprivate-wayland.h | 7 ++--- gdk/win32/gdkdrop-win32.c | 1 + gdk/x11/gdkdnd-x11.c | 1 + 7 files changed, 66 insertions(+), 22 deletions(-) diff --git a/gdk/gdkdrop.c b/gdk/gdkdrop.c index 46ff8bc196..ad3da7a5f3 100644 --- a/gdk/gdkdrop.c +++ b/gdk/gdkdrop.c @@ -36,6 +36,7 @@ struct _GdkDropPrivate { GdkDevice *device; GdkDragContext *drag; GdkContentFormats *formats; + GdkSurface *surface; GdkDragAction actions; }; @@ -46,6 +47,7 @@ enum { PROP_DISPLAY, PROP_DRAG, PROP_FORMATS, + PROP_SURFACE, N_PROPERTIES }; @@ -118,6 +120,8 @@ gdk_drop_set_property (GObject *gobject, case PROP_DEVICE: priv->device = g_value_dup_object (value); g_assert (priv->device != NULL); + if (priv->surface) + g_assert (gdk_surface_get_display (priv->surface) == gdk_device_get_display (priv->device)); break; case PROP_DRAG: @@ -131,6 +135,15 @@ gdk_drop_set_property (GObject *gobject, #endif break; + case PROP_SURFACE: + priv->surface = g_value_dup_object (value); +#ifdef DROP_SUBCLASS + g_assert (priv->surface != NULL); + if (priv->device) + g_assert (gdk_surface_get_display (priv->surface) == gdk_device_get_display (priv->device)); +#endif + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -168,6 +181,10 @@ gdk_drop_get_property (GObject *gobject, g_value_set_boxed (value, priv->formats); break; + case PROP_SURFACE: + g_value_set_object (value, priv->surface); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); break; @@ -271,6 +288,22 @@ gdk_drop_class_init (GdkDropClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + + /** + * GdkDrop:surface: + * + * The #GdkSurface the drop happens on + */ + properties[PROP_SURFACE] = + g_param_spec_object ("surface", + "Surface", + "The surface the drop is happening on", + GDK_TYPE_SURFACE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS | + G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (object_class, N_PROPERTIES, properties); } @@ -334,6 +367,24 @@ gdk_drop_get_formats (GdkDrop *self) return priv->formats; } +/** + * gdk_drop_get_surface: + * @self: a #GdkDrop + * + * Returns the #GdkSurface performing the drop. + * + * Returns: (transfer none): The #GdkSurface performing the drop. + **/ +GdkSurface * +gdk_drop_get_surface (GdkDrop *self) +{ + GdkDropPrivate *priv = gdk_drop_get_instance_private (self); + + g_return_val_if_fail (GDK_IS_DROP (self), NULL); + + return priv->surface; +} + /** * gdk_drop_get_actions: * @self: a #GdkDrop diff --git a/gdk/gdkdrop.h b/gdk/gdkdrop.h index 6ae088932e..b25323cb77 100644 --- a/gdk/gdkdrop.h +++ b/gdk/gdkdrop.h @@ -44,6 +44,8 @@ GdkDisplay * gdk_drop_get_display (GdkDrop GDK_AVAILABLE_IN_ALL GdkDevice * gdk_drop_get_device (GdkDrop *self); GDK_AVAILABLE_IN_ALL +GdkSurface * gdk_drop_get_surface (GdkDrop *self); +GDK_AVAILABLE_IN_ALL GdkContentFormats * gdk_drop_get_formats (GdkDrop *self); GDK_AVAILABLE_IN_ALL GdkDragAction gdk_drop_get_actions (GdkDrop *self); diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index f2c623347b..08a936e739 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -1269,14 +1269,12 @@ data_device_enter (void *data, seat->pending_builder = NULL; seat->pending_offer = NULL; - seat->drop_context = _gdk_wayland_drop_context_new (device, formats, offer); + seat->drop_context = _gdk_wayland_drop_context_new (device, formats, dest_surface, offer, serial); dnd_owner = seat->foreign_dnd_surface; _gdk_wayland_drag_context_set_source_surface (seat->drop_context, dnd_owner); - _gdk_wayland_drag_context_set_dest_surface (seat->drop_context, - dest_surface, serial); _gdk_wayland_drag_context_set_coords (seat->drop_context, wl_fixed_to_double (x), wl_fixed_to_double (y)); @@ -1305,7 +1303,6 @@ data_device_leave (void *data, _gdk_wayland_drag_context_set_coords (seat->drop_context, -1, -1); _gdk_wayland_drag_context_emit_event (seat->drop_context, GDK_DRAG_LEAVE, GDK_CURRENT_TIME); - _gdk_wayland_drag_context_set_dest_surface (seat->drop_context, NULL, 0); g_clear_object (&seat->drop_context); } diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c index ea3159f64a..52ad3e3142 100644 --- a/gdk/wayland/gdkdnd-wayland.c +++ b/gdk/wayland/gdkdnd-wayland.c @@ -117,7 +117,7 @@ _gdk_wayland_drag_context_emit_event (GdkDragContext *context, if (context->is_source) surface = gdk_drag_context_get_source_surface (context); else - surface = gdk_drag_context_get_dest_surface (context); + surface = gdk_drop_get_surface (GDK_DROP (context)); event = gdk_event_new (type); event->any.surface = g_object_ref (surface); @@ -494,7 +494,10 @@ _gdk_wayland_surface_drag_begin (GdkSurface *surface, GdkDragContext * _gdk_wayland_drop_context_new (GdkDevice *device, GdkContentFormats *formats, - struct wl_data_offer *offer) + GdkSurface *surface, + struct wl_data_offer *offer, + uint32_t serial) + { GdkWaylandDragContext *context_wayland; GdkDragContext *context; @@ -502,10 +505,12 @@ _gdk_wayland_drop_context_new (GdkDevice *device, context_wayland = g_object_new (GDK_TYPE_WAYLAND_DRAG_CONTEXT, "device", device, "formats", formats, + "surface", surface, NULL); context = GDK_DRAG_CONTEXT (context_wayland); context->is_source = FALSE; context_wayland->offer = offer; + context_wayland->serial = serial; return context; } @@ -532,18 +537,6 @@ _gdk_wayland_drag_context_set_source_surface (GdkDragContext *context, context->source_surface = surface ? g_object_ref (surface) : NULL; } -void -_gdk_wayland_drag_context_set_dest_surface (GdkDragContext *context, - GdkSurface *dest_surface, - uint32_t serial) -{ - if (context->dest_surface) - g_object_unref (context->dest_surface); - - context->dest_surface = dest_surface ? g_object_ref (dest_surface) : NULL; - GDK_WAYLAND_DRAG_CONTEXT (context)->serial = serial; -} - GdkDragContext * gdk_wayland_drag_context_lookup_by_data_source (struct wl_data_source *source) { diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index e9e547a8ff..dfeca6dce4 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -106,12 +106,11 @@ void _gdk_wayland_surface_offset_next_wl_buffer (GdkSurface *surface, int y); GdkDragContext * _gdk_wayland_drop_context_new (GdkDevice *device, GdkContentFormats *formats, - struct wl_data_offer *offer); + GdkSurface *surface, + struct wl_data_offer *offer, + uint32_t serial); void _gdk_wayland_drag_context_set_source_surface (GdkDragContext *context, GdkSurface *surface); -void _gdk_wayland_drag_context_set_dest_surface (GdkDragContext *context, - GdkSurface *dest_surface, - uint32_t serial); void _gdk_wayland_drag_context_emit_event (GdkDragContext *context, GdkEventType type, guint32 time_); diff --git a/gdk/win32/gdkdrop-win32.c b/gdk/win32/gdkdrop-win32.c index e385a37ffa..391ddae94c 100644 --- a/gdk/win32/gdkdrop-win32.c +++ b/gdk/win32/gdkdrop-win32.c @@ -144,6 +144,7 @@ gdk_drop_context_new (GdkDisplay *display, context_win32 = g_object_new (GDK_TYPE_WIN32_DROP_CONTEXT, "device", gdk_seat_get_pointer (gdk_display_get_default_seat (display)), "formats", formats, + "surface", dest_surface, NULL); context = GDK_DRAG_CONTEXT (context_win32); diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 936c218e50..601de5cc6a 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -1815,6 +1815,7 @@ xdnd_enter_filter (const XEvent *xevent, context_x11 = g_object_new (GDK_TYPE_X11_DRAG_CONTEXT, "device", gdk_seat_get_pointer (seat), "formats", content_formats, + "surface", event->any.surface, NULL); context = (GdkDragContext *)context_x11; -- 2.30.2