]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash when creating a child frame in NS (bug#63107)
authorAlan Third <alan@idiocy.org>
Thu, 27 Apr 2023 19:08:23 +0000 (20:08 +0100)
committerAlan Third <alan@idiocy.org>
Mon, 8 May 2023 08:49:03 +0000 (09:49 +0100)
* 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

index 37462cf49e23cda33b6e8687ec1f6413cb390a20..c26528e0154581e3328945add4d72e5f5e7bda60 100644 (file)
@@ -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]];