Fix 'mono' package typo
[mono-project.git] / bockbuild / mac-sdk / patches / gtk / nsview-embedding.patch
blob1c74b7158ada0b9c5dd4e8394c571cba8173e3d5
1 diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
2 index 6d4abc0..cf8b626 100644
3 --- a/gdk/gdkwindow.c
4 +++ b/gdk/gdkwindow.c
5 @@ -1468,6 +1468,8 @@ gdk_window_new (GdkWindow *parent,
6 private->parent->children = g_list_prepend (private->parent->children, window);
8 native = _gdk_native_windows; /* Default */
9 + if (attributes->type_hint == 100)
10 + native = TRUE;
11 if (private->parent->window_type == GDK_WINDOW_ROOT)
12 native = TRUE; /* Always use native windows for toplevels */
13 else if (!private->input_only &&
14 diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
15 index 95a3665..e9428d0 100644
16 --- a/gdk/gdkwindow.h
17 +++ b/gdk/gdkwindow.h
18 @@ -722,6 +722,9 @@ void gdk_window_redirect_to_drawable (GdkWindow *window,
19 gint height);
20 void gdk_window_remove_redirection (GdkWindow *window);
22 +/* NSView embedding */
23 +gboolean gdk_window_supports_nsview_embedding ();
25 #ifndef GDK_DISABLE_DEPRECATED
26 #ifndef GDK_MULTIHEAD_SAFE
27 GdkPointerHooks *gdk_set_pointer_hooks (const GdkPointerHooks *new_hooks);
28 diff --git a/gdk/quartz/GdkQuartzView.c b/gdk/quartz/GdkQuartzView.c
29 index 1c92714..3c7ba37 100644
30 --- a/gdk/quartz/GdkQuartzView.c
31 +++ b/gdk/quartz/GdkQuartzView.c
32 @@ -122,6 +122,11 @@
33 return selectedRange;
36 +-(BOOL)isGtkView
38 + return YES;
41 -(void)unmarkText
43 GDK_NOTE (EVENTS, g_print ("unmarkText\n"));
44 diff --git a/gdk/quartz/GdkQuartzView.h b/gdk/quartz/GdkQuartzView.h
45 index 2f86de7..04acb62 100644
46 --- a/gdk/quartz/GdkQuartzView.h
47 +++ b/gdk/quartz/GdkQuartzView.h
48 @@ -47,5 +47,6 @@
49 - (GdkWindow *)gdkWindow;
50 - (NSTrackingRectTag)trackingRect;
51 - (void)setNeedsInvalidateShadow: (BOOL)invalidate;
52 +- (void)mouseDown:(NSEvent *)theEvent;
54 @end
55 diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c
56 index 8face0c..b6b794e 100644
57 --- a/gdk/quartz/GdkQuartzWindow.c
58 +++ b/gdk/quartz/GdkQuartzWindow.c
59 @@ -228,6 +228,28 @@
60 [self checkSendEnterNotify];
63 +-(BOOL)makeFirstResponder:(NSResponder *)responder
65 + GdkWindow *window = [[self contentView] gdkWindow];
66 + GdkWindowObject *private = (GdkWindowObject *)window;
67 + GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
69 + if (impl->type_hint == GDK_WINDOW_TYPE_HINT_TOOLBAR)
70 + {
71 + if ([responder respondsToSelector:@selector(isGtkView)] ||
72 + [responder isKindOfClass:[GdkQuartzView class]])
73 + {
74 + _gdk_quartz_events_update_focus_window (window, TRUE);
75 + }
76 + else
77 + {
78 + _gdk_quartz_events_update_focus_window (window, FALSE);
79 + }
80 + }
82 + return [super makeFirstResponder:responder];
85 -(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen
87 self = [super initWithContentRect:contentRect
88 diff --git a/gdk/quartz/GdkQuartzWindow.h b/gdk/quartz/GdkQuartzWindow.h
89 index 9cdee6b..928f961 100644
90 --- a/gdk/quartz/GdkQuartzWindow.h
91 +++ b/gdk/quartz/GdkQuartzWindow.h
92 @@ -44,6 +44,7 @@
93 -(BOOL)trackManualResize;
94 -(void)showAndMakeKey:(BOOL)makeKey;
95 -(void)hide;
96 +-(BOOL)makeFirstResponder:(NSResponder *)responder;
98 @end
100 diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
101 index b7b2665..f5bf65a 100644
102 --- a/gdk/quartz/gdkevents-quartz.c
103 +++ b/gdk/quartz/gdkevents-quartz.c
104 @@ -703,6 +703,37 @@ _gdk_quartz_events_send_map_event (GdkWindow *window)
108 +static NSView *
109 +find_nsview_at_pos (GdkWindowImplQuartz *impl, gint x, gint y)
111 + NSView *view = impl->view;
112 + guint n_subviews;
113 + guint i;
115 + n_subviews = [[view subviews] count];
117 + for (i = 0; i < n_subviews; ++i)
119 + NSView* sv = [[view subviews] objectAtIndex:i];
120 + NSRect r = [sv frame];
122 + if (sv == impl->layer_view)
123 + continue;
125 + if (r.origin.x <= x && r.origin.x + r.size.width >= x &&
126 + r.origin.y <= y && r.origin.y + r.size.height >= y)
128 + NSView* child = find_nsview_at_pos (impl, x - r.origin.x, y - r.origin.y);
129 + if (child != NULL)
130 + return child;
131 + else
132 + return sv;
136 + return NULL;
139 static GdkWindow *
140 find_toplevel_under_pointer (GdkDisplay *display,
141 NSPoint screen_point,
142 @@ -869,34 +900,21 @@ find_window_for_ns_event (NSEvent *nsevent,
144 GdkWindowObject *toplevel_private;
145 GdkWindowImplQuartz *toplevel_impl;
146 - guint n_subviews;
147 - guint i;
148 + NSView *subview;
150 toplevel = toplevel_under_pointer;
152 toplevel_private = (GdkWindowObject *)toplevel;
153 toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
155 - n_subviews = [[toplevel_impl->view subviews] count];
157 - for (i = 0; i < n_subviews; ++i)
159 - NSView* sv = [[toplevel_impl->view subviews] objectAtIndex:i];
160 - NSRect r = [sv frame];
162 - if (sv == toplevel_impl->layer_view)
163 - continue;
165 - if (r.origin.x <= *x && r.origin.x + r.size.width >= *x &&
166 - r.origin.y <= *y && r.origin.y + r.size.height >= *y)
168 - g_signal_emit_by_name (toplevel, "native-child-event",
169 - sv, nsevent);
170 + subview = find_nsview_at_pos (toplevel_impl, *x, *y);
171 + if (subview != NULL && ![subview isKindOfClass:[GdkQuartzView class]]) {
172 + g_signal_emit_by_name (toplevel, "native-child-event",
173 + subview, nsevent);
175 - /* event is within subview, forward back to Cocoa */
176 - return NULL;
179 + /* event is within subview, forward back to Cocoa */
180 + return NULL;
183 *x = x_tmp;
184 *y = y_tmp;
185 @@ -1665,6 +1683,11 @@ gdk_event_translate (GdkEvent *event,
186 GdkWindowObject *private = (GdkWindowObject *)window;
187 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
189 + GdkQuartzWindow *nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
190 + GdkQuartzView *nsview = ((GdkWindowImplQuartz *)private->impl)->view;
192 + [nswindow makeFirstResponder:nsview];
194 if (![NSApp isActive])
196 [NSApp activateIgnoringOtherApps:YES];
197 @@ -1796,6 +1819,15 @@ gdk_event_translate (GdkEvent *event,
198 case NSFlagsChanged:
200 GdkEventType type;
201 + GdkWindowObject *private = (GdkWindowObject *)window;
202 + GdkQuartzWindow *nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
203 + GdkQuartzView *nsview = ((GdkWindowImplQuartz *)private->impl)->view;
205 + if (![[nswindow firstResponder] respondsToSelector:@selector(isGtkView)])
207 + return_val = FALSE;
208 + break;
211 type = _gdk_quartz_keys_event_type (nsevent);
212 if (type == GDK_NOTHING)
213 diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
214 index 5b9ceef..050139a 100644
215 --- a/gdk/quartz/gdkwindow-quartz.c
216 +++ b/gdk/quartz/gdkwindow-quartz.c
217 @@ -889,6 +889,12 @@ get_nsscreen_for_point (gint x, gint y)
218 return screen;
221 +gboolean
222 +gdk_window_supports_nsview_embedding ()
224 + return TRUE;
227 void
228 _gdk_window_impl_new (GdkWindow *window,
229 GdkWindow *real_parent,