From 893f079f51c3bc81d8719c48fe539f72b1025fb8 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Fri, 8 Sep 2023 19:33:06 +0100 Subject: [PATCH] Fix crash on child frame creation (bug#65817) * src/nsterm.m ([EmacsView initFrameFromEmacs:]): Reorder the way the frame and layers are created. ([EmacsView makeBackingLayer]): Change to the newly renamed method below. ([EmacsLayer initWithColorSpace:doubleBuffered:]): ([EmacsLayer initWithDoubleBuffered:]): Rename the method and remove the colorspace argument as it's no longer able to be set on initial creation. * src/nsterm.h: Use new method prototype. --- src/nsterm.h | 2 +- src/nsterm.m | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/nsterm.h b/src/nsterm.h index 8d6c58290cc..cb162039ad8 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -748,7 +748,7 @@ #define NSTRACE_UNSILENCE() CGContextRef context; bool doubleBuffered; } -- (id) initWithColorSpace: (CGColorSpaceRef)cs doubleBuffered: (bool)db; +- (id) initWithDoubleBuffered: (bool)db; - (void) setColorSpace: (CGColorSpaceRef)cs; - (void) setDoubleBuffered: (bool)db; - (CGContextRef) getContext; diff --git a/src/nsterm.m b/src/nsterm.m index 28502ad1a2a..a3603171bb0 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -7921,8 +7921,6 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f maximizing_resize = NO; #endif - [[EmacsWindow alloc] initWithEmacsFrame:f]; - #if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 /* These settings mean AppKit will retain the contents of the frame on resize. Unfortunately it also means the frame will not be @@ -7933,9 +7931,14 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f NSViewLayerContentsRedrawOnSetNeedsDisplay]; [self setLayerContentsPlacement:NSViewLayerContentsPlacementTopLeft]; - /* initWithEmacsFrame can't create the toolbar before the layer is - set, so have another go at creating the toolbar here. */ - [(EmacsWindow*)[self window] createToolbar:f]; + [[EmacsWindow alloc] initWithEmacsFrame:f]; + + /* Now the NSWindow has been created, we can finish up configuring + the layer. */ + [(EmacsLayer *)[self layer] setColorSpace:[[[self window] colorSpace] CGColorSpace]]; + [(EmacsLayer *)[self layer] setContentsScale:[[self window] backingScaleFactor]]; +#else + [[EmacsWindow alloc] initWithEmacsFrame:f]; #endif if (ns_drag_types) @@ -8606,10 +8609,9 @@ - (instancetype)toggleToolbar: (id)sender - (CALayer *)makeBackingLayer { EmacsLayer *l = [[EmacsLayer alloc] - initWithColorSpace:[[[self window] colorSpace] CGColorSpace] - doubleBuffered:FRAME_DOUBLE_BUFFERED (emacsframe)]; + initWithDoubleBuffered:FRAME_DOUBLE_BUFFERED (emacsframe)]; + [l setDelegate:(id)self]; - [l setContentsScale:[[self window] backingScaleFactor]]; return l; } @@ -10437,15 +10439,14 @@ @implementation EmacsLayer cache. If no free surfaces are found in the cache then a new one is created. */ -- (id) initWithColorSpace: (CGColorSpaceRef)cs - doubleBuffered: (bool)db +- (id) initWithDoubleBuffered: (bool)db { - NSTRACE ("[EmacsLayer initWithColorSpace:doubleBuffered:]"); + NSTRACE ("[EmacsLayer initWithDoubleBuffered:]"); self = [super init]; if (self) { - [self setColorSpace:cs]; + [self setColorSpace:nil]; [self setDoubleBuffered:db]; cache = [[NSMutableArray arrayWithCapacity:(doubleBuffered ? 2 : 1)] retain]; } -- 2.40.1