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;
|
||||
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;
|
||||
|
||||
info = gtk_drag_get_source_info (context, TRUE);
|
||||
|
||||
info->nsevent = nsevent;
|
||||
[info->nsevent retain];
|
||||
|
||||
info->source_widget = g_object_ref (widget);
|
||||
info->widget = g_object_ref (widget);
|
||||
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 */
|
||||
|
||||
g_idle_add_full (G_PRIORITY_HIGH_IDLE, gtk_drag_begin_idle, context, NULL);
|
||||
|
Loading…
Reference in New Issue
Block a user