From: Alan Third Date: Fri, 8 Sep 2023 18:33:06 +0000 (+0100) Subject: Fix crash on child frame creation (bug#65817) X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c19a2dff5ab0d16a1aed62c68baf1d23dd1649b5;p=emacs.git 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. --- 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 @@ enum ns_return_frame_mode 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..c0b5e1b898f 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -7921,8 +7921,6 @@ ns_in_echo_area (void) 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,16 @@ ns_in_echo_area (void) 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 +8611,9 @@ ns_in_echo_area (void) - (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 +10441,14 @@ nswindow_orderedIndex_sort (id w1, id w2, void *c) 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]; }