]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix #defines controlling when NS port draws to offscreen buffer
authorAlan Third <alan@idiocy.org>
Mon, 2 Mar 2020 17:44:38 +0000 (17:44 +0000)
committerAlan Third <alan@idiocy.org>
Mon, 2 Mar 2020 18:29:09 +0000 (18:29 +0000)
* src/nsterm.h (NS_DRAW_TO_BUFFER): New definition.
* src/nsterm.m (ns_update_begin):
(ns_update_end):
(ns_focus):
([EmacsView updateFrameSize:]):
([EmacsView initFrameFromEmacs:]):
([EmacsView copyRect:to:]): Use new #define.

src/nsterm.h
src/nsterm.m

index 7c6197f12880f707c9afa99d3790e9482cfb6a0c..db966e1581be70e07f294ba7738026360a39d349 100644 (file)
@@ -339,6 +339,22 @@ typedef id instancetype;
 #endif
 
 
+/* macOS 10.14 and above cannot draw directly "to the glass" and
+   therefore we draw to an offscreen buffer and swap it in when the
+   toolkit wants to draw the frame. GNUstep and macOS 10.7 and below
+   do not support this method, so we revert to drawing directly to the
+   glass.
+
+   FIXME: Should we make this macOS 10.8+, or macOS 10.14+?  I'm
+   inclined to go with 10.14+ as there have been some reports of funny
+   behaviour on 10.13 and below.  It may be worth adding a variable to
+   allow people in the overlapping region to switch between drawing
+   paths.  */
+#if defined (NS_IMPL_COCOA) && defined (MAC_OS_X_VERSION_10_14)
+#define NS_DRAW_TO_BUFFER 1
+#endif
+
+
 /* ==========================================================================
 
    NSColor, EmacsColor category.
@@ -417,7 +433,7 @@ typedef id instancetype;
    int maximized_width, maximized_height;
    NSWindow *nonfs_window;
    BOOL fs_is_native;
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
    CGContextRef drawingBuffer;
 #endif
 @public
@@ -460,11 +476,11 @@ typedef id instancetype;
 #endif
 - (int)fullscreenState;
 
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
 - (void)focusOnDrawingBuffer;
+- (void)createDrawingBuffer;
 #endif
 - (void)copyRect:(NSRect)srcRect to:(NSRect)dstRect;
-- (void)createDrawingBuffer;
 
 /* Non-notification versions of NSView methods. Used for direct calls.  */
 - (void)windowWillEnterFullScreen;
index 84acb61dcd1e6a4936eb7eab84407110455a619a..57bb9b1dd834b014a67b0b05d05ce08205a93249 100644 (file)
@@ -1117,7 +1117,7 @@ ns_update_begin (struct frame *f)
 #endif
 
   ns_updating_frame = f;
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
   [view focusOnDrawingBuffer];
 #else
   [view lockFocus];
@@ -1139,7 +1139,7 @@ ns_update_end (struct frame *f)
 /*   if (f == MOUSE_HL_INFO (f)->mouse_face_mouse_frame) */
   MOUSE_HL_INFO (f)->mouse_face_defer = 0;
 
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
   [NSGraphicsContext setCurrentContext:nil];
 #else
   block_input ();
@@ -1172,7 +1172,7 @@ ns_focus (struct frame *f, NSRect *r, int n)
     }
 
   if (f != ns_updating_frame)
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
     [view focusOnDrawingBuffer];
 #else
     {
@@ -7091,8 +7091,10 @@ not_in_argv (NSString *arg)
          from non-native fullscreen, in other circumstances it appears
          to be a noop.  (bug#28872) */
       wr = NSMakeRect (0, 0, neww, newh);
-      [self createDrawingBuffer];
       [view setFrame: wr];
+#ifdef NS_DRAW_TO_BUFFER
+      [self createDrawingBuffer];
+#endif
 
       // To do: consider using [NSNotificationCenter postNotificationName:].
       [self windowDidMove: // Update top/left.
@@ -7430,7 +7432,9 @@ not_in_argv (NSString *arg)
   maximizing_resize = NO;
 #endif
 
+#ifdef NS_DRAW_TO_BUFFER
   [self createDrawingBuffer];
+#endif
 
   win = [[EmacsWindow alloc]
             initWithContentRect: r
@@ -8210,7 +8214,7 @@ not_in_argv (NSString *arg)
 }
 
 
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
 - (void)createDrawingBuffer
   /* Create and store a new CGGraphicsContext for Emacs to draw into.
 
@@ -8268,7 +8272,7 @@ not_in_argv (NSString *arg)
       expose_frame (emacsframe, 0, 0, NSWidth (frame), NSHeight (frame));
     }
 }
-#endif /* NS_IMPL_COCOA */
+#endif /* NS_DRAW_TO_BUFFER */
 
 
 - (void)copyRect:(NSRect)srcRect to:(NSRect)dstRect
@@ -8277,7 +8281,7 @@ not_in_argv (NSString *arg)
   NSTRACE_RECT ("Source", srcRect);
   NSTRACE_RECT ("Destination", dstRect);
 
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
   CGImageRef copy;
   NSRect frame = [self frame];
   NSAffineTransform *setOrigin = [NSAffineTransform transform];
@@ -8317,7 +8321,7 @@ not_in_argv (NSString *arg)
 }
 
 
-#ifdef NS_IMPL_COCOA
+#ifdef NS_DRAW_TO_BUFFER
 - (BOOL)wantsUpdateLayer
 {
     return YES;