diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index a2ab5d8c17..414cf26e9d 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -950,6 +950,7 @@ gdk_drag_drop gdk_drag_find_window_for_screen gdk_drag_begin gdk_drag_begin_for_device +gdk_drag_begin_from_point gdk_drag_motion gdk_drop_finish GdkDragProtocol diff --git a/gdk/broadway/gdkdnd-broadway.c b/gdk/broadway/gdkdnd-broadway.c index 06dcd8f945..042a0cd65b 100644 --- a/gdk/broadway/gdkdnd-broadway.c +++ b/gdk/broadway/gdkdnd-broadway.c @@ -87,7 +87,9 @@ gdk_broadway_drag_context_finalize (GObject *object) GdkDragContext * _gdk_broadway_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets) + GList *targets, + gint x_root, + gint y_root) { GdkDragContext *new_context; diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h index 45a1c827b1..aa52ccbb33 100644 --- a/gdk/broadway/gdkprivate-broadway.h +++ b/gdk/broadway/gdkprivate-broadway.h @@ -44,7 +44,9 @@ void _gdk_broadway_resync_windows (void); void _gdk_broadway_window_register_dnd (GdkWindow *window); GdkDragContext * _gdk_broadway_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets); + GList *targets, + gint x_root, + gint y_root); void _gdk_broadway_window_translate (GdkWindow *window, cairo_region_t *area, gint dx, diff --git a/gdk/gdkdnd.h b/gdk/gdkdnd.h index bcac0a6f9f..12a817fc75 100644 --- a/gdk/gdkdnd.h +++ b/gdk/gdkdnd.h @@ -31,6 +31,7 @@ #include #include +#include G_BEGIN_DECLS @@ -143,6 +144,12 @@ GDK_AVAILABLE_IN_ALL GdkDragContext * gdk_drag_begin_for_device (GdkWindow *window, GdkDevice *device, GList *targets); +GDK_AVAILABLE_IN_3_20 +GdkDragContext * gdk_drag_begin_from_point (GdkWindow *window, + GdkDevice *device, + GList *targets, + gint x_root, + gint y_root); GDK_AVAILABLE_IN_ALL void gdk_drag_find_window_for_screen (GdkDragContext *context, diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 7e2dfb72c3..bd32ad12c7 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -11014,11 +11014,42 @@ gdk_drag_begin (GdkWindow *window, * Returns: (transfer full): a newly created #GdkDragContext */ GdkDragContext * -gdk_drag_begin_for_device (GdkWindow *window, - GdkDevice *device, - GList *targets) +gdk_drag_begin_for_device (GdkWindow *window, + GdkDevice *device, + GList *targets) { - return GDK_WINDOW_IMPL_GET_CLASS (window->impl)->drag_begin (window, device, targets); + gint x, y; + + gdk_device_get_position (device, NULL, &x, &y); + + return gdk_drag_begin_from_point (window, device, targets, x, y); +} + +/** + * gdk_drag_begin_from_point: + * @window: the source window for this drag + * @device: the device that controls this drag + * @targets: (transfer none) (element-type GdkAtom): the offered targets, + * as list of #GdkAtoms + * @x_root: the x coordinate where the drag nominally started + * @y_root: the y coordinate where the drag nominally started + * + * Starts a drag and creates a new drag context for it. + * + * This function is called by the drag source. + * + * Returns: (transfer full): a newly created #GdkDragContext + * + * Since: 3.20 + */ +GdkDragContext * +gdk_drag_begin_from_point (GdkWindow *window, + GdkDevice *device, + GList *targets, + gint x_root, + gint y_root) +{ + return GDK_WINDOW_IMPL_GET_CLASS (window->impl)->drag_begin (window, device, targets, x_root, y_root); } /** diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h index 07a307c269..f0743434fc 100644 --- a/gdk/gdkwindowimpl.h +++ b/gdk/gdkwindowimpl.h @@ -239,7 +239,9 @@ struct _GdkWindowImplClass void (* register_dnd) (GdkWindow *window); GdkDragContext * (*drag_begin) (GdkWindow *window, GdkDevice *device, - GList *targets); + GList *targets, + gint x_root, + gint y_root); void (*process_updates_recurse) (GdkWindow *window, cairo_region_t *region); diff --git a/gdk/quartz/gdkdnd-quartz.c b/gdk/quartz/gdkdnd-quartz.c index bb4a8f3b9a..0a38cd892e 100644 --- a/gdk/quartz/gdkdnd-quartz.c +++ b/gdk/quartz/gdkdnd-quartz.c @@ -35,7 +35,9 @@ gdk_quartz_drag_source_context () GdkDragContext * _gdk_quartz_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets) + GList *targets, + gint x_root, + gint y_root) { g_assert (_gdk_quartz_drag_source_context == NULL); diff --git a/gdk/quartz/gdkprivate-quartz.h b/gdk/quartz/gdkprivate-quartz.h index 5d2fcc1517..1a7410cb1d 100644 --- a/gdk/quartz/gdkprivate-quartz.h +++ b/gdk/quartz/gdkprivate-quartz.h @@ -80,7 +80,9 @@ void _gdk_quartz_synthesize_null_key_event (GdkWindow *window); void _gdk_quartz_window_register_dnd (GdkWindow *window); GdkDragContext * _gdk_quartz_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets); + GList *targets, + gint x_root, + gint y_root); /* Display */ diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c index fd0d0a3c06..36259e933a 100644 --- a/gdk/wayland/gdkdnd-wayland.c +++ b/gdk/wayland/gdkdnd-wayland.c @@ -375,7 +375,9 @@ create_dnd_window (GdkScreen *screen) GdkDragContext * _gdk_wayland_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets) + GList *targets, + gint x_root, + gint y_root) { GdkWaylandDragContext *context_wayland; GdkWaylandDisplay *display_wayland; diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index c4b5185643..0e486f839a 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -103,11 +103,12 @@ GdkDragProtocol _gdk_wayland_window_get_drag_protocol (GdkWindow *window, void _gdk_wayland_window_register_dnd (GdkWindow *window); GdkDragContext *_gdk_wayland_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets); + GList *targets, + gint x_root, + gint y_root); void _gdk_wayland_window_offset_next_wl_buffer (GdkWindow *window, int x, int y); - GdkDragContext * _gdk_wayland_drop_context_new (struct wl_data_device *data_device); void _gdk_wayland_drag_context_set_source_window (GdkDragContext *context, GdkWindow *window); diff --git a/gdk/win32/gdkdnd-win32.c b/gdk/win32/gdkdnd-win32.c index ca658ccfcd..f0a1f97869 100644 --- a/gdk/win32/gdkdnd-win32.c +++ b/gdk/win32/gdkdnd-win32.c @@ -1807,7 +1807,9 @@ gdk_drag_do_leave (GdkDragContext *context, GdkDragContext * _gdk_win32_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets) + GList *targets, + gint x_root, + gint y_root) { if (!use_ole2_dnd) { diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index a94a1885e2..f216d3816b 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -484,7 +484,7 @@ void _gdk_win32_display_create_window_impl (GdkDisplay *display, /* stray GdkWindowImplWin32 members */ void _gdk_win32_window_register_dnd (GdkWindow *window); -GdkDragContext *_gdk_win32_window_drag_begin (GdkWindow *window, GdkDevice *device, GList *targets); +GdkDragContext *_gdk_win32_window_drag_begin (GdkWindow *window, GdkDevice *device, GList *targets, gint x_root, gint y_root); gboolean _gdk_win32_window_simulate_key (GdkWindow *window, gint x, gint y, diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index d0c8757d96..02d7e33236 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -1948,7 +1948,9 @@ create_drag_window (GdkScreen *screen) GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets) + GList *targets, + gint x_root, + gint y_root) { GdkDragContext *context; diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index c2afecf46d..f35d2af21d 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -312,7 +312,9 @@ void _gdk_x11_window_register_dnd (GdkWindow *window); GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window, GdkDevice *device, - GList *targets); + GList *targets, + gint x_root, + gint y_root); gboolean _gdk_x11_get_xft_setting (GdkScreen *screen, const gchar *name,