blob: 2cefd1b06a76b66db29232fe2fef0b08eeebde34 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
diff --git a/gdk/quartz/GdkQuartzWindow.c b/gdk/quartz/GdkQuartzWindow.c
index e8e0de5c7..d0c6e84ec 100644
--- a/gdk/quartz/GdkQuartzWindow.c
+++ b/gdk/quartz/GdkQuartzWindow.c
@@ -24,6 +24,13 @@
@implementation GdkQuartzWindow
+-(void)dealloc
+{
+ // During deallocation, Cocoa resets the delegate to nil
+ // We need to track that so that we don't throw an error
+ _allowDelegateToBeSetToNil = YES;
+}
+
-(BOOL)windowShouldClose:(id)sender
{
GdkWindow *window = [[self contentView] gdkWindow];
@@ -259,6 +266,16 @@
return [super makeFirstResponder:responder];
}
+-(void)setDelegate:(id<NSWindowDelegate>)delegate
+{
+ if ([super delegate] == nil || (_allowDelegateToBeSetToNil && delegate == nil)) {
+ [super setDelegate:delegate];
+ } else {
+ // If we allow the window delegate to be replaced, everything breaks.
+ g_critical ("Setting a delegate on GdkQuartzWindow is forbidden, because everything will break.");
+ }
+}
+
-(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen
{
self = [super initWithContentRect:contentRect
@@ -271,6 +288,7 @@
[self setDelegate:self];
[self setReleasedWhenClosed:YES];
+ _allowDelegateToBeSetToNil = NO;
return self;
}
diff --git a/gdk/quartz/GdkQuartzWindow.h b/gdk/quartz/GdkQuartzWindow.h
index 928f9617e..23cde0037 100644
--- a/gdk/quartz/GdkQuartzWindow.h
+++ b/gdk/quartz/GdkQuartzWindow.h
@@ -34,6 +34,8 @@
NSPoint initialMoveLocation;
NSPoint initialResizeLocation;
NSRect initialResizeFrame;
+
+ BOOL _allowDelegateToBeSetToNil;
}
-(BOOL)isInMove;
|