From c1363a04bb201f8444072903a89a77f8203a9e3a Mon Sep 17 00:00:00 2001 From: Alan Third Date: Thu, 27 Apr 2023 20:08:23 +0100 Subject: [PATCH] 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. (cherry picked from commit 3adc1e7f37901235bda83ea65a90644b7b0a8dbf) --- src/nsterm.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/nsterm.m b/src/nsterm.m index 37462cf49e2..c26528e0154 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -7938,6 +7938,10 @@ ns_in_echo_area (void) [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) @@ -9182,11 +9186,18 @@ ns_in_echo_area (void) - (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]]; -- 2.39.2