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
7 Also, factor out the method swizzling to a utility function.
9 gtk/gtknsview.c | 75 ++++++++++++++++++++++++++++++++++++++++++-------------
10 1 file changed, 58 insertions(+), 17 deletions(-)
12 diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
13 index 1e0b7e6..b58a2c8 100644
18 #include "gtknsview.h"
19 #include "gtkviewport.h"
20 +#include "gtkwindow.h"
21 #include "gtkprivate.h"
24 @@ -147,6 +148,22 @@ gtk_ns_view_init (GtkNSView *ns_view)
26 ns_view = (GtkNSView *) objc_getAssociatedObject (self, "gtknsview");
28 + if (! ns_view && ([self class] == [NSTextView class]))
30 + /* if it's not a GtkNSView, check if it's the NSWindow's cell
31 + * editor editing an NSTextField managed by a GtkNSView
33 + GtkWindow *window = (GtkWindow *) objc_getAssociatedObject (self, "gtkwindow");
35 + if (GTK_IS_WINDOW (window))
37 + GtkWidget *focus = gtk_window_get_focus (window);
39 + if (GTK_IS_NS_VIEW (focus))
40 + ns_view = GTK_NS_VIEW (focus);
46 [self myDrawRect: dirtyRect];
47 @@ -208,38 +225,45 @@ gtk_ns_view_init (GtkNSView *ns_view)
51 -gtk_ns_view_constructed (GObject *object)
52 +gtk_ns_view_swizzle_draw_rect (NSView *view)
54 - GtkNSView *ns_view = GTK_NS_VIEW (object);
55 Method original_drawRect;
58 - G_OBJECT_CLASS (gtk_ns_view_parent_class)->constructed (object);
60 - gtk_widget_set_can_focus (GTK_WIDGET (ns_view),
61 - [ns_view->priv->view acceptsFirstResponder]);
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)));
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:));
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)))
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));
91 +gtk_ns_view_constructed (GObject *object)
93 + GtkNSView *ns_view = GTK_NS_VIEW (object);
95 + G_OBJECT_CLASS (gtk_ns_view_parent_class)->constructed (object);
97 + gtk_widget_set_can_focus (GTK_WIDGET (ns_view),
98 + [ns_view->priv->view acceptsFirstResponder]);
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)));
106 + gtk_ns_view_swizzle_draw_rect (ns_view->priv->view);
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;
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);
121 GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->map (widget);
123 + window = [ns_view->priv->view window];
127 + NSText *text = [window fieldEditor: YES
132 + gtk_ns_view_swizzle_draw_rect (text);
134 + objc_setAssociatedObject (text, "gtkwindow", (id) toplevel,
135 + OBJC_ASSOCIATION_ASSIGN);
142 1.7.10.2 (Apple Git-33)