Imported Upstream version 5.0.0.42

Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2017-04-10 11:41:01 +00:00
parent 1190d13a04
commit 6bdd276d05
19939 changed files with 3099680 additions and 93811 deletions

View File

@@ -0,0 +1,75 @@
commit 33da74a9ab13bba4f46b2455cc858c7ae02bd923
Author: Cody Russell <cody@jhu.edu>
Date: Mon Mar 31 08:51:25 2014 -0500
This is an attempt to solve an issue in GtkNSView that occurs in
Xamarin Studio when we try to use an animating NSProgressIndicator.
The error only occurred if the indicator was in animating mode,
and it seems likely to be a threading race condition somewhere.
This patch does two things. I've found the issue to be reproducible
if we do one of these things but not the other, but I have not been
able to reproduce it with both of these.
First, we slightly defer the mapping of the widget.
Second, we lock the view during clip_to_parent_viewports().
https://bugzilla.xamarin.com/show_bug.cgi?id=17401
diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
index d5eb307..31c4970 100644
--- a/gtk/gtknsview.c
+++ b/gtk/gtknsview.c
@@ -280,6 +280,7 @@ clip_to_parent_viewports (GtkNSView *ns_view,
ns_view = get_associated_gtknsview (self);
+ [self lockFocusIfCanDraw];
if (ns_view)
cg_context = clip_to_parent_viewports (ns_view, self);
@@ -287,6 +288,8 @@ clip_to_parent_viewports (GtkNSView *ns_view,
if (cg_context)
CGContextRestoreGState (cg_context);
+
+ [self unlockFocus];
}
@end
@@ -566,15 +569,17 @@ gtk_ns_view_unrealize (GtkWidget *widget)
GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->unrealize (widget);
}
-static void
-gtk_ns_view_map (GtkWidget *widget)
-{
+static gboolean
+really_map (GtkWidget *widget) {
GtkNSView *ns_view = GTK_NS_VIEW (widget);
GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
GtkAllocation allocation;
NSView *parent_view;
NSWindow *window;
+ if (gtk_widget_get_mapped (widget))
+ return FALSE;
+
gtk_widget_get_allocation (widget, &allocation);
gtk_ns_view_position_view (ns_view, &allocation);
@@ -605,6 +610,14 @@ gtk_ns_view_map (GtkWidget *widget)
gtk_ns_view_swizzle_draw_rect_recursive (text, "gtkwindow", toplevel);
}
}
+
+ return FALSE;
+}
+
+static void
+gtk_ns_view_map (GtkWidget *widget)
+{
+ g_timeout_add (50, (GSourceFunc)really_map, widget);
}
static void