linux-packaging-mono/external/bockbuild/packages/patches/gtk/gtknsview-defer-map-and-lock-in-clipping.patch
Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

76 lines
2.1 KiB
Diff

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