Transfer the Mac SDK bockbuild profiles & resources inside the Mono repository.
[mono.git] / bockbuild / mac-sdk / patches / gtk / 0047-gtk-first-attempt-to-also-clip-NSWindow-s-field-edit.patch
1 From 56e863ef4b425c1ac79e53d35f9b8b9649cec7d3 Mon Sep 17 00:00:00 2001
2 From: Michael Natterer <mitch@gimp.org>
3 Date: Fri, 15 Mar 2013 14:49:59 +0100
4 Subject: [PATCH 47/68] gtk: first attempt to also clip NSWindow's field
5  editor
6
7 Also, factor out the method swizzling to a utility function.
8 ---
9  gtk/gtknsview.c |   75 ++++++++++++++++++++++++++++++++++++++++++-------------
10  1 file changed, 58 insertions(+), 17 deletions(-)
11
12 diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
13 index 1e0b7e6..b58a2c8 100644
14 --- a/gtk/gtknsview.c
15 +++ b/gtk/gtknsview.c
16 @@ -29,6 +29,7 @@
17
18  #include "gtknsview.h"
19  #include "gtkviewport.h"
20 +#include "gtkwindow.h"
21  #include "gtkprivate.h"
22  #include "gtkintl.h"
23  #include "gtkalias.h"
24 @@ -147,6 +148,22 @@ gtk_ns_view_init (GtkNSView *ns_view)
25
26    ns_view = (GtkNSView *) objc_getAssociatedObject (self, "gtknsview");
27
28 +  if (! ns_view && ([self class] == [NSTextView class]))
29 +    {
30 +      /*  if it's not a GtkNSView, check if it's the NSWindow's cell
31 +       *  editor editing an NSTextField managed by a GtkNSView
32 +       */
33 +      GtkWindow *window = (GtkWindow *) objc_getAssociatedObject (self, "gtkwindow");
34 +
35 +      if (GTK_IS_WINDOW (window))
36 +        {
37 +          GtkWidget *focus = gtk_window_get_focus (window);
38 +
39 +          if (GTK_IS_NS_VIEW (focus))
40 +            ns_view = GTK_NS_VIEW (focus);
41 +        }
42 +    }
43 +
44    if (! ns_view)
45      {
46        [self myDrawRect: dirtyRect];
47 @@ -208,38 +225,45 @@ gtk_ns_view_init (GtkNSView *ns_view)
48  @end
49
50  static void
51 -gtk_ns_view_constructed (GObject *object)
52 +gtk_ns_view_swizzle_draw_rect (NSView *view)
53  {
54 -  GtkNSView *ns_view = GTK_NS_VIEW (object);
55    Method original_drawRect;
56    Method my_drawRect;
57
58 -  G_OBJECT_CLASS (gtk_ns_view_parent_class)->constructed (object);
59 -
60 -  gtk_widget_set_can_focus (GTK_WIDGET (ns_view),
61 -                            [ns_view->priv->view acceptsFirstResponder]);
62 -
63 -#if DEBUG_FOCUS
64 -  g_printerr ("%s can focus: %d\n",
65 -              class_getName ([ns_view->priv->view class]),
66 -              gtk_widget_get_can_focus (GTK_WIDGET (ns_view)));
67 -#endif
68 -
69 -  original_drawRect = class_getInstanceMethod ([ns_view->priv->view class],
70 +  original_drawRect = class_getInstanceMethod ([view class],
71                                                 @selector (drawRect:));
72 -  my_drawRect = class_getInstanceMethod ([ns_view->priv->view class],
73 +  my_drawRect = class_getInstanceMethod ([view class],
74                                           @selector (myDrawRect:));
75
76 -  if (class_addMethod ([ns_view->priv->view class],
77 +  if (class_addMethod ([view class],
78                         @selector (myDrawRect:),
79                         method_getImplementation (original_drawRect),
80                         method_getTypeEncoding (original_drawRect)))
81      {
82 -      class_replaceMethod ([ns_view->priv->view class],
83 +      class_replaceMethod ([view class],
84                             @selector (drawRect:),
85                             method_getImplementation (my_drawRect),
86                             method_getTypeEncoding (my_drawRect));
87      }
88 +}
89 +
90 +static void
91 +gtk_ns_view_constructed (GObject *object)
92 +{
93 +  GtkNSView *ns_view = GTK_NS_VIEW (object);
94 +
95 +  G_OBJECT_CLASS (gtk_ns_view_parent_class)->constructed (object);
96 +
97 +  gtk_widget_set_can_focus (GTK_WIDGET (ns_view),
98 +                            [ns_view->priv->view acceptsFirstResponder]);
99 +
100 +#if DEBUG_FOCUS
101 +  g_printerr ("%s can focus: %d\n",
102 +              class_getName ([ns_view->priv->view class]),
103 +              gtk_widget_get_can_focus (GTK_WIDGET (ns_view)));
104 +#endif
105 +
106 +  gtk_ns_view_swizzle_draw_rect (ns_view->priv->view);
107
108    objc_setAssociatedObject (ns_view->priv->view, "gtknsview", (id) ns_view,
109                              OBJC_ASSOCIATION_ASSIGN);
110 @@ -375,6 +399,7 @@ gtk_ns_view_map (GtkWidget *widget)
111    GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
112    GtkAllocation allocation;
113    NSView *parent_view;
114 +  NSWindow *window;
115
116    gtk_widget_get_allocation (widget, &allocation);
117    gtk_ns_view_position_view (ns_view, &allocation);
118 @@ -393,6 +418,22 @@ gtk_ns_view_map (GtkWidget *widget)
119                             G_OBJECT (widget), 0);
120
121    GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->map (widget);
122 +
123 +  window = [ns_view->priv->view window];
124 +
125 +  if (window)
126 +    {
127 +      NSText *text = [window fieldEditor: YES
128 +                               forObject: nil];
129 +
130 +      if (text)
131 +        {
132 +          gtk_ns_view_swizzle_draw_rect (text);
133 +
134 +          objc_setAssociatedObject (text, "gtkwindow", (id) toplevel,
135 +                                    OBJC_ASSOCIATION_ASSIGN);
136 +        }
137 +    }
138  }
139
140  static void
141 --
142 1.7.10.2 (Apple Git-33)