From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Third Newsgroups: gmane.emacs.bugs Subject: bug#54623: No scroll bars on macOS builds Date: Sun, 3 Apr 2022 14:36:13 +0100 Message-ID: References: <875ynxapxv.fsf@gnus.org> <232238068.1610928.1648723538459@mail1.libero.it> <1573705019.892210.1648765645434@mail1.libero.it> <855785195.1995564.1648852653736@mail1.libero.it> <730015416.968035.1648892521373@mail1.libero.it> <1289229983.972549.1648897213047@mail1.libero.it> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="kAjhmV7koNXFwUPV" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="40219"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 54623@debbugs.gnu.org, Lars Ingebrigtsen To: Angelo Graziosi Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Apr 03 15:37:26 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nb0Q2-000AFp-2f for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 03 Apr 2022 15:37:26 +0200 Original-Received: from localhost ([::1]:43562 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nb0Q0-0005qO-IG for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 03 Apr 2022 09:37:24 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:35634) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nb0Pe-0005oX-I4 for bug-gnu-emacs@gnu.org; Sun, 03 Apr 2022 09:37:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:54125) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nb0Pe-0000hX-9P for bug-gnu-emacs@gnu.org; Sun, 03 Apr 2022 09:37:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nb0Pe-0006uh-4o for bug-gnu-emacs@gnu.org; Sun, 03 Apr 2022 09:37:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Third Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 03 Apr 2022 13:37:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 54623 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 54623-submit@debbugs.gnu.org id=B54623.164899298626532 (code B ref 54623); Sun, 03 Apr 2022 13:37:02 +0000 Original-Received: (at 54623) by debbugs.gnu.org; 3 Apr 2022 13:36:26 +0000 Original-Received: from localhost ([127.0.0.1]:48022 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nb0P3-0006tr-R1 for submit@debbugs.gnu.org; Sun, 03 Apr 2022 09:36:26 -0400 Original-Received: from outbound.soverin.net ([116.202.126.228]:47299) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nb0P1-0006ta-AT for 54623@debbugs.gnu.org; Sun, 03 Apr 2022 09:36:24 -0400 Original-Received: from smtp.soverin.net (unknown [10.10.3.11]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by outbound.soverin.net (Postfix) with ESMTPS id 4A787D1; Sun, 3 Apr 2022 13:36:16 +0000 (UTC) Original-Received: from smtp.soverin.net (smtp.soverin.net [10.10.4.99]) by soverin.net DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=idiocy.org; s=soverin; t=1648992975; bh=sDt4bhthKgQt0hY4G9SOWCscUW1CcYKoeeNRX52Ccts=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=QrGWp3I7k0z0H3gtgFSP/+831s4BXXSwsukleTHgOCIZsN2DITt6mUsWYLY0DOD8+ oSDVBav/DpqSmAHqfrXuuzzWdLU1/WYOmGCZllWAX5oJPLc3TNDhP3q5dEpZHtc0Ts 1jrntN6BwpvlGbWR+m6Wa4OnZ9zAP+aPxZS31F4T3FWLU4+FogXojy2RWEZX5vWSdH sDRwFD1TFAE/FYG6SbEJB+AZ6S7r58gVsnFhaFy4OPlxH4iNA9QLSR81/d5V8f04VO 1tS4rnr3bpaQujlBi/rz7og3duRhCoOD05HW+mG+KZ/+NqQqnjnrTh/uti4QgeYQpE lq060+m9zm0cQ== Original-Received: from alan by faroe.holly.idiocy.org with local (Exim 4.95) (envelope-from ) id 1nb0Or-000K3L-9Z; Sun, 03 Apr 2022 14:36:13 +0100 Mail-Followup-To: Alan Third , Angelo Graziosi , Lars Ingebrigtsen , 54623@debbugs.gnu.org Content-Disposition: inline In-Reply-To: <1289229983.972549.1648897213047@mail1.libero.it> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:229350 Archived-At: --kAjhmV7koNXFwUPV Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sat, Apr 02, 2022 at 01:00:13PM +0200, Angelo Graziosi wrote: > > > Il 02/04/2022 11:42 Angelo Graziosi ha scritto: > > > > > > > Il 02/04/2022 10:07 Alan Third ha scritto: > > > > > > > > > On Sat, Apr 02, 2022 at 12:37:33AM +0200, Angelo Graziosi wrote: > > > > Undefined symbols for architecture x86_64: > > > > "_OBJC_CLASS_$_EmacsLayer", referenced from: > > > > objc-class-ref in nsterm.o > > > > ld: symbol(s) not found for architecture x86_64 > > > > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > > > make[1]: *** [temacs] Error 1 > > > > make: *** [src] Error 2 > > > > Error: Failure running MAKE > > > > > > *sigh* missed a zero in the version number in one of the #if things. > > > > > > Please try the attached. > > > > Now it seems to work as expected!!! > > > > Let's see how t work for few days.. > > Spoken too soon! > ================= > > Now Emacs builds, does not crash, *does have* scroll bars, but.. > > - I cannot select text (mouse-1 and drag) > > - minibuffer does not work: C-x C-f displays current directory but I cannot type anything there > > - the same with M-x: only M-x is displayed but cannot type the command and cannot use history (UP/DOWN arrows).. hopefully all we have to do is force an occasional redraw like on GNUstep. Please try the attached. -- Alan Third --kAjhmV7koNXFwUPV Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v5-0001-Fix-scrollbars-on-macOS-10.13-and-below-bug-54623.patch" >From 0ceb4141eaaac896cc1a16aa58cc11f037048906 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Wed, 30 Mar 2022 22:40:03 +0100 Subject: [PATCH v5] Fix scrollbars on macOS 10.13 and below (bug#54623) Make any build on macOS 10.13 and below follow the same drawing path as the GNUstep port. macOS 10.14 and above will use EmacsLayer. * src/nsterm.h (EmacsLayer): * src/nsterm.m ([EmacsView makeBackingLayer]): ([EmacsView unlockFocus]): ([EmacsView windowDidChangeBackingProperties:]): ([EmacsView copyRect:to:]): Remove any code required for macOS 10.13 and below, and fix the #if's to enforce strict separation of the drawing paths. (ns_update_end): (ns_unfocus): Fix #ifs so that flushWindow is called on old macOS versions as well as GNUstep. --- src/nsterm.h | 4 +- src/nsterm.m | 128 +++++++++++++++++++-------------------------------- 2 files changed, 50 insertions(+), 82 deletions(-) diff --git a/src/nsterm.h b/src/nsterm.h index f027646123..4cba5c0be8 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -487,7 +487,7 @@ #define NSTRACE_UNSILENCE() #endif - (int)fullscreenState; -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 - (void)lockFocus; - (void)unlockFocus; #endif @@ -698,7 +698,7 @@ #define NSTRACE_UNSILENCE() + (CGFloat)scrollerWidth; @end -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 @interface EmacsLayer : CALayer { NSMutableArray *cache; diff --git a/src/nsterm.m b/src/nsterm.m index fd56094c28..0520d76b34 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1060,7 +1060,7 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen) block_input (); [view unlockFocus]; -#if defined (NS_IMPL_GNUSTEP) +#if defined (NS_IMPL_GNUSTEP) || MAC_OS_X_VERSION_MIN_REQUIRED < 101400 [[view window] flushWindow]; #endif @@ -1127,7 +1127,7 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen) { EmacsView *view = FRAME_NS_VIEW (f); [view unlockFocus]; -#if defined (NS_IMPL_GNUSTEP) +#if defined (NS_IMPL_GNUSTEP) || MAC_OS_X_VERSION_MIN_REQUIRED < 101400 [[view window] flushWindow]; #endif } @@ -7197,7 +7197,7 @@ - (instancetype) initFrameFromEmacs: (struct frame *)f [[EmacsWindow alloc] initWithEmacsFrame:f]; -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 /* These settings mean AppKit will retain the contents of the frame on resize. Unfortunately it also means the frame will not be automatically marked for display, but we can do that ourselves in @@ -7861,7 +7861,7 @@ - (instancetype)toggleToolbar: (id)sender } -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 - (CALayer *)makeBackingLayer; { EmacsLayer *l = [[EmacsLayer alloc] @@ -7877,19 +7877,12 @@ - (void)lockFocus { NSTRACE ("[EmacsView lockFocus]"); - if ([self wantsLayer]) - { - CGContextRef context = [(EmacsLayer*)[self layer] getContext]; + CGContextRef context = [(EmacsLayer*)[self layer] getContext]; - [NSGraphicsContext + [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithCGContext:context flipped:YES]]; - } -#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 - else - [super lockFocus]; -#endif } @@ -7897,18 +7890,8 @@ - (void)unlockFocus { NSTRACE ("[EmacsView unlockFocus]"); - if ([self wantsLayer]) - { - [NSGraphicsContext setCurrentContext:nil]; - [self setNeedsDisplay:YES]; - } -#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 - else - { - [super unlockFocus]; - [super flushWindow]; - } -#endif + [NSGraphicsContext setCurrentContext:nil]; + [self setNeedsDisplay:YES]; } @@ -7917,19 +7900,16 @@ - (void)windowDidChangeBackingProperties:(NSNotification *)notification { NSTRACE ("EmacsView windowDidChangeBackingProperties:]"); - if ([self wantsLayer]) - { - NSRect frame = [self frame]; - EmacsLayer *layer = (EmacsLayer *)[self layer]; + NSRect frame = [self frame]; + EmacsLayer *layer = (EmacsLayer *)[self layer]; - [layer setContentsScale:[[notification object] backingScaleFactor]]; - [layer setColorSpace:[[[notification object] colorSpace] CGColorSpace]]; + [layer setContentsScale:[[notification object] backingScaleFactor]]; + [layer setColorSpace:[[[notification object] colorSpace] CGColorSpace]]; - ns_clear_frame (emacsframe); - expose_frame (emacsframe, 0, 0, NSWidth (frame), NSHeight (frame)); - } + ns_clear_frame (emacsframe); + expose_frame (emacsframe, 0, 0, NSWidth (frame), NSHeight (frame)); } -#endif /* NS_IMPL_COCOA */ +#endif - (void)copyRect:(NSRect)srcRect to:(NSPoint)dest @@ -7941,57 +7921,45 @@ - (void)copyRect:(NSRect)srcRect to:(NSPoint)dest NSRect dstRect = NSMakeRect (dest.x, dest.y, NSWidth (srcRect), NSHeight (srcRect)); -#ifdef NS_IMPL_COCOA - if ([self wantsLayer]) - { - double scale = [[self window] backingScaleFactor]; - CGContextRef context = [(EmacsLayer *)[self layer] getContext]; - int bpp = CGBitmapContextGetBitsPerPixel (context) / 8; - void *pixels = CGBitmapContextGetData (context); - int rowSize = CGBitmapContextGetBytesPerRow (context); - int srcRowSize = NSWidth (srcRect) * scale * bpp; - void *srcPixels = (char *) pixels - + (int) (NSMinY (srcRect) * scale * rowSize - + NSMinX (srcRect) * scale * bpp); - void *dstPixels = (char *) pixels - + (int) (dest.y * scale * rowSize - + dest.x * scale * bpp); - - if (NSIntersectsRect (srcRect, dstRect) - && NSMinY (srcRect) < NSMinY (dstRect)) - for (int y = NSHeight (srcRect) * scale - 1 ; y >= 0 ; y--) - memmove ((char *) dstPixels + y * rowSize, - (char *) srcPixels + y * rowSize, - srcRowSize); - else - for (int y = 0 ; y < NSHeight (srcRect) * scale ; y++) - memmove ((char *) dstPixels + y * rowSize, - (char *) srcPixels + y * rowSize, - srcRowSize); - - } -#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400 +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 + double scale = [[self window] backingScaleFactor]; + CGContextRef context = [(EmacsLayer *)[self layer] getContext]; + int bpp = CGBitmapContextGetBitsPerPixel (context) / 8; + void *pixels = CGBitmapContextGetData (context); + int rowSize = CGBitmapContextGetBytesPerRow (context); + int srcRowSize = NSWidth (srcRect) * scale * bpp; + void *srcPixels = (char *) pixels + + (int) (NSMinY (srcRect) * scale * rowSize + + NSMinX (srcRect) * scale * bpp); + void *dstPixels = (char *) pixels + + (int) (dest.y * scale * rowSize + + dest.x * scale * bpp); + + if (NSIntersectsRect (srcRect, dstRect) + && NSMinY (srcRect) < NSMinY (dstRect)) + for (int y = NSHeight (srcRect) * scale - 1 ; y >= 0 ; y--) + memmove ((char *) dstPixels + y * rowSize, + (char *) srcPixels + y * rowSize, + srcRowSize); else - { -#endif -#endif /* NS_IMPL_COCOA */ + for (int y = 0 ; y < NSHeight (srcRect) * scale ; y++) + memmove ((char *) dstPixels + y * rowSize, + (char *) srcPixels + y * rowSize, + srcRowSize); -#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MIN_REQUIRED < 101400 - hide_bell(); // Ensure the bell image isn't scrolled. +#else + hide_bell(); // Ensure the bell image isn't scrolled. - ns_focus (emacsframe, &dstRect, 1); - [self scrollRect: srcRect - by: NSMakeSize (dstRect.origin.x - srcRect.origin.x, - dstRect.origin.y - srcRect.origin.y)]; - ns_unfocus (emacsframe); -#endif -#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED < 101400 - } + ns_focus (emacsframe, &dstRect, 1); + [self scrollRect: srcRect + by: NSMakeSize (dstRect.origin.x - srcRect.origin.x, + dstRect.origin.y - srcRect.origin.y)]; + ns_unfocus (emacsframe); #endif } -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 /* If the frame has been garbaged but the toolkit wants to draw, for example when resizing the frame, we end up with a blank screen. Sometimes this results in an unpleasant flicker, so try to @@ -9435,7 +9403,7 @@ - (void) scrollWheel: (NSEvent *)theEvent @end /* EmacsScroller */ -#ifdef NS_IMPL_COCOA +#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MIN_REQUIRED >= 101400 /* ========================================================================== -- 2.35.1 --kAjhmV7koNXFwUPV--