Welcome to mirror list, hosted at ThFree Co, Russian Federation.

0001-prevent-gdk-quartz-window-delegate-replacement.patch « gtk « patches « packages - github.com/mono/bockbuild.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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;