Subject: bug#54623: No scroll bars on macOS builds

From: Alan Third <[email-masked]>
Date: Thu, 31 Mar 2022 17:43:09 +0100

On Thu, Mar 31, 2022 at 12:45:38PM +0200, Angelo Graziosi wrote:
> > Il 30/03/2022 23:52 Alan Third  ha scritto:
> >
> > I can't reproduce it on 10.14 either. I suspect it's some subtle
> > difference in layer handling between 10.13 and 10.14+.
> > 
> > 
> > Maybe the attached will help.
> 
> No.. I am afraid...
> 
> I applied it to current master and it builds but crashes when I try to start it.
> 
> Attached the report that the system produces (it is taken with 'Emacs -Q', but the same occurs when I start Emacs in normal way, i.e. cliking the icon on the Dock).

Can you try the new version attached to this email, please?

-- 
Alan Third
>From ea124ec1849c4f800a8e0a81be41ed195853d0de Mon Sep 17 00:00:00 2001
From: Alan Third <[email-masked]>
Date: Wed, 30 Mar 2022 22:40:03 +0100
Subject: [PATCH v2] Fix scrollbars on macOS 10.13 and below (bug#54623)

* src/nsterm.h (NSAppKitVersionNumber10_14): Required for
makeBackingLayer version check.
* src/nsterm.m (USING_EMACSLAYER): Check whether we're using layers
and whether the layer is an EmacsLayer class.
([EmacsView makeBackingLayer]): Only use EmacsLayer on macOS 10.14 and above.
([EmacsView lockFocus]):
([EmacsView unlockFocus]):
([EmacsView windowDidChangeBackingProperties:]):
([EmacsView copyRect:to:]): Replace check for wantsLayer with
USING_EMACSLAYER.
([EmacsView unlockFocus]): Remove call to flushWindow.
---
 src/nsterm.h |  4 ++++
 src/nsterm.m | 31 ++++++++++++++++++-------------
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/src/nsterm.h b/src/nsterm.h
index f027646123..ea92d8e893 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -1239,6 +1239,10 @@ #define NSAppKitVersionNumber10_7 1138
 #ifndef NSAppKitVersionNumber10_10
 #define NSAppKitVersionNumber10_10 1343
 #endif
+
+#ifndef NSAppKitVersionNumber10_14
+#define NSAppKitVersionNumber10_14 1671
+#endif
 #endif /* NS_IMPL_COCOA */

diff --git a/src/nsterm.m b/src/nsterm.m
index fd56094c28..4b4ca44981 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -5954,6 +5954,9 @@ - (BOOL)fulfillService: (NSString *)name withArg: (NSString *)arg
 
 @implementation EmacsView
 
+#define USING_EMACSLAYER \
+  ([self wantsLayer] && [[self layer] isKindOfClass:[EmacsLayer class]])
+
 /* Needed to inform when window closed from lisp.  */
 - (void) setWindowClosing: (BOOL)closing
 {
@@ -7864,12 +7867,17 @@ - (instancetype)toggleToolbar: (id)sender
 #ifdef NS_IMPL_COCOA
 - (CALayer *)makeBackingLayer;
 {
-  EmacsLayer *l = [[EmacsLayer alloc]
-                    initWithColorSpace:[[[self window] colorSpace] CGColorSpace]];
-  [l setDelegate:(id)self];
-  [l setContentsScale:[[self window] backingScaleFactor]];
+  if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_14)
+    {
+      EmacsLayer *l = [[EmacsLayer alloc]
+                        initWithColorSpace:[[[self window] colorSpace] CGColorSpace]];
+      [l setDelegate:(id)self];
+      [l setContentsScale:[[self window] backingScaleFactor]];
+
+      return l;
+    }
 
-  return l;
+  return [super makeBackingLayer];
 }

@@ -7877,7 +7885,7 @@ - (void)lockFocus
 {
   NSTRACE ("[EmacsView lockFocus]");
 
-  if ([self wantsLayer])
+  if (USING_EMACSLAYER)
     {
       CGContextRef context = [(EmacsLayer*)[self layer] getContext];
 
@@ -7897,17 +7905,14 @@ - (void)unlockFocus
 {
   NSTRACE ("[EmacsView unlockFocus]");
 
-  if ([self wantsLayer])
+  if (USING_EMACSLAYER)
     {
       [NSGraphicsContext setCurrentContext:nil];
       [self setNeedsDisplay:YES];
     }
 #if MAC_OS_X_VERSION_MIN_REQUIRED < 101400
   else
-    {
-      [super unlockFocus];
-      [super flushWindow];
-    }
+    [super unlockFocus];
 #endif
 }
 
@@ -7917,7 +7922,7 @@ - (void)windowDidChangeBackingProperties:(NSNotification *)notification
 {
   NSTRACE ("EmacsView windowDidChangeBackingProperties:]");
 
-  if ([self wantsLayer])
+  if (USING_EMACSLAYER)
     {
       NSRect frame = [self frame];
       EmacsLayer *layer = (EmacsLayer *)[self layer];
@@ -7942,7 +7947,7 @@ - (void)copyRect:(NSRect)srcRect to:(NSPoint)dest
                                NSHeight (srcRect));
 
 #ifdef NS_IMPL_COCOA
-  if ([self wantsLayer])
+  if (USING_EMACSLAYER)
     {
       double scale = [[self window] backingScaleFactor];
       CGContextRef context = [(EmacsLayer *)[self layer] getContext];
-- 
2.35.1