forked from AuroraMiddleware/gtk
Bug 658767 - Drag and Drop NSEvent capture is racy
Create a synthetic NSMouseLeftDown to store in the GtkQuartzDragSourceInfo rather than relying on the NSWindow's latest event being the right one (or the right kind).
This commit is contained in:
parent
4e64f6012f
commit
d08d4507c9
@ -1127,13 +1127,44 @@ gtk_drag_begin_internal (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
GtkDragSourceInfo *info;
|
GtkDragSourceInfo *info;
|
||||||
GdkDragContext *context;
|
GdkDragContext *context;
|
||||||
NSWindow *nswindow;
|
NSWindow *nswindow = get_toplevel_nswindow (widget);
|
||||||
|
NSPoint point = {0, 0};
|
||||||
|
gdouble x, y;
|
||||||
|
double time = (double)g_get_real_time ();
|
||||||
|
NSEvent *nsevent;
|
||||||
|
NSTimeInterval nstime;
|
||||||
|
|
||||||
context = gdk_drag_begin (NULL, NULL);
|
if (event)
|
||||||
|
{
|
||||||
|
if (gdk_event_get_coords (event, &x, &y))
|
||||||
|
{
|
||||||
|
point.x = x;
|
||||||
|
point.y = y;
|
||||||
|
}
|
||||||
|
time = (double)gdk_event_get_time (event);
|
||||||
|
}
|
||||||
|
nstime = [[NSDate dateWithTimeIntervalSince1970: time / 1000] timeIntervalSinceReferenceDate];
|
||||||
|
nsevent = [NSEvent mouseEventWithType: NSLeftMouseDown
|
||||||
|
location: point
|
||||||
|
modifierFlags: 0
|
||||||
|
timestamp: nstime
|
||||||
|
windowNumber: [nswindow windowNumber]
|
||||||
|
context: [nswindow graphicsContext]
|
||||||
|
eventNumber: 0
|
||||||
|
clickCount: 1
|
||||||
|
pressure: 0.0 ];
|
||||||
|
|
||||||
|
GdkWindow *window = [[nswindow contentView] gdkWindow];
|
||||||
|
g_return_val_if_fail(nsevent != NULL, NULL);
|
||||||
|
|
||||||
|
context = gdk_drag_begin (window, NULL);
|
||||||
|
g_return_val_if_fail( context != NULL, NULL);
|
||||||
context->is_source = TRUE;
|
context->is_source = TRUE;
|
||||||
|
|
||||||
info = gtk_drag_get_source_info (context, TRUE);
|
info = gtk_drag_get_source_info (context, TRUE);
|
||||||
|
info->nsevent = nsevent;
|
||||||
|
[info->nsevent retain];
|
||||||
|
|
||||||
info->source_widget = g_object_ref (widget);
|
info->source_widget = g_object_ref (widget);
|
||||||
info->widget = g_object_ref (widget);
|
info->widget = g_object_ref (widget);
|
||||||
info->target_list = target_list;
|
info->target_list = target_list;
|
||||||
@ -1200,10 +1231,6 @@ gtk_drag_begin_internal (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nswindow = get_toplevel_nswindow (widget);
|
|
||||||
info->nsevent = [nswindow currentEvent];
|
|
||||||
[info->nsevent retain];
|
|
||||||
|
|
||||||
/* drag will begin in an idle handler to avoid nested run loops */
|
/* drag will begin in an idle handler to avoid nested run loops */
|
||||||
|
|
||||||
g_idle_add_full (G_PRIORITY_HIGH_IDLE, gtk_drag_begin_idle, context, NULL);
|
g_idle_add_full (G_PRIORITY_HIGH_IDLE, gtk_drag_begin_idle, context, NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user