Fix crash when creating a child frame in NS (bug#63107)

* src/nsterm.m ([EmacsView initFrameFromEmacs:]): Have a second go at
creating the toolbar.
([EmacsWindow createToolbar:]): If there is already a toolbar or the
EmacsView's layer is not an EmacsLayer, then do nothing.
This commit is contained in:
Alan Third 2023-04-27 20:08:23 +01:00
parent d5ab8b6f24
commit 3adc1e7f37

View file

@ -7930,6 +7930,10 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f
[self setLayerContentsRedrawPolicy:
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];
#endif
if (ns_drag_types)
@ -9174,11 +9178,18 @@ - (instancetype) initWithEmacsFrame: (struct frame *) f
- (void)createToolbar: (struct frame *)f
{
if (FRAME_UNDECORATED (f) || !FRAME_EXTERNAL_TOOL_BAR (f))
if (FRAME_UNDECORATED (f) || !FRAME_EXTERNAL_TOOL_BAR (f) || [self toolbar] != nil)
return;
EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f);
#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
/* If the view's layer isn't an EmacsLayer then we can't create the
toolbar yet. */
if (! [[view layer] isKindOfClass:[EmacsLayer class]])
return;
#endif
EmacsToolbar *toolbar = [[EmacsToolbar alloc]
initForView:view
withIdentifier:[NSString stringWithFormat:@"%p", f]];