From 20bf51d57fecdc6783aa3edee50a657243aa872a Mon Sep 17 00:00:00 2001
From: Michael Natterer <mitch@gimp.org>
Date: Fri, 15 Mar 2013 16:56:59 +0100
Subject: [PATCH 48/68] gtk: also clip the NSView's subviews

---
 gtk/gtknsview.c |   29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
index b58a2c8..e2d8f96 100644
--- a/gtk/gtknsview.c
+++ b/gtk/gtknsview.c
@@ -225,10 +225,14 @@ gtk_ns_view_init (GtkNSView *ns_view)
 @end

 static void
-gtk_ns_view_swizzle_draw_rect (NSView *view)
+gtk_ns_view_swizzle_draw_rect_recursive (NSView      *view,
+                                         const gchar *associated_key,
+                                         gpointer     associated_object)
 {
   Method original_drawRect;
   Method my_drawRect;
+  NSArray *subviews;
+  gint i;

   original_drawRect = class_getInstanceMethod ([view class],
                                                @selector (drawRect:));
@@ -245,6 +249,18 @@ gtk_ns_view_swizzle_draw_rect (NSView *view)
                            method_getImplementation (my_drawRect),
                            method_getTypeEncoding (my_drawRect));
     }
+
+  objc_setAssociatedObject (view, associated_key, (id) associated_object,
+                            OBJC_ASSOCIATION_ASSIGN);
+
+  subviews = [view subviews];
+
+  for (i = 0; i < [subviews count]; i++)
+    {
+      gtk_ns_view_swizzle_draw_rect_recursive ([subviews objectAtIndex: i],
+                                               associated_key,
+                                               associated_object);
+    }
 }

 static void
@@ -263,10 +279,8 @@ gtk_ns_view_constructed (GObject *object)
               gtk_widget_get_can_focus (GTK_WIDGET (ns_view)));
 #endif

-  gtk_ns_view_swizzle_draw_rect (ns_view->priv->view);
-
-  objc_setAssociatedObject (ns_view->priv->view, "gtknsview", (id) ns_view,
-                            OBJC_ASSOCIATION_ASSIGN);
+  gtk_ns_view_swizzle_draw_rect_recursive (ns_view->priv->view,
+                                           "gtknsview", ns_view);
 }

 static void
@@ -428,10 +442,7 @@ gtk_ns_view_map (GtkWidget *widget)

       if (text)
         {
-          gtk_ns_view_swizzle_draw_rect (text);
-
-          objc_setAssociatedObject (text, "gtkwindow", (id) toplevel,
-                                    OBJC_ASSOCIATION_ASSIGN);
+          gtk_ns_view_swizzle_draw_rect_recursive (text, "gtkwindow", toplevel);
         }
     }
 }
--
1.7.10.2 (Apple Git-33)