gdk/dnd: Don't use default display when getting cursor
Always associate a drag context with a GdkDisplay and use that when getting a cursor for a given action. If we don't do this, dragging on a window that doesn't use the default display will make us use cursors from the wrong display. https://bugzilla.gnome.org/show_bug.cgi?id=765565
This commit is contained in:
parent
f27dd21426
commit
1a4f000f3b
@ -98,6 +98,7 @@ _gdk_broadway_window_drag_begin (GdkWindow *window,
|
|||||||
|
|
||||||
new_context = g_object_new (GDK_TYPE_BROADWAY_DRAG_CONTEXT,
|
new_context = g_object_new (GDK_TYPE_BROADWAY_DRAG_CONTEXT,
|
||||||
NULL);
|
NULL);
|
||||||
|
new_context->display = gdk_window_get_display (window);
|
||||||
|
|
||||||
return new_context;
|
return new_context;
|
||||||
}
|
}
|
||||||
|
@ -753,7 +753,8 @@ gdk_drag_context_handle_source_event (GdkEvent *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
GdkCursor *
|
GdkCursor *
|
||||||
gdk_drag_get_cursor (GdkDragAction action)
|
gdk_drag_get_cursor (GdkDragContext *context,
|
||||||
|
GdkDragAction action)
|
||||||
{
|
{
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
@ -762,7 +763,7 @@ gdk_drag_get_cursor (GdkDragAction action)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (drag_cursors[i].cursor == NULL)
|
if (drag_cursors[i].cursor == NULL)
|
||||||
drag_cursors[i].cursor = gdk_cursor_new_from_name (gdk_display_get_default (),
|
drag_cursors[i].cursor = gdk_cursor_new_from_name (context->display,
|
||||||
drag_cursors[i].name);
|
drag_cursors[i].name);
|
||||||
return drag_cursors[i].cursor;
|
return drag_cursors[i].cursor;
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,8 @@ struct _GdkDragContext {
|
|||||||
/*< private >*/
|
/*< private >*/
|
||||||
GdkDragProtocol protocol;
|
GdkDragProtocol protocol;
|
||||||
|
|
||||||
|
GdkDisplay *display;
|
||||||
|
|
||||||
gboolean is_source;
|
gboolean is_source;
|
||||||
GdkWindow *source_window;
|
GdkWindow *source_window;
|
||||||
GdkWindow *dest_window;
|
GdkWindow *dest_window;
|
||||||
@ -119,7 +121,8 @@ void gdk_drag_context_cancel (GdkDragContext *context,
|
|||||||
GdkDragCancelReason reason);
|
GdkDragCancelReason reason);
|
||||||
gboolean gdk_drag_context_handle_source_event (GdkEvent *event);
|
gboolean gdk_drag_context_handle_source_event (GdkEvent *event);
|
||||||
gboolean gdk_drag_context_handle_dest_event (GdkEvent *event);
|
gboolean gdk_drag_context_handle_dest_event (GdkEvent *event);
|
||||||
GdkCursor * gdk_drag_get_cursor (GdkDragAction action);
|
GdkCursor * gdk_drag_get_cursor (GdkDragContext *context,
|
||||||
|
GdkDragAction action);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -587,6 +587,8 @@ update_context_from_dragging_info (id <NSDraggingInfo> sender)
|
|||||||
|
|
||||||
window = [[self contentView] gdkWindow];
|
window = [[self contentView] gdkWindow];
|
||||||
|
|
||||||
|
current_context->display = gdk_window_get_display (window);
|
||||||
|
|
||||||
device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
|
device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
|
||||||
gdk_drag_context_set_device (current_context,
|
gdk_drag_context_set_device (current_context,
|
||||||
gdk_device_manager_get_client_pointer (device_manager));
|
gdk_device_manager_get_client_pointer (device_manager));
|
||||||
|
@ -44,6 +44,7 @@ _gdk_quartz_window_drag_begin (GdkWindow *window,
|
|||||||
/* Create fake context */
|
/* Create fake context */
|
||||||
_gdk_quartz_drag_source_context = g_object_new (GDK_TYPE_QUARTZ_DRAG_CONTEXT,
|
_gdk_quartz_drag_source_context = g_object_new (GDK_TYPE_QUARTZ_DRAG_CONTEXT,
|
||||||
NULL);
|
NULL);
|
||||||
|
_gdk_quartz_drag_source_context->display = gdk_window_get_display (window);
|
||||||
_gdk_quartz_drag_source_context->is_source = TRUE;
|
_gdk_quartz_drag_source_context->is_source = TRUE;
|
||||||
|
|
||||||
_gdk_quartz_drag_source_context->source_window = window;
|
_gdk_quartz_drag_source_context->source_window = window;
|
||||||
|
@ -3988,7 +3988,8 @@ _gdk_wayland_device_manager_add_seat (GdkDeviceManager *device_manager,
|
|||||||
seat->data_device =
|
seat->data_device =
|
||||||
wl_data_device_manager_get_data_device (display_wayland->data_device_manager,
|
wl_data_device_manager_get_data_device (display_wayland->data_device_manager,
|
||||||
seat->wl_seat);
|
seat->wl_seat);
|
||||||
seat->drop_context = _gdk_wayland_drop_context_new (seat->data_device);
|
seat->drop_context = _gdk_wayland_drop_context_new (display,
|
||||||
|
seat->data_device);
|
||||||
wl_data_device_add_listener (seat->data_device,
|
wl_data_device_add_listener (seat->data_device,
|
||||||
&data_device_listener, seat);
|
&data_device_listener, seat);
|
||||||
|
|
||||||
|
@ -427,7 +427,7 @@ gdk_wayland_drag_context_action_changed (GdkDragContext *context,
|
|||||||
{
|
{
|
||||||
GdkCursor *cursor;
|
GdkCursor *cursor;
|
||||||
|
|
||||||
cursor = gdk_drag_get_cursor (action);
|
cursor = gdk_drag_get_cursor (context, action);
|
||||||
gdk_drag_context_set_cursor (context, cursor);
|
gdk_drag_context_set_cursor (context, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,6 +528,7 @@ _gdk_wayland_window_drag_begin (GdkWindow *window,
|
|||||||
|
|
||||||
context_wayland = g_object_new (GDK_TYPE_WAYLAND_DRAG_CONTEXT, NULL);
|
context_wayland = g_object_new (GDK_TYPE_WAYLAND_DRAG_CONTEXT, NULL);
|
||||||
context = GDK_DRAG_CONTEXT (context_wayland);
|
context = GDK_DRAG_CONTEXT (context_wayland);
|
||||||
|
context->display = gdk_window_get_display (window);
|
||||||
context->source_window = g_object_ref (window);
|
context->source_window = g_object_ref (window);
|
||||||
context->is_source = TRUE;
|
context->is_source = TRUE;
|
||||||
context->targets = g_list_copy (targets);
|
context->targets = g_list_copy (targets);
|
||||||
@ -552,13 +553,15 @@ _gdk_wayland_window_drag_begin (GdkWindow *window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
GdkDragContext *
|
GdkDragContext *
|
||||||
_gdk_wayland_drop_context_new (struct wl_data_device *data_device)
|
_gdk_wayland_drop_context_new (GdkDisplay *display,
|
||||||
|
struct wl_data_device *data_device)
|
||||||
{
|
{
|
||||||
GdkWaylandDragContext *context_wayland;
|
GdkWaylandDragContext *context_wayland;
|
||||||
GdkDragContext *context;
|
GdkDragContext *context;
|
||||||
|
|
||||||
context_wayland = g_object_new (GDK_TYPE_WAYLAND_DRAG_CONTEXT, NULL);
|
context_wayland = g_object_new (GDK_TYPE_WAYLAND_DRAG_CONTEXT, NULL);
|
||||||
context = GDK_DRAG_CONTEXT (context_wayland);
|
context = GDK_DRAG_CONTEXT (context_wayland);
|
||||||
|
context->display = display;
|
||||||
context->is_source = FALSE;
|
context->is_source = FALSE;
|
||||||
|
|
||||||
return context;
|
return context;
|
||||||
|
@ -109,7 +109,8 @@ GdkDragContext *_gdk_wayland_window_drag_begin (GdkWindow *window,
|
|||||||
void _gdk_wayland_window_offset_next_wl_buffer (GdkWindow *window,
|
void _gdk_wayland_window_offset_next_wl_buffer (GdkWindow *window,
|
||||||
int x,
|
int x,
|
||||||
int y);
|
int y);
|
||||||
GdkDragContext * _gdk_wayland_drop_context_new (struct wl_data_device *data_device);
|
GdkDragContext * _gdk_wayland_drop_context_new (GdkDisplay *display,
|
||||||
|
struct wl_data_device *data_device);
|
||||||
void _gdk_wayland_drag_context_set_source_window (GdkDragContext *context,
|
void _gdk_wayland_drag_context_set_source_window (GdkDragContext *context,
|
||||||
GdkWindow *window);
|
GdkWindow *window);
|
||||||
void _gdk_wayland_drag_context_set_dest_window (GdkDragContext *context,
|
void _gdk_wayland_drag_context_set_dest_window (GdkDragContext *context,
|
||||||
|
@ -182,6 +182,7 @@ gdk_drag_context_new (GdkDisplay *display)
|
|||||||
|
|
||||||
context_win32 = g_object_new (GDK_TYPE_WIN32_DRAG_CONTEXT, NULL);
|
context_win32 = g_object_new (GDK_TYPE_WIN32_DRAG_CONTEXT, NULL);
|
||||||
context = GDK_DRAG_CONTEXT(context_win32);
|
context = GDK_DRAG_CONTEXT(context_win32);
|
||||||
|
context->display = display;
|
||||||
|
|
||||||
gdk_drag_context_set_device (context, gdk_seat_get_pointer (gdk_display_get_default_seat (display)));
|
gdk_drag_context_set_device (context, gdk_seat_get_pointer (gdk_display_get_default_seat (display)));
|
||||||
|
|
||||||
|
@ -1705,6 +1705,7 @@ xdnd_enter_filter (GdkXEvent *xev,
|
|||||||
context_x11 = (GdkX11DragContext *)g_object_new (GDK_TYPE_X11_DRAG_CONTEXT, NULL);
|
context_x11 = (GdkX11DragContext *)g_object_new (GDK_TYPE_X11_DRAG_CONTEXT, NULL);
|
||||||
context = (GdkDragContext *)context_x11;
|
context = (GdkDragContext *)context_x11;
|
||||||
|
|
||||||
|
context->display = display;
|
||||||
context->protocol = GDK_DRAG_PROTO_XDND;
|
context->protocol = GDK_DRAG_PROTO_XDND;
|
||||||
context_x11->version = version;
|
context_x11->version = version;
|
||||||
|
|
||||||
@ -2020,6 +2021,7 @@ _gdk_x11_window_drag_begin (GdkWindow *window,
|
|||||||
|
|
||||||
context = (GdkDragContext *) g_object_new (GDK_TYPE_X11_DRAG_CONTEXT, NULL);
|
context = (GdkDragContext *) g_object_new (GDK_TYPE_X11_DRAG_CONTEXT, NULL);
|
||||||
|
|
||||||
|
context->display = gdk_window_get_display (window);
|
||||||
context->is_source = TRUE;
|
context->is_source = TRUE;
|
||||||
context->source_window = window;
|
context->source_window = window;
|
||||||
g_object_ref (window);
|
g_object_ref (window);
|
||||||
@ -3132,6 +3134,6 @@ gdk_x11_drag_context_action_changed (GdkDragContext *context,
|
|||||||
{
|
{
|
||||||
GdkCursor *cursor;
|
GdkCursor *cursor;
|
||||||
|
|
||||||
cursor = gdk_drag_get_cursor (action);
|
cursor = gdk_drag_get_cursor (context, action);
|
||||||
gdk_drag_context_set_cursor (context, cursor);
|
gdk_drag_context_set_cursor (context, cursor);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user