dnd: Pass dx/dy instead of x_root/y_root

This way, we don't need root coordinates when computing the dnd start
position.
This commit is contained in:
Benjamin Otte 2017-12-11 00:55:56 +01:00
parent a7c3c794df
commit 218efa62ef
8 changed files with 48 additions and 23 deletions

View File

@ -87,8 +87,8 @@ GdkDragContext *
_gdk_broadway_window_drag_begin (GdkWindow *window,
GdkDevice *device,
GdkContentFormats *formats,
gint x_root,
gint y_root)
gint dx,
gint dy)
{
GdkDragContext *new_context;

View File

@ -137,8 +137,8 @@ GDK_AVAILABLE_IN_ALL
GdkDragContext * gdk_drag_begin (GdkWindow *window,
GdkDevice *device,
GdkContentFormats *formats,
gint x_root,
gint y_root);
gint dx,
gint dy);
GDK_AVAILABLE_IN_ALL
gboolean gdk_drag_drop_succeeded (GdkDragContext *context);

View File

@ -6928,8 +6928,8 @@ gdk_window_register_dnd (GdkWindow *window)
* @window: the source window for this drag
* @device: the device that controls this drag
* @formats: (transfer none): the offered formats
* @x_root: the x coordinate where the drag nominally started
* @y_root: the y coordinate where the drag nominally started
* @dx: the x offset to @device's position where the drag nominally started
* @dy: the y offset to @device's position where the drag nominally started
*
* Starts a drag and creates a new drag context for it.
*

View File

@ -36,8 +36,8 @@ GdkDragContext *
_gdk_quartz_window_drag_begin (GdkWindow *window,
GdkDevice *device,
GList *targets,
gint x_root,
gint y_root)
gint dx,
gint dy)
{
g_assert (_gdk_quartz_drag_source_context == NULL);

View File

@ -586,8 +586,8 @@ GdkDragContext *
_gdk_wayland_window_drag_begin (GdkWindow *window,
GdkDevice *device,
GdkContentFormats *formats,
gint x_root,
gint y_root)
gint dx,
gint dy)
{
GdkWaylandDragContext *context_wayland;
GdkDragContext *context;

View File

@ -2011,13 +2011,14 @@ GdkDragContext *
_gdk_win32_window_drag_begin (GdkWindow *window,
GdkDevice *device,
GdkContentFormats *formats,
gint x_root,
gint y_root)
gint dx,
gint dy)
{
GdkDragContext *new_context;
GdkWin32DragContext *context_win32;
BYTE kbd_state[256];
GdkWin32Selection *sel_win32 = _gdk_win32_selection_get ();
int x_root, y_root;
if (!use_ole2_dnd)
{
@ -2050,6 +2051,10 @@ _gdk_win32_window_drag_begin (GdkWindow *window,
context_win32 = GDK_WIN32_DRAG_CONTEXT (new_context);
}
gdk_device_get_position (device, &x_root, &y_root);
x_root += dx;
y_root += dy;
context_win32->start_x = x_root;
context_win32->start_y = y_root;
context_win32->last_x = context_win32->start_x;

View File

@ -2101,10 +2101,11 @@ GdkDragContext *
_gdk_x11_window_drag_begin (GdkWindow *window,
GdkDevice *device,
GdkContentFormats *formats,
gint x_root,
gint y_root)
gint dx,
gint dy)
{
GdkDragContext *context;
int x_root, y_root;
context = (GdkDragContext *) g_object_new (GDK_TYPE_X11_DRAG_CONTEXT,
"display", gdk_window_get_display (window),
@ -2120,6 +2121,9 @@ _gdk_x11_window_drag_begin (GdkWindow *window,
context->actions = 0;
gdk_drag_context_set_device (context, device);
gdk_device_get_position (device, &x_root, &y_root);
x_root += dx;
y_root += dy;
GDK_X11_DRAG_CONTEXT (context)->start_x = x_root;
GDK_X11_DRAG_CONTEXT (context)->start_y = y_root;

View File

@ -1060,7 +1060,7 @@ gtk_drag_begin_internal (GtkWidget *widget,
GtkWidget *ipc_widget;
GdkDevice *pointer, *keyboard;
GdkWindow *ipc_window;
int start_x, start_y;
int dx, dy;
GdkAtom selection;
pointer = keyboard = NULL;
@ -1106,21 +1106,37 @@ gtk_drag_begin_internal (GtkWidget *widget,
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
gtk_widget_translate_coordinates (widget, toplevel,
x, y, &x, &y);
gdk_window_get_root_coords (gtk_widget_get_window (toplevel),
x, y, &start_x, &start_y);
gdk_window_get_device_position (gtk_widget_get_window (toplevel),
pointer,
&dx, &dy,
NULL);
dx -= x;
dy -= y;
}
else if (event && gdk_event_get_event_type (event) == GDK_MOTION_NOTIFY)
{
double x, y;
double ex, ey;
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
gdk_event_get_root_coords (event, &x, &y);
start_x = (int)x;
start_y = (int)y;
gdk_event_get_coords (event, &ex, &ey);
x = ex;
y = ey;
gtk_widget_translate_coordinates (widget, toplevel,
x, y, &x, &y);
gdk_window_get_device_position (gtk_widget_get_window (toplevel),
pointer,
&dx, &dy,
NULL);
dx -= x;
dy -= y;
}
else
gdk_device_get_position (pointer, &start_x, &start_y);
{
dx = 0;
dy = 0;
}
context = gdk_drag_begin (ipc_window, pointer, target_list, start_x, start_y);
context = gdk_drag_begin (ipc_window, pointer, target_list, dx, dy);
if (!gdk_drag_context_manage_dnd (context, ipc_window, actions))
{