unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave
@ 2018-06-19 23:09 zentrope@fastmail.fm
  2018-06-20 19:00 ` Alan Third
                   ` (4 more replies)
  0 siblings, 5 replies; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-06-19 23:09 UTC (permalink / raw)
  To: 31904



Emacs from the master branch compiles on Mac OS 10.14 (Developer Beta 1
and 2) just fine, but when I run the resulting Emacs.app, none of the
text or even the mode-line appears in the frame.

- If I "select" the text in the scratch buffer, I see nothing, but I can
  then paste it into another application just fine.

- If I type something in the scratch buffer, I can't see it. I can
  select it (but not see the region), copy it, and paste it into another
  application and see the text I've typed.

- The mode-line isn't rendered, either.

- Running Emacs.app/Contents/MacOS/Emacs -nw in a terminal window works
  fine.
  
The application seems to be working in all particulars except the text
is invisible (not the same color as the background, just not there).


In GNU Emacs 27.0.50 (build 8, x86_64-apple-darwin, NS appkit-1641.10 Version 10.14 (Build 18A314h))
of 2018-06-19 built on KitchenMac
Repository revision: 3a47f3921bdaaf7b7d80dc3be05a5f1b1f2501eb
System Description:  Mac OS X 10.14

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Configured using:
'configure --build=x86_64-apple-darwin --without-dbus --with-ns
'CFLAGS=-I /usr/local/Cellar/libxml2/2.9.7/include/libxml2'
build_alias=x86_64-apple-darwin'

Configured features:
RSVG NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS THREADS

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/Applications/Emacs.app/Contents/Resources/lisp/net/starttls hides /Applications/Emacs.app/Contents/Resources/lisp/obsolete/starttls
/Applications/Emacs.app/Contents/Resources/lisp/net/tls hides /Applications/Emacs.app/Contents/Resources/lisp/obsolete/tls

Features:
(shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv
bytecomp byte-compile cconv dired dired-loaddefs format-spec rfc822 mml
easymenu mml-sec password-cache epa derived epg epg-config gnus-util
rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader cl-loaddefs cl-lib sendmail rfc2047
rfc2045 ietf-drums mm-util mail-prsvr mail-utils term/xterm xterm
time-date elec-pair tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel term/ns-win ns-win ucs-normalize mule-util
term/common-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote kqueue cocoa ns multi-tty make-network-process emacs)

Memory information:
((conses 16 209194 11301)
(symbols 48 19961 1)
(miscs 40 71 111)
(strings 32 29182 1787)
(string-bytes 1 766589)
(vectors 16 33947)
(vector-slots 8 689539 10718)
(floats 8 52 202)
(intervals 56 193 0)
(buffers 992 12))





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave
  2018-06-19 23:09 bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave zentrope@fastmail.fm
@ 2018-06-20 19:00 ` Alan Third
       [not found] ` <handler.31904.B.152945065229583.ack@debbugs.gnu.org>
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 16+ messages in thread
From: Alan Third @ 2018-06-20 19:00 UTC (permalink / raw)
  To: zentrope@fastmail.fm; +Cc: 31904

On Tue, Jun 19, 2018 at 04:09:03PM -0700, zentrope@fastmail.fm wrote:
> 
> 
> Emacs from the master branch compiles on Mac OS 10.14 (Developer Beta 1
> and 2) just fine, but when I run the resulting Emacs.app, none of the
> text or even the mode-line appears in the frame.
> 
> - If I "select" the text in the scratch buffer, I see nothing, but I can
>   then paste it into another application just fine.
> 
> - If I type something in the scratch buffer, I can't see it. I can
>   select it (but not see the region), copy it, and paste it into another
>   application and see the text I've typed.
> 
> - The mode-line isn't rendered, either.
> 
> - Running Emacs.app/Contents/MacOS/Emacs -nw in a terminal window works
>   fine.
>   
> The application seems to be working in all particulars except the text
> is invisible (not the same color as the background, just not there).

I can see how this might be less than ideal.

Can you please recompile and send the output? I expect there are a few
deprecation notices, perhaps one of them will give us a hint as to
what’s going on here.
-- 
Alan Third





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: Acknowledgement (27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave)
       [not found] ` <handler.31904.B.152945065229583.ack@debbugs.gnu.org>
@ 2018-06-20 21:32   ` zentrope@fastmail.fm
  0 siblings, 0 replies; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-06-20 21:32 UTC (permalink / raw)
  To: 31904

Here’s the bit involved with the NS stuff. Yes, plenty of deprecations, though that’s been going on for quite a few iterations.

  CC       nsterm.o
nsterm.m:175:16: warning: 'colorUsingColorSpaceName:' is deprecated: first deprecated in
      macOS 10.14 - Use -colorUsingType: or -colorUsingColorSpace: instead
      [-Wdeprecated-declarations]
  return [self colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
               ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSColor.h:405:1: note: 
      'colorUsingColorSpaceName:' has been explicitly marked deprecated here
- (nullable NSColor *)colorUsingColorSpaceName:(NSColorSpaceName)name NS_DEPRECAT...
^
nsterm.m:713:3: warning: 'NSDisableScreenUpdates' is deprecated: first deprecated in
      macOS 10.11 - As of 10.11 it is not generally necessary to take explicit action to
      achieve visual atomicity. +[NSAnimationContext runAnimationGroup:] and other
      similar methods can be used when a stronger than normal need for visual atomicity
      is required. The NSAnimationContext methods do not suffer from the same performance
      problems as NSDisableScreenUpdates. [-Wdeprecated-declarations]
  NSDisableScreenUpdates ();
  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:234:20: note: 
      'NSDisableScreenUpdates' has been explicitly marked deprecated here
APPKIT_EXTERN void NSDisableScreenUpdates(void) NS_DEPRECATED_MAC(10_0, 10_11, "A...
                   ^
nsterm.m:723:7: warning: 'NSEnableScreenUpdates' is deprecated: first deprecated in macOS
      10.11 - As of 10.11 it is not generally necessary to take explicit action to
      achieve visual atomicity. +[NSAnimationContext runAnimationGroup:] and other
      similar methods can be used when a stronger than normal need for visual atomicity
      is required. The NSAnimationContext methods do not suffer from the same performance
      problems as NSEnableScreenUpdates. [-Wdeprecated-declarations]
      NSEnableScreenUpdates ();
      ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:236:20: note: 
      'NSEnableScreenUpdates' has been explicitly marked deprecated here
APPKIT_EXTERN void NSEnableScreenUpdates(void) NS_DEPRECATED_MAC(10_0, 10_11, "A...
                   ^
nsterm.m:1113:9: warning: 'lockFocus' is deprecated: first deprecated in macOS 10.14 - To
      draw, subclass NSView and implement -drawRect:; AppKit's automatic deferred display
      mechanism will call -drawRect: as necessary to display the view.
      [-Wdeprecated-declarations]
  [view lockFocus];
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:235:1: note: 
      'lockFocus' has been explicitly marked deprecated here
- (void)lockFocus NS_DEPRECATED_MAC(10_0, 10_14, "To draw, subclass NSView and im...
^
nsterm.m:1230:9: warning: 'unlockFocus' is deprecated: first deprecated in macOS 10.14 -
      To draw, subclass NSView and implement -drawRect:; AppKit's automatic deferred
      display mechanism will call -drawRect: as necessary to display the view.
      [-Wdeprecated-declarations]
  [view unlockFocus];
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:236:1: note: 
      'unlockFocus' has been explicitly marked deprecated here
- (void)unlockFocus NS_DEPRECATED_MAC(10_0, 10_14, "To draw, subclass NSView and ...
^
nsterm.m:1231:18: warning: 'flushWindow' is deprecated: first deprecated in macOS 10.14 -
      Allow AppKit's automatic deferred display mechanism to take care of flushing any
      graphics contexts as needed. [-Wdeprecated-declarations]
  [[view window] flushWindow];
                 ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSWindow.h:925:1: note: 
      'flushWindow' has been explicitly marked deprecated here
- (void)flushWindow NS_DEPRECATED_MAC(10_0, 10_14, "Allow AppKit's automatic defe...
^
nsterm.m:1261:27: warning: 'unlockFocus' is deprecated: first deprecated in macOS 10.14 -
      To draw, subclass NSView and implement -drawRect:; AppKit's automatic deferred
      display mechanism will call -drawRect: as necessary to display the view.
      [-Wdeprecated-declarations]
              [focus_view unlockFocus];
                          ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:236:1: note: 
      'unlockFocus' has been explicitly marked deprecated here
- (void)unlockFocus NS_DEPRECATED_MAC(10_0, 10_14, "To draw, subclass NSView and ...
^
nsterm.m:1262:36: warning: 'flushWindow' is deprecated: first deprecated in macOS 10.14 -
      Allow AppKit's automatic deferred display mechanism to take care of flushing any
      graphics contexts as needed. [-Wdeprecated-declarations]
              [[focus_view window] flushWindow];
                                   ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSWindow.h:925:1: note: 
      'flushWindow' has been explicitly marked deprecated here
- (void)flushWindow NS_DEPRECATED_MAC(10_0, 10_14, "Allow AppKit's automatic defe...
^
nsterm.m:1267:19: warning: 'lockFocus' is deprecated: first deprecated in macOS 10.14 -
      To draw, subclass NSView and implement -drawRect:; AppKit's automatic deferred
      display mechanism will call -drawRect: as necessary to display the view.
      [-Wdeprecated-declarations]
            [view lockFocus];
                  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:235:1: note: 
      'lockFocus' has been explicitly marked deprecated here
- (void)lockFocus NS_DEPRECATED_MAC(10_0, 10_14, "To draw, subclass NSView and im...
^
nsterm.m:1304:23: warning: 'unlockFocus' is deprecated: first deprecated in macOS 10.14 -
      To draw, subclass NSView and implement -drawRect:; AppKit's automatic deferred
      display mechanism will call -drawRect: as necessary to display the view.
      [-Wdeprecated-declarations]
          [focus_view unlockFocus];
                      ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:236:1: note: 
      'unlockFocus' has been explicitly marked deprecated here
- (void)unlockFocus NS_DEPRECATED_MAC(10_0, 10_14, "To draw, subclass NSView and ...
^
nsterm.m:1305:32: warning: 'flushWindow' is deprecated: first deprecated in macOS 10.14 -
      Allow AppKit's automatic deferred display mechanism to take care of flushing any
      graphics contexts as needed. [-Wdeprecated-declarations]
          [[focus_view window] flushWindow];
                               ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSWindow.h:925:1: note: 
      'flushWindow' has been explicitly marked deprecated here
- (void)flushWindow NS_DEPRECATED_MAC(10_0, 10_14, "Allow AppKit's automatic defe...
^
nsterm.m:2876:26: warning: 'scrollRect:by:' is deprecated: first deprecated in macOS
      10.14 - Use NSScrollView to achieve scrolling views. [-Wdeprecated-declarations]
      [FRAME_NS_VIEW (f) scrollRect: src
                         ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSView.h:260:1: note: 
      'scrollRect:by:' has been explicitly marked deprecated here
- (void)scrollRect:(NSRect)rect by:(NSSize)delta NS_DEPRECATED_MAC(10_0, 10_14, "...
^
nsterm.m:3270:3: warning: 'NSDisableScreenUpdates' is deprecated: first deprecated in
      macOS 10.11 - As of 10.11 it is not generally necessary to take explicit action to
      achieve visual atomicity. +[NSAnimationContext runAnimationGroup:] and other
      similar methods can be used when a stronger than normal need for visual atomicity
      is required. The NSAnimationContext methods do not suffer from the same performance
      problems as NSDisableScreenUpdates. [-Wdeprecated-declarations]
  NSDisableScreenUpdates ();
  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:234:20: note: 
      'NSDisableScreenUpdates' has been explicitly marked deprecated here
APPKIT_EXTERN void NSDisableScreenUpdates(void) NS_DEPRECATED_MAC(10_0, 10_11, "A...
                   ^
nsterm.m:3308:3: warning: 'NSEnableScreenUpdates' is deprecated: first deprecated in
      macOS 10.11 - As of 10.11 it is not generally necessary to take explicit action to
      achieve visual atomicity. +[NSAnimationContext runAnimationGroup:] and other
      similar methods can be used when a stronger than normal need for visual atomicity
      is required. The NSAnimationContext methods do not suffer from the same performance
      problems as NSEnableScreenUpdates. [-Wdeprecated-declarations]
  NSEnableScreenUpdates ();
  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphics.h:236:20: note: 
      'NSEnableScreenUpdates' has been explicitly marked deprecated here
APPKIT_EXTERN void NSEnableScreenUpdates(void) NS_DEPRECATED_MAC(10_0, 10_11, "A...
                   ^
nsterm.m:5353:13: warning: 'writeToFile:' is deprecated: first deprecated in macOS 10.14
      - Use -writeToURL:error: instead [-Wdeprecated-declarations]
        [cl writeToFile: nil];
            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSColorList.h:102:1: note: 
      'writeToFile:' has been explicitly marked deprecated here
- (BOOL)writeToFile:(nullable NSString *)path NS_DEPRECATED_MAC(10_0, 10_14, "Us...
^
nsterm.m:5453:47: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  ns_send_types = [[NSArray arrayWithObjects: NSStringPboardType, nil] retain];
                                              ^~~~~~~~~~~~~~~~~~
                                              NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:5454:49: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  ns_return_types = [[NSArray arrayWithObjects: NSStringPboardType, nil]
                                                ^~~~~~~~~~~~~~~~~~
                                                NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:5457:29: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
                            NSStringPboardType,
                            ^~~~~~~~~~~~~~~~~~
                            NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:5458:29: warning: 'NSTabularTextPboardType' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
                            NSTabularTextPboardType,
                            ^~~~~~~~~~~~~~~~~~~~~~~
                            NSPasteboardTypeTabularText
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:324:32: note: 
      'NSTabularTextPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSTabularTextPboardType NS_DEPRECATED_WITH_REPLACE...
                               ^
nsterm.m:5459:29: warning: 'NSFilenamesPboardType' is deprecated: first deprecated in
      macOS 10.14 - Create multiple pasteboard items with NSPasteboardTypeFileURL or
      kUTTypeFileURL instead [-Wdeprecated-declarations]
                            NSFilenamesPboardType,
                            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:321:32: note: 
      'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType NS_DEPRECATED_MAC(10_0, 10_1...
                               ^
nsterm.m:5460:29: warning: 'NSURLPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
                            NSURLPboardType, nil] retain];
                            ^~~~~~~~~~~~~~~
                            NSPasteboardTypeURL
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:330:32: note: 
      'NSURLPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSURLPboardType NS_DEPRECATED_WITH_REPLACEMENT_MAC...
                               ^
nsterm.m:8246:35: warning: 'NSFilenamesPboardType' is deprecated: first deprecated in
      macOS 10.14 - Create multiple pasteboard items with NSPasteboardTypeFileURL or
      kUTTypeFileURL instead [-Wdeprecated-declarations]
  else if ([type isEqualToString: NSFilenamesPboardType])
                                  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:321:32: note: 
      'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType NS_DEPRECATED_MAC(10_0, 10_1...
                               ^
nsterm.m:8267:35: warning: 'NSURLPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  else if ([type isEqualToString: NSURLPboardType])
                                  ^~~~~~~~~~~~~~~
                                  NSPasteboardTypeURL
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:330:32: note: 
      'NSURLPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSURLPboardType NS_DEPRECATED_WITH_REPLACEMENT_MAC...
                               ^
nsterm.m:8289:35: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  else if ([type isEqualToString: NSStringPboardType]
                                  ^~~~~~~~~~~~~~~~~~
                                  NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:8290:38: warning: 'NSTabularTextPboardType' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
           || [type isEqualToString: NSTabularTextPboardType])
                                     ^~~~~~~~~~~~~~~~~~~~~~~
                                     NSPasteboardTypeTabularText
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:324:32: note: 
      'NSTabularTextPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSTabularTextPboardType NS_DEPRECATED_WITH_REPLACE...
                               ^
nsterm.m:8352:29: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  if ([types containsObject:NSStringPboardType] == NO) {
                            ^~~~~~~~~~~~~~~~~~
                            NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:8366:44: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  typesDeclared = [NSArray arrayWithObject:NSStringPboardType];
                                           ^~~~~~~~~~~~~~~~~~
                                           NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsterm.m:9028:10: warning: 'NSScrollerDecrementLine' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
    case NSScrollerDecrementLine:
         ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSScroller.h:24:5: note: 
      'NSScrollerDecrementLine' has been explicitly marked deprecated here
    NSScrollerDecrementLine NS_ENUM_DEPRECATED_MAC(10_0, 10_14) = 4,
    ^
nsterm.m:9030:10: warning: 'NSScrollerIncrementLine' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
    case NSScrollerIncrementLine:
         ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSScroller.h:25:5: note: 
      'NSScrollerIncrementLine' has been explicitly marked deprecated here
    NSScrollerIncrementLine NS_ENUM_DEPRECATED_MAC(10_0, 10_14) = 5,
    ^
29 warnings generated.
  CC       nsfns.o
  CC       nsmenu.o
nsmenu.m:670:25: warning: 'NSOnState' is deprecated: first deprecated in macOS 10.14
      [-Wdeprecated-declarations]
        [item setState: NSOnState];
                        ^~~~~~~~~
                        NSControlStateValueOn
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSCell.h:80:34: note: 
      'NSOnState' has been explicitly marked deprecated here
static const NSControlStateValue NSOnState NS_DEPRECATED_WITH_REPLACEMENT_MAC("NS...
                                 ^
nsmenu.m:672:25: warning: 'NSOffState' is deprecated: first deprecated in macOS 10.14
      [-Wdeprecated-declarations]
        [item setState: NSOffState];
                        ^~~~~~~~~~
                        NSControlStateValueOff
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSCell.h:79:34: note: 
      'NSOffState' has been explicitly marked deprecated here
static const NSControlStateValue NSOffState NS_DEPRECATED_WITH_REPLACEMENT_MAC("N...
                                 ^
nsmenu.m:1596:24: warning: 'NSRoundedBezelStyle' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  [cell setBezelStyle: NSRoundedBezelStyle];
                       ^~~~~~~~~~~~~~~~~~~
                       NSBezelStyleRounded
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSButtonCell.h:181:27: note: 
      'NSRoundedBezelStyle' has been explicitly marked deprecated here
static const NSBezelStyle NSRoundedBezelStyle NS_DEPRECATED_WITH_REPLACEMENT_MAC(...
                          ^
nsmenu.m:1609:9: warning: 'setOneShot:' is deprecated: first deprecated in macOS 10.14 -
      This property does not do anything and should not be used
      [-Wdeprecated-declarations]
  [self setOneShot: YES];
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSWindow.h:933:35: note: 
      property 'oneShot' is declared deprecated here
@property (getter=isOneShot) BOOL oneShot NS_DEPRECATED_MAC(10_0, 10_14, "This pr...
                                  ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSWindow.h:933:35: note: 
      'setOneShot:' has been explicitly marked deprecated here
4 warnings generated.
  CC       nsselect.o
nsselect.m:60:38: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  if (EQ (sym, QTEXT))        return NSStringPboardType;
                                     ^~~~~~~~~~~~~~~~~~
                                     NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsselect.m:79:27: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  if ([t isEqualToString: NSStringPboardType])
                          ^~~~~~~~~~~~~~~~~~
                          NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsselect.m:81:27: warning: 'NSFilenamesPboardType' is deprecated: first deprecated in
      macOS 10.14 - Create multiple pasteboard items with NSPasteboardTypeFileURL or
      kUTTypeFileURL instead [-Wdeprecated-declarations]
  if ([t isEqualToString: NSFilenamesPboardType])
                          ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:321:32: note: 
      'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType NS_DEPRECATED_MAC(10_0, 10_1...
                               ^
nsselect.m:83:27: warning: 'NSTabularTextPboardType' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
  if ([t isEqualToString: NSTabularTextPboardType])
                          ^~~~~~~~~~~~~~~~~~~~~~~
                          NSPasteboardTypeTabularText
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:324:32: note: 
      'NSTabularTextPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSTabularTextPboardType NS_DEPRECATED_WITH_REPLACE...
                               ^
nsselect.m:196:22: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
          eassert (gtype == NSStringPboardType);
                            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsselect.m:348:10: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
  type = NSStringPboardType;
         ^~~~~~~~~~~~~~~~~~
         NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsselect.m:475:36: warning: 'NSStringPboardType' is deprecated: first deprecated in macOS
      10.14 [-Wdeprecated-declarations]
             [NSNumber numberWithLong:0], NSStringPboardType,
                                          ^~~~~~~~~~~~~~~~~~
                                          NSPasteboardTypeString
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:320:32: note: 
      'NSStringPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSStringPboardType NS_DEPRECATED_WITH_REPLACEMENT_...
                               ^
nsselect.m:476:36: warning: 'NSFilenamesPboardType' is deprecated: first deprecated in
      macOS 10.14 - Create multiple pasteboard items with NSPasteboardTypeFileURL or
      kUTTypeFileURL instead [-Wdeprecated-declarations]
             [NSNumber numberWithLong:0], NSFilenamesPboardType,
                                          ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:321:32: note: 
      'NSFilenamesPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSFilenamesPboardType NS_DEPRECATED_MAC(10_0, 10_1...
                               ^
nsselect.m:477:36: warning: 'NSTabularTextPboardType' is deprecated: first deprecated in
      macOS 10.14 [-Wdeprecated-declarations]
             [NSNumber numberWithLong:0], NSTabularTextPboardType,
                                          ^~~~~~~~~~~~~~~~~~~~~~~
                                          NSPasteboardTypeTabularText
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSPasteboard.h:324:32: note: 
      'NSTabularTextPboardType' has been explicitly marked deprecated here
APPKIT_EXTERN NSPasteboardType NSTabularTextPboardType NS_DEPRECATED_WITH_REPLACE...
                               ^
9 warnings generated.
  CC       nsimage.o
nsimage.m:312:14: warning: 'colorSpaceName' is deprecated: first deprecated in macOS
      10.14 - Use -type and NSColorType instead [-Wdeprecated-declarations]
  if ([color colorSpaceName] != NSCalibratedRGBColorSpace)
             ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSColor.h:393:45: note: 
      property 'colorSpaceName' is declared deprecated here
@property (readonly, copy) NSColorSpaceName colorSpaceName NS_DEPRECATED_MAC(10_0...
                                            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSColor.h:393:45: note: 
      'colorSpaceName' has been explicitly marked deprecated here
nsimage.m:313:23: warning: 'colorUsingColorSpaceName:' is deprecated: first deprecated in
      macOS 10.14 - Use -colorUsingType: or -colorUsingColorSpace: instead
      [-Wdeprecated-declarations]
    rgbColor = [color colorUsingColorSpaceName: NSCalibratedRGBColorSpace];
                      ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSColor.h:405:1: note: 
      'colorUsingColorSpaceName:' has been explicitly marked deprecated here
- (nullable NSColor *)colorUsingColorSpaceName:(NSColorSpaceName)name NS_DEPRECAT...
^
2 warnings generated.
  CC       macfont.o
macfont.m:2822:49: warning: 'graphicsPort' is deprecated: first deprecated in macOS 10.14
      [-Wdeprecated-declarations]
  context = [[NSGraphicsContext currentContext] graphicsPort];
                                                ^~~~~~~~~~~~
                                                CGContext
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphicsContext.h:111:28: note: 
      property 'graphicsPort' is declared deprecated here
@property (readonly) void *graphicsPort NS_RETURNS_INNER_POINTER NS_DEPRECATED_WI...
                           ^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSGraphicsContext.h:111:28: note: 
      'graphicsPort' has been explicitly marked deprecated here
1 warning generated.
  CC       terminfo.o
  CC       lastfile.o
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C ../admin/charsets all
  GEN      ../../etc/charsets/JISX2131.map
  GEN      charsets.stamp
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C ../admin/unidata charscript.el
make[3]: Nothing to be done for `charscript.el'.
  CCLD     temacs
../build-aux/install-sh -c -d ../etc
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C ../lisp update-subdirs
./temacs --batch  --load loadup bootstrap
Loading loadup.el (source)...
Using load-path (/Users/keith/Source/emacs/lisp /Users/keith/Source/emacs/lisp/emacs-lisp /Users/keith/Source/emacs/lisp/progmodes /Users/keith/Source/emacs/lisp/language /Users/keith/Source/emacs/lisp/international /Users/keith/Source/emacs/lisp/textmodes /Users/keith/Source/emacs/lisp/vc)


> On Jun 19, 2018, at 4:25 PM, GNU bug Tracking System <help-debbugs@gnu.org> wrote:
> 
> Thank you for filing a new bug report with debbugs.gnu.org.
> 
> This is an automatically generated reply to let you know your message
> has been received.
> 
> Your message is being forwarded to the package maintainers and other
> interested parties for their attention; they will reply in due course.
> 
> Your message has been sent to the package maintainer(s):
> bug-gnu-emacs@gnu.org
> 
> If you wish to submit further information on this problem, please
> send it to 31904@debbugs.gnu.org.
> 
> Please do not send mail to help-debbugs@gnu.org unless you wish
> to report a problem with the Bug-tracking system.
> 
> -- 
> 31904: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=31904
> GNU Bug Tracking System
> Contact help-debbugs@gnu.org with problems






^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-06-19 23:09 bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave zentrope@fastmail.fm
  2018-06-20 19:00 ` Alan Third
       [not found] ` <handler.31904.B.152945065229583.ack@debbugs.gnu.org>
@ 2018-08-15 23:54 ` zentrope@fastmail.fm
  2018-08-18 14:02   ` Alan Third
  2018-09-19 16:36 ` bug#31904: bug##31904 Zack Piper
  2019-09-28 17:54 ` bug#31904: scatch/ns-drawing Stefan Kangas
  4 siblings, 1 reply; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-15 23:54 UTC (permalink / raw)
  To: 31904

[-- Attachment #1: Type: text/plain, Size: 214 bytes --]

For what it’s worth, the scratch/ns-drawing branch has fixed this for me.

    https://github.com/emacs-mirror/emacs/tree/scratch/ns-drawing <https://github.com/emacs-mirror/emacs/tree/scratch/ns-drawing>



[-- Attachment #2: Type: text/html, Size: 557 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-15 23:54 ` bug#31904: scatch/ns-drawing zentrope@fastmail.fm
@ 2018-08-18 14:02   ` Alan Third
  2018-08-18 18:56     ` zentrope@fastmail.fm
  0 siblings, 1 reply; 16+ messages in thread
From: Alan Third @ 2018-08-18 14:02 UTC (permalink / raw)
  To: zentrope@fastmail.fm; +Cc: 31904

[-- Attachment #1: Type: text/plain, Size: 595 bytes --]

On Wed, Aug 15, 2018 at 04:54:26PM -0700, zentrope@fastmail.fm wrote:
> For what it’s worth, the scratch/ns-drawing branch has fixed this for me.
> 
>     https://github.com/emacs-mirror/emacs/tree/scratch/ns-drawing <https://github.com/emacs-mirror/emacs/tree/scratch/ns-drawing>

Thanks for the confirmation.

I think I’ll have to port it to Emacs 26. It’s quite a large change,
but if Emacs 26 in its current form simply doesn’t work at all with
the next release of macOS I don’t see that we have much choice.

Can you please try the attached patch against emacs-26?
-- 
Alan Third

[-- Attachment #2: 0001-Force-all-NS-drawing-to-be-done-from-drawRect.patch --]
[-- Type: text/plain, Size: 34112 bytes --]

From 9e71b4aa4ece9ced6b888db403e9ae027501a625 Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
Date: Sat, 4 Aug 2018 11:08:23 +0100
Subject: [PATCH] Force all NS drawing to be done from drawRect:

* src/nsterm.m (ns_update_begin): Don't lock focus, only clip if there
is already a view focused.
(ns_update_end): Don't mess with view focusing any more.
(ns_focus): Only clip drawing if there is already a focused view,
otherwise mark area dirty for later drawing.
(ns_unfocus): Don't unfocus the view any more.
(ns_clip_to_row): Update to match ns_focus.
(ns_clear_frame):
(ns_clear_frame_area):
(ns_draw_fringe_bitmap):
(ns_draw_window_cursor):
(ns_draw_vertical_window_border):
(ns_draw_window_divider):
(ns_dumpglyphs_stretch):
(ns_draw_glyph_string): Only draw if ns_focus or ns_clip_to_row
return YES.
(ns_copy_bits): Remove superfluous calls to ns_(un)focus.
(ns_flush_display): New function.
---
 src/nsterm.m | 736 +++++++++++++++++++++++++--------------------------
 1 file changed, 365 insertions(+), 371 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 5ed71c9f8f..b36d847eb3 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -276,8 +276,6 @@ - (NSColor *)colorUsingDefaultColorSpace
 long context_menu_value = 0;
 
 /* display update */
-static struct frame *ns_updating_frame;
-static NSView *focus_view = NULL;
 static int ns_window_num = 0;
 #ifdef NS_IMPL_GNUSTEP
 static NSRect uRect;            // TODO: This is dead, remove it?
@@ -1055,30 +1053,29 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
   }
 #endif
 
-  ns_updating_frame = f;
-  [view lockFocus];
-
   /* drawRect may have been called for say the minibuffer, and then clip path
      is for the minibuffer.  But the display engine may draw more because
      we have set the frame as garbaged.  So reset clip path to the whole
      view.  */
+  /* FIXME: I don't think we need to do this.  */
 #ifdef NS_IMPL_COCOA
-  {
-    NSBezierPath *bp;
-    NSRect r = [view frame];
-    NSRect cr = [[view window] frame];
-    /* If a large frame size is set, r may be larger than the window frame
-       before constrained.  In that case don't change the clip path, as we
-       will clear in to the tool bar and title bar.  */
-    if (r.size.height
-        + FRAME_NS_TITLEBAR_HEIGHT (f)
-        + FRAME_TOOLBAR_HEIGHT (f) <= cr.size.height)
-      {
-        bp = [[NSBezierPath bezierPathWithRect: r] retain];
-        [bp setClip];
-        [bp release];
-      }
-  }
+  if ([NSView focusView] == FRAME_NS_VIEW (f))
+    {
+      NSBezierPath *bp;
+      NSRect r = [view frame];
+      NSRect cr = [[view window] frame];
+      /* If a large frame size is set, r may be larger than the window frame
+         before constrained.  In that case don't change the clip path, as we
+         will clear in to the tool bar and title bar.  */
+      if (r.size.height
+          + FRAME_NS_TITLEBAR_HEIGHT (f)
+          + FRAME_TOOLBAR_HEIGHT (f) <= cr.size.height)
+        {
+          bp = [[NSBezierPath bezierPathWithRect: r] retain];
+          [bp setClip];
+          [bp release];
+        }
+    }
 #endif
 
 #ifdef NS_IMPL_GNUSTEP
@@ -1164,23 +1161,14 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
    external (RIF) call; for whole frame, called after update_window_end
    -------------------------------------------------------------------------- */
 {
-  EmacsView *view = FRAME_NS_VIEW (f);
-
   NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_end");
 
 /*   if (f == MOUSE_HL_INFO (f)->mouse_face_mouse_frame) */
   MOUSE_HL_INFO (f)->mouse_face_defer = 0;
-
-  block_input ();
-
-  [view unlockFocus];
-  [[view window] flushWindow];
-
-  unblock_input ();
-  ns_updating_frame = NULL;
 }
 
-static void
+
+static BOOL
 ns_focus (struct frame *f, NSRect *r, int n)
 /* --------------------------------------------------------------------------
    Internal: Focus on given frame.  During small local updates this is used to
@@ -1192,48 +1180,38 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
    -------------------------------------------------------------------------- */
 {
   NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_focus");
-  if (r != NULL)
+  if (r)
     {
       NSTRACE_RECT ("r", *r);
-    }
 
-  if (f != ns_updating_frame)
-    {
-      NSView *view = FRAME_NS_VIEW (f);
-      if (view != focus_view)
+      if ([NSView focusView] == FRAME_NS_VIEW (f))
         {
-          if (focus_view != NULL)
-            {
-              [focus_view unlockFocus];
-              [[focus_view window] flushWindow];
-/*debug_lock--; */
-            }
+          [[NSGraphicsContext currentContext] saveGraphicsState];
+          if (n == 2)
+            NSRectClipList (r, 2);
+          else
+            NSRectClip (*r);
+          gsaved = YES;
 
-          if (view)
-            [view lockFocus];
-          focus_view = view;
-/*if (view) debug_lock++; */
+          return YES;
         }
-    }
-
-  /* clipping */
-  if (r)
-    {
-      [[NSGraphicsContext currentContext] saveGraphicsState];
-      if (n == 2)
-        NSRectClipList (r, 2);
       else
-        NSRectClip (*r);
-      gsaved = YES;
+        {
+          NSView *view = FRAME_NS_VIEW (f);
+          int i;
+          for (i = 0 ; i < n ; i++)
+            [view setNeedsDisplayInRect:r[i]];
+        }
     }
+
+  return NO;
 }
 
 
 static void
 ns_unfocus (struct frame *f)
-/* --------------------------------------------------------------------------
-     Internal: Remove focus on given frame
-   -------------------------------------------------------------------------- */
+/* Internal: Restore the previous graphics state, unsetting any
+   clipping areas.  */
 {
   NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_unfocus");
 
@@ -1242,21 +1220,10 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
       [[NSGraphicsContext currentContext] restoreGraphicsState];
       gsaved = NO;
     }
-
-  if (f != ns_updating_frame)
-    {
-      if (focus_view != NULL)
-        {
-          [focus_view unlockFocus];
-          [[focus_view window] flushWindow];
-          focus_view = NULL;
-/*debug_lock--; */
-        }
-    }
 }
 
 
-static void
+static BOOL
 ns_clip_to_row (struct window *w, struct glyph_row *row,
 		enum glyph_row_area area, BOOL gc)
 /* --------------------------------------------------------------------------
@@ -1275,7 +1242,17 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
   clip_rect.size.width = window_width;
   clip_rect.size.height = row->visible_height;
 
-  ns_focus (f, &clip_rect, 1);
+  return ns_focus (f, &clip_rect, 1);
+}
+
+
+static void
+ns_flush_display (struct frame *f)
+/* Force the frame to redisplay.  If areas have previously been marked
+   dirty by setNeedsDisplayInRect (in ns_focus), then this will call
+   draw_rect: which will "expose" those areas.  */
+{
+  [FRAME_NS_VIEW (f) displayIfNeeded];
 }
 
 
@@ -2699,14 +2676,16 @@ so some key presses (TAB) are swallowed by the system. */
   r = [view bounds];
 
   block_input ();
-  ns_focus (f, &r, 1);
-  [ns_lookup_indexed_color (NS_FACE_BACKGROUND
-			    (FACE_FROM_ID (f, DEFAULT_FACE_ID)), f) set];
-  NSRectFill (r);
-  ns_unfocus (f);
-
-  /* as of 2006/11 or so this is now needed */
-  ns_redraw_scroll_bars (f);
+  if (ns_focus (f, &r, 1))
+    {
+      [ns_lookup_indexed_color (NS_FACE_BACKGROUND
+                                (FACE_FROM_ID (f, DEFAULT_FACE_ID)), f) set];
+      NSRectFill (r);
+      ns_unfocus (f);
+
+      /* as of 2006/11 or so this is now needed */
+      ns_redraw_scroll_bars (f);
+    }
   unblock_input ();
 }
 
@@ -2727,13 +2706,14 @@ so some key presses (TAB) are swallowed by the system. */
   NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_clear_frame_area");
 
   r = NSIntersectionRect (r, [view frame]);
-  ns_focus (f, &r, 1);
-  [ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f) set];
+  if (ns_focus (f, &r, 1))
+    {
+      [ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f) set];
 
-  NSRectFill (r);
+      NSRectFill (r);
 
-  ns_unfocus (f);
-  return;
+      ns_unfocus (f);
+    }
 }
 
 static void
@@ -2745,11 +2725,11 @@ so some key presses (TAB) are swallowed by the system. */
     {
       hide_bell();              // Ensure the bell image isn't scrolled.
 
-      ns_focus (f, &dest, 1);
+      /* FIXME: scrollRect:by: is deprecated in macOS 10.14.  There is
+         no obvious replacement so we may have to come up with our own.  */
       [FRAME_NS_VIEW (f) scrollRect: src
                                  by: NSMakeSize (dest.origin.x - src.origin.x,
                                                  dest.origin.y - src.origin.y)];
-      ns_unfocus (f);
     }
 }
 
@@ -2960,85 +2940,86 @@ so some key presses (TAB) are swallowed by the system. */
     }
 
   /* Must clip because of partially visible lines.  */
-  ns_clip_to_row (w, row, ANY_AREA, YES);
-
-  if (!p->overlay_p)
+  if (ns_clip_to_row (w, row, ANY_AREA, YES))
     {
-      int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
-
-      if (bx >= 0 && nx > 0)
+      if (!p->overlay_p)
         {
-          NSRect r = NSMakeRect (bx, by, nx, ny);
-          NSRectClip (r);
-          [ns_lookup_indexed_color (face->background, f) set];
-          NSRectFill (r);
-        }
-    }
-
-  if (p->which)
-    {
-      NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
-      EmacsImage *img = bimgs[p->which - 1];
+          int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
 
-      if (!img)
-        {
-          // Note: For "periodic" images, allocate one EmacsImage for
-          // the base image, and use it for all dh:s.
-          unsigned short *bits = p->bits;
-          int full_height = p->h + p->dh;
-          int i;
-          unsigned char *cbits = xmalloc (full_height);
-
-          for (i = 0; i < full_height; i++)
-            cbits[i] = bits[i];
-          img = [[EmacsImage alloc] initFromXBM: cbits width: 8
-                                         height: full_height
-                                             fg: 0 bg: 0];
-          bimgs[p->which - 1] = img;
-          xfree (cbits);
+          if (bx >= 0 && nx > 0)
+            {
+              NSRect r = NSMakeRect (bx, by, nx, ny);
+              NSRectClip (r);
+              [ns_lookup_indexed_color (face->background, f) set];
+              NSRectFill (r);
+            }
         }
 
-      NSTRACE_RECT ("r", r);
+      if (p->which)
+        {
+          NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
+          EmacsImage *img = bimgs[p->which - 1];
 
-      NSRectClip (r);
-      /* Since we composite the bitmap instead of just blitting it, we need
-         to erase the whole background. */
-      [ns_lookup_indexed_color(face->background, f) set];
-      NSRectFill (r);
+          if (!img)
+            {
+              // Note: For "periodic" images, allocate one EmacsImage for
+              // the base image, and use it for all dh:s.
+              unsigned short *bits = p->bits;
+              int full_height = p->h + p->dh;
+              int i;
+              unsigned char *cbits = xmalloc (full_height);
+
+              for (i = 0; i < full_height; i++)
+                cbits[i] = bits[i];
+              img = [[EmacsImage alloc] initFromXBM: cbits width: 8
+                                             height: full_height
+                                                 fg: 0 bg: 0];
+              bimgs[p->which - 1] = img;
+              xfree (cbits);
+            }
 
-      {
-        NSColor *bm_color;
-        if (!p->cursor_p)
-          bm_color = ns_lookup_indexed_color(face->foreground, f);
-        else if (p->overlay_p)
-          bm_color = ns_lookup_indexed_color(face->background, f);
-        else
-          bm_color = f->output_data.ns->cursor_color;
-        [img setXBMColor: bm_color];
-      }
+          NSTRACE_RECT ("r", r);
 
-#ifdef NS_IMPL_COCOA
-      // Note: For periodic images, the full image height is "h + hd".
-      // By using the height h, a suitable part of the image is used.
-      NSRect fromRect = NSMakeRect(0, 0, p->wd, p->h);
+          NSRectClip (r);
+          /* Since we composite the bitmap instead of just blitting it, we need
+             to erase the whole background.  */
+          [ns_lookup_indexed_color(face->background, f) set];
+          NSRectFill (r);
 
-      NSTRACE_RECT ("fromRect", fromRect);
+          {
+            NSColor *bm_color;
+            if (!p->cursor_p)
+              bm_color = ns_lookup_indexed_color(face->foreground, f);
+            else if (p->overlay_p)
+              bm_color = ns_lookup_indexed_color(face->background, f);
+            else
+              bm_color = f->output_data.ns->cursor_color;
+            [img setXBMColor: bm_color];
+          }
 
-      [img drawInRect: r
-              fromRect: fromRect
-             operation: NSCompositingOperationSourceOver
-              fraction: 1.0
-           respectFlipped: YES
-                hints: nil];
+#ifdef NS_IMPL_COCOA
+          // Note: For periodic images, the full image height is "h + hd".
+          // By using the height h, a suitable part of the image is used.
+          NSRect fromRect = NSMakeRect(0, 0, p->wd, p->h);
+
+          NSTRACE_RECT ("fromRect", fromRect);
+
+          [img drawInRect: r
+                 fromRect: fromRect
+                operation: NSCompositingOperationSourceOver
+                 fraction: 1.0
+               respectFlipped: YES
+                    hints: nil];
 #else
-      {
-        NSPoint pt = r.origin;
-        pt.y += p->h;
-        [img compositeToPoint: pt operation: NSCompositingOperationSourceOver];
-      }
+          {
+            NSPoint pt = r.origin;
+            pt.y += p->h;
+            [img compositeToPoint: pt operation: NSCompositingOperationSourceOver];
+          }
 #endif
+        }
+      ns_unfocus (f);
     }
-  ns_unfocus (f);
 }
 
 
@@ -3120,67 +3101,66 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
   r.size.height = h;
   r.size.width = w->phys_cursor_width;
 
-  /* Prevent the cursor from being drawn outside the text area. */
-  ns_clip_to_row (w, glyph_row, TEXT_AREA, NO); /* do ns_focus(f, &r, 1); if remove */
-
-
-  face = FACE_FROM_ID_OR_NULL (f, phys_cursor_glyph->face_id);
-  if (face && NS_FACE_BACKGROUND (face)
-      == ns_index_color (FRAME_CURSOR_COLOR (f), f))
+  /* Prevent the cursor from being drawn outside the text area.  */
+  if (ns_clip_to_row (w, glyph_row, TEXT_AREA, NO))
     {
-      [ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), f) set];
-      hollow_color = FRAME_CURSOR_COLOR (f);
-    }
-  else
-    [FRAME_CURSOR_COLOR (f) set];
+      face = FACE_FROM_ID_OR_NULL (f, phys_cursor_glyph->face_id);
+      if (face && NS_FACE_BACKGROUND (face)
+          == ns_index_color (FRAME_CURSOR_COLOR (f), f))
+        {
+          [ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), f) set];
+          hollow_color = FRAME_CURSOR_COLOR (f);
+        }
+      else
+        [FRAME_CURSOR_COLOR (f) set];
 
 #ifdef NS_IMPL_COCOA
-  /* TODO: This makes drawing of cursor plus that of phys_cursor_glyph
-           atomic.  Cleaner ways of doing this should be investigated.
-           One way would be to set a global variable DRAWING_CURSOR
-  	   when making the call to draw_phys..(), don't focus in that
-  	   case, then move the ns_unfocus() here after that call. */
-  NSDisableScreenUpdates ();
+      /* TODO: This makes drawing of cursor plus that of phys_cursor_glyph
+         atomic.  Cleaner ways of doing this should be investigated.
+         One way would be to set a global variable DRAWING_CURSOR
+         when making the call to draw_phys..(), don't focus in that
+         case, then move the ns_unfocus() here after that call.  */
+      NSDisableScreenUpdates ();
 #endif
 
-  switch (cursor_type)
-    {
-    case DEFAULT_CURSOR:
-    case NO_CURSOR:
-      break;
-    case FILLED_BOX_CURSOR:
-      NSRectFill (r);
-      break;
-    case HOLLOW_BOX_CURSOR:
-      NSRectFill (r);
-      [hollow_color set];
-      NSRectFill (NSInsetRect (r, 1, 1));
-      [FRAME_CURSOR_COLOR (f) set];
-      break;
-    case HBAR_CURSOR:
-      NSRectFill (r);
-      break;
-    case BAR_CURSOR:
-      s = r;
-      /* If the character under cursor is R2L, draw the bar cursor
-         on the right of its glyph, rather than on the left.  */
-      cursor_glyph = get_phys_cursor_glyph (w);
-      if ((cursor_glyph->resolved_level & 1) != 0)
-        s.origin.x += cursor_glyph->pixel_width - s.size.width;
-
-      NSRectFill (s);
-      break;
-    }
-  ns_unfocus (f);
+      switch (cursor_type)
+        {
+        case DEFAULT_CURSOR:
+        case NO_CURSOR:
+          break;
+        case FILLED_BOX_CURSOR:
+          NSRectFill (r);
+          break;
+        case HOLLOW_BOX_CURSOR:
+          NSRectFill (r);
+          [hollow_color set];
+          NSRectFill (NSInsetRect (r, 1, 1));
+          [FRAME_CURSOR_COLOR (f) set];
+          break;
+        case HBAR_CURSOR:
+          NSRectFill (r);
+          break;
+        case BAR_CURSOR:
+          s = r;
+          /* If the character under cursor is R2L, draw the bar cursor
+             on the right of its glyph, rather than on the left.  */
+          cursor_glyph = get_phys_cursor_glyph (w);
+          if ((cursor_glyph->resolved_level & 1) != 0)
+            s.origin.x += cursor_glyph->pixel_width - s.size.width;
+
+          NSRectFill (s);
+          break;
+        }
+      ns_unfocus (f);
 
-  /* draw the character under the cursor */
-  if (cursor_type != NO_CURSOR)
-    draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+      /* draw the character under the cursor */
+      if (cursor_type != NO_CURSOR)
+        draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
 
 #ifdef NS_IMPL_COCOA
-  NSEnableScreenUpdates ();
+      NSEnableScreenUpdates ();
 #endif
-
+    }
 }
 
 
@@ -3198,12 +3178,14 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
 
   face = FACE_FROM_ID_OR_NULL (f, VERTICAL_BORDER_FACE_ID);
 
-  ns_focus (f, &r, 1);
-  if (face)
-    [ns_lookup_indexed_color(face->foreground, f) set];
+  if (ns_focus (f, &r, 1))
+    {
+      if (face)
+        [ns_lookup_indexed_color(face->foreground, f) set];
 
-  NSRectFill(r);
-  ns_unfocus (f);
+      NSRectFill(r);
+      ns_unfocus (f);
+    }
 }
 
 
@@ -3230,39 +3212,40 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
 
   NSTRACE ("ns_draw_window_divider");
 
-  ns_focus (f, &divider, 1);
-
-  if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
-    /* A vertical divider, at least three pixels wide: Draw first and
-       last pixels differently.  */
-    {
-      [ns_lookup_indexed_color(color_first, f) set];
-      NSRectFill(NSMakeRect (x0, y0, 1, y1 - y0));
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(NSMakeRect (x0 + 1, y0, x1 - x0 - 2, y1 - y0));
-      [ns_lookup_indexed_color(color_last, f) set];
-      NSRectFill(NSMakeRect (x1 - 1, y0, 1, y1 - y0));
-    }
-  else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
-    /* A horizontal divider, at least three pixels high: Draw first and
-       last pixels differently.  */
+  if (ns_focus (f, &divider, 1))
     {
-      [ns_lookup_indexed_color(color_first, f) set];
-      NSRectFill(NSMakeRect (x0, y0, x1 - x0, 1));
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(NSMakeRect (x0, y0 + 1, x1 - x0, y1 - y0 - 2));
-      [ns_lookup_indexed_color(color_last, f) set];
-      NSRectFill(NSMakeRect (x0, y1 - 1, x1 - x0, 1));
-    }
-  else
-    {
-      /* In any other case do not draw the first and last pixels
-         differently.  */
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(divider);
-    }
+      if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
+        /* A vertical divider, at least three pixels wide: Draw first and
+           last pixels differently.  */
+        {
+          [ns_lookup_indexed_color(color_first, f) set];
+          NSRectFill(NSMakeRect (x0, y0, 1, y1 - y0));
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(NSMakeRect (x0 + 1, y0, x1 - x0 - 2, y1 - y0));
+          [ns_lookup_indexed_color(color_last, f) set];
+          NSRectFill(NSMakeRect (x1 - 1, y0, 1, y1 - y0));
+        }
+      else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
+        /* A horizontal divider, at least three pixels high: Draw first and
+           last pixels differently.  */
+        {
+          [ns_lookup_indexed_color(color_first, f) set];
+          NSRectFill(NSMakeRect (x0, y0, x1 - x0, 1));
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(NSMakeRect (x0, y0 + 1, x1 - x0, y1 - y0 - 2));
+          [ns_lookup_indexed_color(color_last, f) set];
+          NSRectFill(NSMakeRect (x0, y1 - 1, x1 - x0, 1));
+        }
+      else
+        {
+          /* In any other case do not draw the first and last pixels
+             differently.  */
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(divider);
+        }
 
-  ns_unfocus (f);
+      ns_unfocus (f);
+    }
 }
 
 static void
@@ -3846,83 +3829,84 @@ Function modeled after x_draw_glyph_string_box ().
       n = ns_get_glyph_string_clip_rect (s, r);
       *r = NSMakeRect (s->x, s->y, s->background_width, s->height);
 
-      ns_focus (s->f, r, n);
-
-      if (s->hl == DRAW_MOUSE_FACE)
-       {
-         face = FACE_FROM_ID_OR_NULL (s->f,
-				      MOUSE_HL_INFO (s->f)->mouse_face_face_id);
-         if (!face)
-           face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
-       }
-      else
-       face = FACE_FROM_ID (s->f, s->first_glyph->face_id);
-
-      bgCol = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f);
-      fgCol = ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f);
-
-      for (i = 0; i < n; ++i)
+      if (ns_focus (s->f, r, n))
         {
-          if (!s->row->full_width_p)
+          if (s->hl == DRAW_MOUSE_FACE)
             {
-	      int overrun, leftoverrun;
-
-              /* truncate to avoid overwriting fringe and/or scrollbar */
-	      overrun = max (0, (s->x + s->background_width)
-			     - (WINDOW_BOX_RIGHT_EDGE_X (s->w)
-				- WINDOW_RIGHT_FRINGE_WIDTH (s->w)));
-              r[i].size.width -= overrun;
-
-	      /* truncate to avoid overwriting to left of the window box */
-	      leftoverrun = (WINDOW_BOX_LEFT_EDGE_X (s->w)
-			     + WINDOW_LEFT_FRINGE_WIDTH (s->w)) - s->x;
-
-	      if (leftoverrun > 0)
-		{
-		  r[i].origin.x += leftoverrun;
-		  r[i].size.width -= leftoverrun;
-		}
-
-              /* XXX: Try to work between problem where a stretch glyph on
-                 a partially-visible bottom row will clear part of the
-                 modeline, and another where list-buffers headers and similar
-                 rows erroneously have visible_height set to 0.  Not sure
-                 where this is coming from as other terms seem not to show. */
-              r[i].size.height = min (s->height, s->row->visible_height);
+              face = FACE_FROM_ID_OR_NULL (s->f,
+                                           MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+              if (!face)
+                face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
             }
+          else
+            face = FACE_FROM_ID (s->f, s->first_glyph->face_id);
 
-          [bgCol set];
+          bgCol = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f);
+          fgCol = ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f);
 
-          /* NOTE: under NS this is NOT used to draw cursors, but we must avoid
-             overwriting cursor (usually when cursor on a tab) */
-          if (s->hl == DRAW_CURSOR)
+          for (i = 0; i < n; ++i)
             {
-              CGFloat x, width;
+              if (!s->row->full_width_p)
+                {
+                  int overrun, leftoverrun;
+
+                  /* truncate to avoid overwriting fringe and/or scrollbar */
+                  overrun = max (0, (s->x + s->background_width)
+                                 - (WINDOW_BOX_RIGHT_EDGE_X (s->w)
+                                    - WINDOW_RIGHT_FRINGE_WIDTH (s->w)));
+                  r[i].size.width -= overrun;
+
+                  /* truncate to avoid overwriting to left of the window box */
+                  leftoverrun = (WINDOW_BOX_LEFT_EDGE_X (s->w)
+                                 + WINDOW_LEFT_FRINGE_WIDTH (s->w)) - s->x;
+
+                    if (leftoverrun > 0)
+                      {
+                        r[i].origin.x += leftoverrun;
+                        r[i].size.width -= leftoverrun;
+                      }
+
+                    /* XXX: Try to work between problem where a stretch glyph on
+                       a partially-visible bottom row will clear part of the
+                       modeline, and another where list-buffers headers and similar
+                       rows erroneously have visible_height set to 0.  Not sure
+                       where this is coming from as other terms seem not to show.  */
+                    r[i].size.height = min (s->height, s->row->visible_height);
+                }
+
+              [bgCol set];
 
-              x = r[i].origin.x;
-              width = s->w->phys_cursor_width;
-              r[i].size.width -= width;
-              r[i].origin.x += width;
+              /* NOTE: under NS this is NOT used to draw cursors, but we must avoid
+                 overwriting cursor (usually when cursor on a tab).  */
+              if (s->hl == DRAW_CURSOR)
+                {
+                  CGFloat x, width;
+
+                  x = r[i].origin.x;
+                  width = s->w->phys_cursor_width;
+                  r[i].size.width -= width;
+                  r[i].origin.x += width;
 
-              NSRectFill (r[i]);
+                  NSRectFill (r[i]);
 
-              /* Draw overlining, etc. on the cursor. */
-              if (s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-                ns_draw_text_decoration (s, face, bgCol, width, x);
+                  /* Draw overlining, etc. on the cursor.  */
+                  if (s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+                    ns_draw_text_decoration (s, face, bgCol, width, x);
+                  else
+                    ns_draw_text_decoration (s, face, fgCol, width, x);
+                }
               else
-                ns_draw_text_decoration (s, face, fgCol, width, x);
-            }
-          else
-            {
-              NSRectFill (r[i]);
-            }
+                {
+                  NSRectFill (r[i]);
+                }
 
-          /* Draw overlining, etc. on the stretch glyph (or the part
-             of the stretch glyph after the cursor). */
-          ns_draw_text_decoration (s, face, fgCol, r[i].size.width,
-                                   r[i].origin.x);
+              /* Draw overlining, etc. on the stretch glyph (or the part
+                 of the stretch glyph after the cursor).  */
+              ns_draw_text_decoration (s, face, fgCol, r[i].size.width,
+                                       r[i].origin.x);
+            }
+          ns_unfocus (s->f);
         }
-      ns_unfocus (s->f);
       s->background_filled_p = 1;
     }
 }
@@ -4072,9 +4056,11 @@ overwriting cursor (usually when cursor on a tab) */
             if (next->first_glyph->type != STRETCH_GLYPH)
               {
                 n = ns_get_glyph_string_clip_rect (s->next, r);
-                ns_focus (s->f, r, n);
-                ns_maybe_dumpglyphs_background (s->next, 1);
-                ns_unfocus (s->f);
+                if (ns_focus (s->f, r, n))
+                  {
+                    ns_maybe_dumpglyphs_background (s->next, 1);
+                    ns_unfocus (s->f);
+                  }
               }
             else
               {
@@ -4089,10 +4075,12 @@ overwriting cursor (usually when cursor on a tab) */
 	    || s->first_glyph->type == COMPOSITE_GLYPH))
     {
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_maybe_dumpglyphs_background (s, 1);
-      ns_dumpglyphs_box_or_relief (s);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_maybe_dumpglyphs_background (s, 1);
+          ns_dumpglyphs_box_or_relief (s);
+          ns_unfocus (s->f);
+        }
       box_drawn_p = 1;
     }
 
@@ -4101,9 +4089,11 @@ overwriting cursor (usually when cursor on a tab) */
 
     case IMAGE_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_dumpglyphs_image (s, r[0]);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_dumpglyphs_image (s, r[0]);
+          ns_unfocus (s->f);
+        }
       break;
 
     case STRETCH_GLYPH:
@@ -4113,66 +4103,68 @@ overwriting cursor (usually when cursor on a tab) */
     case CHAR_GLYPH:
     case COMPOSITE_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
+      if (ns_focus (s->f, r, n))
+        {
+          if (s->for_overlaps || (s->cmp_from > 0
+                                  && ! s->first_glyph->u.cmp.automatic))
+            s->background_filled_p = 1;
+          else
+            ns_maybe_dumpglyphs_background
+              (s, s->first_glyph->type == COMPOSITE_GLYPH);
 
-      if (s->for_overlaps || (s->cmp_from > 0
-			      && ! s->first_glyph->u.cmp.automatic))
-        s->background_filled_p = 1;
-      else
-        ns_maybe_dumpglyphs_background
-          (s, s->first_glyph->type == COMPOSITE_GLYPH);
+          if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+            {
+              unsigned long tmp = NS_FACE_BACKGROUND (s->face);
+              NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
+              NS_FACE_FOREGROUND (s->face) = tmp;
+            }
 
-      if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-        {
-          unsigned long tmp = NS_FACE_BACKGROUND (s->face);
-          NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
-          NS_FACE_FOREGROUND (s->face) = tmp;
-        }
+          {
+            BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
 
-      {
-        BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
+            if (isComposite)
+              ns_draw_composite_glyph_string_foreground (s);
+            else
+              ns_draw_glyph_string_foreground (s);
+          }
 
-        if (isComposite)
-          ns_draw_composite_glyph_string_foreground (s);
-        else
-          ns_draw_glyph_string_foreground (s);
-      }
+          {
+            NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0
+                            ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (s->face),
+                                                       s->f)
+                            : FRAME_FOREGROUND_COLOR (s->f));
+            [col set];
+
+            /* Draw underline, overline, strike-through.  */
+            ns_draw_text_decoration (s, s->face, col, s->width, s->x);
+          }
 
-      {
-        NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0
-                        ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (s->face),
-                                                   s->f)
-                        : FRAME_FOREGROUND_COLOR (s->f));
-        [col set];
-
-        /* Draw underline, overline, strike-through. */
-        ns_draw_text_decoration (s, s->face, col, s->width, s->x);
-      }
+          if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+            {
+              unsigned long tmp = NS_FACE_BACKGROUND (s->face);
+              NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
+              NS_FACE_FOREGROUND (s->face) = tmp;
+            }
 
-      if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-        {
-          unsigned long tmp = NS_FACE_BACKGROUND (s->face);
-          NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
-          NS_FACE_FOREGROUND (s->face) = tmp;
+          ns_unfocus (s->f);
         }
-
-      ns_unfocus (s->f);
       break;
 
     case GLYPHLESS_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-
-      if (s->for_overlaps || (s->cmp_from > 0
-			      && ! s->first_glyph->u.cmp.automatic))
-        s->background_filled_p = 1;
-      else
-        ns_maybe_dumpglyphs_background
-          (s, s->first_glyph->type == COMPOSITE_GLYPH);
-      /* ... */
-      /* Not yet implemented.  */
-      /* ... */
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          if (s->for_overlaps || (s->cmp_from > 0
+                                  && ! s->first_glyph->u.cmp.automatic))
+            s->background_filled_p = 1;
+          else
+            ns_maybe_dumpglyphs_background
+              (s, s->first_glyph->type == COMPOSITE_GLYPH);
+          /* ... */
+          /* Not yet implemented.  */
+          /* ... */
+          ns_unfocus (s->f);
+        }
       break;
 
     default:
@@ -4183,9 +4175,11 @@ overwriting cursor (usually when cursor on a tab) */
   if (!s->for_overlaps && !box_drawn_p && s->face->box != FACE_NO_BOX)
     {
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_dumpglyphs_box_or_relief (s);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_dumpglyphs_box_or_relief (s);
+          ns_unfocus (s->f);
+        }
     }
 
   s->num_clips = 0;
@@ -4991,7 +4985,7 @@ static Lisp_Object ns_string_to_lispmod (const char *s)
   ns_after_update_window_line,
   ns_update_window_begin,
   ns_update_window_end,
-  0, /* flush_display */
+  ns_flush_display, /* flush_display */
   x_clear_window_mouse_face,
   x_get_glyph_overhangs,
   x_fix_overlapping_area,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-18 14:02   ` Alan Third
@ 2018-08-18 18:56     ` zentrope@fastmail.fm
  2018-08-18 19:16       ` zentrope@fastmail.fm
  0 siblings, 1 reply; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-18 18:56 UTC (permalink / raw)
  To: Alan Third; +Cc: 31904

I’ll try the patch and get back to you today. However, I don’t actually know how to apply patches (it’s been years) so this may take some time. ;)






^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-18 18:56     ` zentrope@fastmail.fm
@ 2018-08-18 19:16       ` zentrope@fastmail.fm
  2018-08-18 19:23         ` zentrope@fastmail.fm
  2018-08-19 12:41         ` Alan Third
  0 siblings, 2 replies; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-18 19:16 UTC (permalink / raw)
  To: Alan Third; +Cc: 31904

[-- Attachment #1: Type: text/plain, Size: 480 bytes --]

OK.

The patch worked just fine.

Details:

Using Xcode-beta5:

git checkout emacs-26
gmake clean
cd src 
patch < ../path/to/your/path
cd ..
gmake install
cp -r nextstep/Emacs.app /Applications/

Hopefully that’s a reasonable path to rebuilding and running.

I then launched and can see all the rendered text just fine.

Also, switching to “Dark Mode” changes the window-title bar to the correct color.

Subjective, but scrolling seems faster, somehow.

[-- Attachment #2: Type: text/html, Size: 1394 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-18 19:16       ` zentrope@fastmail.fm
@ 2018-08-18 19:23         ` zentrope@fastmail.fm
  2018-08-19  9:59           ` Alan Third
  2018-08-19 12:41         ` Alan Third
  1 sibling, 1 reply; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-18 19:23 UTC (permalink / raw)
  To: Alan Third; +Cc: 31904

Another wrinkle (emacs-26 with patch applied):

When I change my font, all the text disappears except for the current line.

The text comes back if:

- I move the cursor over the affected areas.
- I wait a bit (from the cursor line down renders).
- Switch away to a non-Emacs window.

Seems like as soon as there’s a reason to paint the screen, it comes back.

Functions I use:

(defun kfi/set-font (name weight)
  "Set a font to NAME and its WEIGHT."
  (set-face-attribute 'default nil :family name :weight weight))

(defun kfi/heavy-font ()
  "Change to a heavy font."
  (interactive)
  (kfi/set-font "Monaco" 'normal))

(defun kfi/normal-font ()
  "Change to a normal font."
  (interactive)
  (kfi/set-font "Menlo" 'normal))








^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-18 19:23         ` zentrope@fastmail.fm
@ 2018-08-19  9:59           ` Alan Third
  2018-08-19 23:51             ` zentrope@fastmail.fm
  0 siblings, 1 reply; 16+ messages in thread
From: Alan Third @ 2018-08-19  9:59 UTC (permalink / raw)
  To: zentrope@fastmail.fm; +Cc: 31904

On Sat, Aug 18, 2018 at 12:23:02PM -0700, zentrope@fastmail.fm wrote:
> Another wrinkle (emacs-26 with patch applied):
> 
> When I change my font, all the text disappears except for the current line.
> 
> The text comes back if:
> 
> - I move the cursor over the affected areas.
> - I wait a bit (from the cursor line down renders).
> - Switch away to a non-Emacs window.
> 
> Seems like as soon as there’s a reason to paint the screen, it comes back.

I take it the frame changes size when you change font?

If you evaluate this does the frame redraw right?

  (set-frame-width nil 103)

-- 
Alan Third





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-18 19:16       ` zentrope@fastmail.fm
  2018-08-18 19:23         ` zentrope@fastmail.fm
@ 2018-08-19 12:41         ` Alan Third
  2018-08-19 23:44           ` zentrope@fastmail.fm
  1 sibling, 1 reply; 16+ messages in thread
From: Alan Third @ 2018-08-19 12:41 UTC (permalink / raw)
  To: zentrope@fastmail.fm; +Cc: 31904

On Sat, Aug 18, 2018 at 12:16:30PM -0700, zentrope@fastmail.fm wrote:
> 
> Using Xcode-beta5:
> 
> git checkout emacs-26
> gmake clean
> cd src 
> patch < ../path/to/your/path
> cd ..
> gmake install
> cp -r nextstep/Emacs.app /Applications/
> 
> Hopefully that’s a reasonable path to rebuilding and running.

Yes, that works fine. You might want to apply the patch using

    git am path/to/patch

That inserts the patch as a commit in git, but it makes no real
difference.

> Also, switching to “Dark Mode” changes the window-title bar to the correct color.

I thought I was going to have a make a change to get that working.
Does the scrollbar change with it?
-- 
Alan Third





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-19 12:41         ` Alan Third
@ 2018-08-19 23:44           ` zentrope@fastmail.fm
  0 siblings, 0 replies; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-19 23:44 UTC (permalink / raw)
  To: Alan Third; +Cc: 31904


> On Aug 19, 2018, at 5:41 AM, Alan Third <alan@idiocy.org> wrote:
> 
> On Sat, Aug 18, 2018 at 12:16:30PM -0700, zentrope@fastmail.fm wrote:

> 
>> Also, switching to “Dark Mode” changes the window-title bar to the correct color.
> 
> I thought I was going to have a make a change to get that working.
> Does the scrollbar change with it?


Both the scroll bars and tool bar change color with the overall appearance settings. I’m guessing that compilation links against the correct libraries which do the Right Thing.

An instance compiled elsewhere (on High Sierra) ignores the Dark/Light mode changes.







^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-19  9:59           ` Alan Third
@ 2018-08-19 23:51             ` zentrope@fastmail.fm
  2018-08-26 13:02               ` Alan Third
  0 siblings, 1 reply; 16+ messages in thread
From: zentrope@fastmail.fm @ 2018-08-19 23:51 UTC (permalink / raw)
  To: Alan Third; +Cc: 31904



> On Aug 19, 2018, at 2:59 AM, Alan Third <alan@idiocy.org> wrote:
> 
> On Sat, Aug 18, 2018 at 12:23:02PM -0700, zentrope@fastmail.fm wrote:
>> Another wrinkle (emacs-26 with patch applied):
>> 
>> When I change my font, all the text disappears except for the current line.
>> 
>> The text comes back if:
>> 
>> - I move the cursor over the affected areas.
>> - I wait a bit (from the cursor line down renders).
>> - Switch away to a non-Emacs window.
>> 
>> Seems like as soon as there’s a reason to paint the screen, it comes back.
> 
> I take it the frame changes size when you change font?
> 
> If you evaluate this does the frame redraw right?
> 
>  (set-frame-width nil 103)

The frame’s size does not change (if you mean the window gets narrower for a narrower font, say).

The set-frame-width expression doesn’t make any difference when I change from Monoco to Menlo and back.

Another interesting thing:

* The problem does NOT occur when changing the size of the font.

* If I change the font (to Monaco), the screen blanks, but immediately running a command to change the font size “fixes” it.

Seems that the font-change isn’t triggering a “repaint the whole thing”, rather, just repaint the line containing the pointer.


Functions involved in font-size change (really just set-face-attribute):

(defun kfi/set-font-size (size)
  "Set the font SIZE."
  (interactive "nNew size: ")
  (set-face-attribute 'default nil :height size))

(defun kfi/font-size-up ()
  "Shift font size up by 10 units."
  (interactive)
  (kfi/set-font-size (+ (face-attribute 'default :height) 10)))

(defun kfi/font-size-down ()
  "Shift font size down by 10 units."
  (interactive)
  (kfi/set-font-size (- (face-attribute 'default :height) 10)))








^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-08-19 23:51             ` zentrope@fastmail.fm
@ 2018-08-26 13:02               ` Alan Third
  0 siblings, 0 replies; 16+ messages in thread
From: Alan Third @ 2018-08-26 13:02 UTC (permalink / raw)
  To: zentrope@fastmail.fm; +Cc: 31904

Sorry, I thought I’d already replied to this.

On Sun, Aug 19, 2018 at 04:51:36PM -0700, zentrope@fastmail.fm wrote:
> 
> Another interesting thing:
> 
> * The problem does NOT occur when changing the size of the font.
> 
> * If I change the font (to Monaco), the screen blanks, but
>   immediately running a command to change the font size “fixes” it.
> 
> Seems that the font-change isn’t triggering a “repaint the whole
> thing”, rather, just repaint the line containing the pointer.

Yes, that sounds right. Chances are the line with the cursor on it
redraws because the cursor is drawn as a separate action.

Probably the font change needs to mark the frame as garbaged so it’s
redrawn completely, but that’s not happening. Unfortunately I don’t
know where that should be done. I can’t see anywhere obvious in the NS
code. I’ll keep looking.
-- 
Alan Third





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: bug##31904
  2018-06-19 23:09 bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave zentrope@fastmail.fm
                   ` (2 preceding siblings ...)
  2018-08-15 23:54 ` bug#31904: scatch/ns-drawing zentrope@fastmail.fm
@ 2018-09-19 16:36 ` Zack Piper
  2019-09-28 17:54 ` bug#31904: scatch/ns-drawing Stefan Kangas
  4 siblings, 0 replies; 16+ messages in thread
From: Zack Piper @ 2018-09-19 16:36 UTC (permalink / raw)
  To: 31904


[-- Attachment #1.1: Type: text/plain, Size: 9630 bytes --]

Hi all,

I usually use Emacs 27 (AKA `master`). I upgraded to the latest Mojave 
beta (1 week until GM I believe, I was eager!)

Thanks Alan for providing the patch, I took the patch (which you said 
was based on emacs-26) and "updated"
(used the `wiggle` command for the hunks that wouldn't apply, I've never 
really meddled with Objective-C before and
I've never really updated a patch before when there's rejected hunks, so 
please excuse any ignorance you pick up on. :-)

The patch builds and launches Emacs successfully! (Thanks again Alan)

However, just thought I'd mention that after some time (5-10 minutes of 
idling, and just now it crashed during launch) I get the following:

Note that I *believe* I've compiled Emacs with debugging symbols and no 
optimisation, feel free to correct me if not.

Hopefully the below output is helpful to someone. This might even be a 
bug in Mojave and one of the core libraries, but I haven't had
this with other applications:

I can reproduce the issue within a maximum of 10 minutes, whether typing 
or not.

It's likely worthy to note that this happened also with the emacs-26 
branch, commit d4fa83baf5462cfcf61ebbb8c0a0ec584d11c39a,
under the same circumstances, and with the attached patch applied.

Feel free to shout at me to submit this as a new bug, I couldn't find 
which email makes a new one. :-(

The below happens on commit 75d9a55fae1c484aa6d213064931bfe3b65cf5dd on 
the master branch.

```
objc[95306]: Invalid or prematurely-freed autorelease pool 0x103e60378.
Process 95306 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal 
SIGABRT
     frame #0: 0x00007fff7679b01e 
libsystem_kernel.dylib`__abort_with_payload + 10
libsystem_kernel.dylib`__abort_with_payload:
->  0x7fff7679b01e <+10>: jae    0x7fff7679b028            ; <+20>
     0x7fff7679b020 <+12>: movq   %rax, %rdi
     0x7fff7679b023 <+15>: jmp    0x7fff7677de67            ; 
cerror_nocancel
     0x7fff7679b028 <+20>: retq
Target 0: (Emacs) stopped.
(lldb) bt all
* thread #1, queue = 'com.apple.main-thread', stop reason = signal 
SIGABRT
   * frame #0: 0x00007fff7679b01e 
libsystem_kernel.dylib`__abort_with_payload + 10
     frame #1: 0x00007fff76796561 
libsystem_kernel.dylib`abort_with_payload_wrapper_internal + 82
     frame #2: 0x00007fff7679650f 
libsystem_kernel.dylib`abort_with_reason + 22
     frame #3: 0x00007fff75579674 libobjc.A.dylib`_objc_fatalv(unsigned 
long long, unsigned long long, char const*, __va_list_tag*) + 108
     frame #4: 0x00007fff75579526 libobjc.A.dylib`_objc_fatal(char 
const*, ...) + 135
     frame #5: 0x00007fff7556bd73 libobjc.A.dylib`(anonymous 
namespace)::AutoreleasePoolPage::pop(void*) + 957
     frame #6: 0x00007fff46c2d232 AppKit`-[NSView(NSInternal) 
_recursive:displayRectIgnoringOpacity:inContext:shouldChangeFontReferenceColor:stopAtLayerBackedViews:] 
+ 3454
     frame #7: 0x00007fff46c2c4a2 AppKit`__46-[NSView(NSLayerKitGlue) 
drawLayer:inContext:]_block_invoke + 192
     frame #8: 0x00007fff46c2c201 AppKit`-[NSView(NSLayerKitGlue) 
_drawViewBackingLayer:inContext:drawingHandler:] + 1769
     frame #9: 0x00007fff54540aaf QuartzCore`CABackingStoreUpdate_ + 577
     frame #10: 0x00007fff545a2325 
QuartzCore`___ZN2CA5Layer8display_Ev_block_invoke + 53
     frame #11: 0x00007fff5453fc90 QuartzCore`-[CALayer _display] + 1839
     frame #12: 0x00007fff46c2b75a AppKit`_NSBackingLayerDisplay + 531
     frame #13: 0x00007fff46c0fcc9 AppKit`-[_NSViewBackingLayer display] 
+ 811
     frame #14: 0x00007fff46c0f949 AppKit`_NSBackingLayerDisplayIfNeeded 
+ 40
     frame #15: 0x00007fff46c0f2a4 AppKit`-[NSView displayIfNeeded] + 
130
     frame #16: 0x0000000100026514 Emacs`echo_area_display + 593
     frame #17: 0x00000001000261ca Emacs`message3_nolog + 393
     frame #18: 0x0000000100025fe3 Emacs`message3 + 399
     frame #19: 0x0000000100106a03 Emacs`Fmessage + 67
     frame #20: 0x000000010010f525 Emacs`Ffuncall + 665
     frame #21: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #22: 0x0000000100110040 Emacs`funcall_lambda + 648
     frame #23: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #24: 0x000000010010f704 Emacs`funcall_nil + 9
     frame #25: 0x000000010010f6a0 Emacs`run_hook_with_args + 198
     frame #26: 0x000000010010f58b Emacs`Frun_hooks + 60
     frame #27: 0x000000010010f525 Emacs`Ffuncall + 665
     frame #28: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #29: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #30: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #31: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #32: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #33: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #34: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #35: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #36: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #37: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #38: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #39: 0x000000010010ee62 Emacs`apply_lambda + 369
     frame #40: 0x000000010010c484 Emacs`eval_sub + 845
     frame #41: 0x000000010012d294 Emacs`readevalloop + 1773
     frame #42: 0x000000010012d502 Emacs`Feval_buffer + 368
     frame #43: 0x000000010010fcfe Emacs`funcall_subr + 367
     frame #44: 0x000000010010f525 Emacs`Ffuncall + 665
     frame #45: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #46: 0x0000000100110040 Emacs`funcall_lambda + 648
     frame #47: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #48: 0x000000010010f9d1 Emacs`call4 + 58
     frame #49: 0x000000010012b845 Emacs`Fload + 1373
     frame #50: 0x000000010010fcfe Emacs`funcall_subr + 367
     frame #51: 0x000000010010f525 Emacs`Ffuncall + 665
     frame #52: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #53: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #54: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #55: 0x000000010010f4c2 Emacs`Ffuncall + 566
     frame #56: 0x0000000100145e02 Emacs`exec_byte_code + 1486
     frame #57: 0x000000010010ee62 Emacs`apply_lambda + 369
     frame #58: 0x000000010010c484 Emacs`eval_sub + 845
     frame #59: 0x000000010010ec69 Emacs`Feval + 96
     frame #60: 0x000000010010dffd Emacs`internal_condition_case + 87
     frame #61: 0x00000001000b17be Emacs`top_level_1 + 45
     frame #62: 0x000000010010db85 Emacs`internal_catch + 74
     frame #63: 0x00000001000a4a90 Emacs`command_loop + 141
     frame #64: 0x00000001000a49c1 Emacs`recursive_edit_1 + 115
     frame #65: 0x00000001000a4bdd Emacs`Frecursive_edit + 226
     frame #66: 0x00000001000a3aa9 Emacs`main + 5211
     frame #67: 0x00007fff76645085 libdyld.dylib`start + 1
     frame #68: 0x00007fff76645085 libdyld.dylib`start + 1
   thread #2
     frame #0: 0x00007fff7677f5be 
libsystem_kernel.dylib`__workq_kernreturn + 10
     frame #1: 0x6874656d00000000
     frame #2: 0x00007fff76836415 libsystem_pthread.dylib`start_wqthread 
+ 13
   thread #3
     frame #0: 0x00007fff7677f5be 
libsystem_kernel.dylib`__workq_kernreturn + 10
     frame #1: 0x00007fff76836641 
libsystem_pthread.dylib`_pthread_wqthread + 446
     frame #2: 0x00007fff76836415 libsystem_pthread.dylib`start_wqthread 
+ 13
   thread #4, name = 'gmain'
     frame #0: 0x00007fff76784e82 libsystem_kernel.dylib`__select + 10
     frame #1: 0x0000000100a083da libglib-2.0.0.dylib`g_poll + 405
     frame #2: 0x00000001009fc123 
libglib-2.0.0.dylib`g_main_context_iterate + 340
     frame #3: 0x00000001009fc1d1 
libglib-2.0.0.dylib`g_main_context_iteration + 55
     frame #4: 0x00000001009fd2b0 libglib-2.0.0.dylib`glib_worker_main + 
30
     frame #5: 0x0000000100a1dcb7 libglib-2.0.0.dylib`g_thread_proxy + 
90
     frame #6: 0x00007fff7683733d libsystem_pthread.dylib`_pthread_body 
+ 126
     frame #7: 0x00007fff7683a2a7 libsystem_pthread.dylib`_pthread_start 
+ 70
     frame #8: 0x00007fff76836425 libsystem_pthread.dylib`thread_start + 
13
   thread #5
     frame #0: 0x00007fff7677f5be 
libsystem_kernel.dylib`__workq_kernreturn + 10
     frame #1: 0x00007fff76836721 
libsystem_pthread.dylib`_pthread_wqthread + 670
     frame #2: 0x00007fff76836415 libsystem_pthread.dylib`start_wqthread 
+ 13
   thread #7
     frame #0: 0x00007fff76784e82 libsystem_kernel.dylib`__select + 10
     frame #1: 0x000000010017c408 Emacs`-[EmacsApp fd_handler:] + 214
     frame #2: 0x00007fff4b902234 Foundation`__NSThread__start__ + 1218
     frame #3: 0x00007fff7683733d libsystem_pthread.dylib`_pthread_body 
+ 126
     frame #4: 0x00007fff7683a2a7 libsystem_pthread.dylib`_pthread_start 
+ 70
     frame #5: 0x00007fff76836425 libsystem_pthread.dylib`thread_start + 
13
   thread #9, name = 'com.apple.NSEventThread'
     frame #0: 0x00007fff7677dc2a libsystem_kernel.dylib`mach_msg_trap + 
10
     frame #1: 0x00007fff7677e174 libsystem_kernel.dylib`mach_msg + 60
     frame #2: 0x00007fff495ad05e 
CoreFoundation`__CFRunLoopServiceMachPort + 337
     frame #3: 0x00007fff495ac5ad CoreFoundation`__CFRunLoopRun + 1654
     frame #4: 0x00007fff495abce4 CoreFoundation`CFRunLoopRunSpecific + 
463
     frame #5: 0x00007fff46b0b581 AppKit`_NSEventThread + 160
     frame #6: 0x00007fff7683733d libsystem_pthread.dylib`_pthread_body 
+ 126
     frame #7: 0x00007fff7683a2a7 libsystem_pthread.dylib`_pthread_start 
+ 70
     frame #8: 0x00007fff76836425 libsystem_pthread.dylib`thread_start + 
13
(lldb)
```

[-- Attachment #1.2: Type: text/html, Size: 10429 bytes --]

[-- Attachment #2: 0001-nsterm.m.patch --]
[-- Type: text/plain, Size: 34371 bytes --]

From dea03ff92e307456d103f716652ae76987da02f9 Mon Sep 17 00:00:00 2001
From: Zack Piper <zack@apertron.com>
Date: Tue, 18 Sep 2018 21:42:55 +0100
Subject: [PATCH] nsterm.m

---
 src/nsterm.m | 735 +++++++++++++++++++++++++--------------------------
 1 file changed, 364 insertions(+), 371 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 961271f2d0..a2117eb027 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -278,8 +278,6 @@ - (NSColor *)colorUsingDefaultColorSpace
 long context_menu_value = 0;
 
 /* display update */
-static struct frame *ns_updating_frame;
-static NSView *focus_view = NULL;
 static int ns_window_num = 0;
 #ifdef NS_IMPL_GNUSTEP
 static NSRect uRect;            // TODO: This is dead, remove it?
@@ -1109,30 +1107,29 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
   }
 #endif
 
-  ns_updating_frame = f;
-  [view lockFocus];
-
   /* drawRect may have been called for say the minibuffer, and then clip path
      is for the minibuffer.  But the display engine may draw more because
      we have set the frame as garbaged.  So reset clip path to the whole
      view.  */
+  /* FIXME: I don't think we need to do this.  */
 #ifdef NS_IMPL_COCOA
-  {
-    NSBezierPath *bp;
-    NSRect r = [view frame];
-    NSRect cr = [[view window] frame];
-    /* If a large frame size is set, r may be larger than the window frame
-       before constrained.  In that case don't change the clip path, as we
-       will clear in to the tool bar and title bar.  */
-    if (r.size.height
-        + FRAME_NS_TITLEBAR_HEIGHT (f)
-        + FRAME_TOOLBAR_HEIGHT (f) <= cr.size.height)
-      {
-        bp = [[NSBezierPath bezierPathWithRect: r] retain];
-        [bp setClip];
-        [bp release];
-      }
-  }
+  if ([NSView focusView] == FRAME_NS_VIEW (f))
+    {
+      NSBezierPath *bp;
+      NSRect r = [view frame];
+      NSRect cr = [[view window] frame];
+      /* If a large frame size is set, r may be larger than the window frame
+         before constrained.  In that case don't change the clip path, as we
+         will clear in to the tool bar and title bar.  */
+      if (r.size.height
+          + FRAME_NS_TITLEBAR_HEIGHT (f)
+          + FRAME_TOOLBAR_HEIGHT (f) <= cr.size.height)
+        {
+          bp = [[NSBezierPath bezierPathWithRect: r] retain];
+          [bp setClip];
+          [bp release];
+        }
+    }
 #endif
 
 #ifdef NS_IMPL_GNUSTEP
@@ -1218,23 +1215,14 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
    external (RIF) call; for whole frame, called after update_window_end
    -------------------------------------------------------------------------- */
 {
-  EmacsView *view = FRAME_NS_VIEW (f);
-
   NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_update_end");
 
 /*   if (f == MOUSE_HL_INFO (f)->mouse_face_mouse_frame) */
   MOUSE_HL_INFO (f)->mouse_face_defer = 0;
-
-  block_input ();
-
-  [view unlockFocus];
-  [[view window] flushWindow];
-
-  unblock_input ();
-  ns_updating_frame = NULL;
 }
 
-static void
+
+static BOOL
 ns_focus (struct frame *f, NSRect *r, int n)
 /* --------------------------------------------------------------------------
    Internal: Focus on given frame.  During small local updates this is used to
@@ -1246,48 +1234,38 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
    -------------------------------------------------------------------------- */
 {
   NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_focus");
-  if (r != NULL)
+  if (r)
     {
       NSTRACE_RECT ("r", *r);
-    }
 
-  if (f != ns_updating_frame)
-    {
-      NSView *view = FRAME_NS_VIEW (f);
-      if (view != focus_view)
+      if ([NSView focusView] == FRAME_NS_VIEW (f))
         {
-          if (focus_view != NULL)
-            {
-              [focus_view unlockFocus];
-              [[focus_view window] flushWindow];
-/* debug_lock--; */
-            }
+          [[NSGraphicsContext currentContext] saveGraphicsState];
+          if (n == 2)
+            NSRectClipList (r, 2);
+          else
+            NSRectClip (*r);
+          gsaved = YES;
 
-          if (view)
-            [view lockFocus];
-          focus_view = view;
-/* if (view) debug_lock++; */
+          return YES;
         }
-    }
-
-  /* clipping */
-  if (r)
-    {
-      [[NSGraphicsContext currentContext] saveGraphicsState];
-      if (n == 2)
-        NSRectClipList (r, 2);
       else
-        NSRectClip (*r);
-      gsaved = YES;
+        {
+          NSView *view = FRAME_NS_VIEW (f);
+          int i;
+          for (i = 0 ; i < n ; i++)
+            [view setNeedsDisplayInRect:r[i]];
+        }
     }
+
+  return NO;
 }
 
 
 static void
 ns_unfocus (struct frame *f)
-/* --------------------------------------------------------------------------
-     Internal: Remove focus on given frame
-   -------------------------------------------------------------------------- */
+/* Internal: Restore the previous graphics state, unsetting any
+   clipping areas.  */
 {
   NSTRACE_WHEN (NSTRACE_GROUP_FOCUS, "ns_unfocus");
 
@@ -1297,20 +1275,10 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
       gsaved = NO;
     }
 
-  if (f != ns_updating_frame)
-    {
-      if (focus_view != NULL)
-        {
-          [focus_view unlockFocus];
-          [[focus_view window] flushWindow];
-          focus_view = NULL;
-/* debug_lock--; */
-        }
-    }
 }
 
 
-static void
+static BOOL
 ns_clip_to_row (struct window *w, struct glyph_row *row,
 		enum glyph_row_area area, BOOL gc)
 /* --------------------------------------------------------------------------
@@ -1329,7 +1297,17 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
   clip_rect.size.width = window_width;
   clip_rect.size.height = row->visible_height;
 
-  ns_focus (f, &clip_rect, 1);
+  return ns_focus (f, &clip_rect, 1);
+}
+
+
+static void
+ns_flush_display (struct frame *f)
+/* Force the frame to redisplay.  If areas have previously been marked
+   dirty by setNeedsDisplayInRect (in ns_focus), then this will call
+   draw_rect: which will "expose" those areas.  */
+{
+  [FRAME_NS_VIEW (f) displayIfNeeded];
 }
 
 
@@ -2826,14 +2804,16 @@ so some key presses (TAB) are swallowed by the system.  */
   r = [view bounds];
 
   block_input ();
-  ns_focus (f, &r, 1);
-  [ns_lookup_indexed_color (NS_FACE_BACKGROUND
-			    (FACE_FROM_ID (f, DEFAULT_FACE_ID)), f) set];
-  NSRectFill (r);
-  ns_unfocus (f);
-
-  /* as of 2006/11 or so this is now needed */
-  ns_redraw_scroll_bars (f);
+  if (ns_focus (f, &r, 1))
+    {
+      [ns_lookup_indexed_color (NS_FACE_BACKGROUND
+                                (FACE_FROM_ID (f, DEFAULT_FACE_ID)), f) set];
+      NSRectFill (r);
+      ns_unfocus (f);
+
+      /* as of 2006/11 or so this is now needed */
+      ns_redraw_scroll_bars (f);
+    }
   unblock_input ();
 }
 
@@ -2854,13 +2834,14 @@ so some key presses (TAB) are swallowed by the system.  */
   NSTRACE_WHEN (NSTRACE_GROUP_UPDATES, "ns_clear_frame_area");
 
   r = NSIntersectionRect (r, [view frame]);
-  ns_focus (f, &r, 1);
-  [ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f) set];
+  if (ns_focus (f, &r, 1))
+    {
+      [ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), f) set];
 
-  NSRectFill (r);
+      NSRectFill (r);
 
-  ns_unfocus (f);
-  return;
+      ns_unfocus (f);
+    }
 }
 
 static void
@@ -2872,11 +2853,11 @@ so some key presses (TAB) are swallowed by the system.  */
     {
       hide_bell();              // Ensure the bell image isn't scrolled.
 
-      ns_focus (f, &dest, 1);
+      /* FIXME: scrollRect:by: is deprecated in macOS 10.14.  There is
+         no obvious replacement so we may have to come up with our own.  */
       [FRAME_NS_VIEW (f) scrollRect: src
                                  by: NSMakeSize (dest.origin.x - src.origin.x,
                                                  dest.origin.y - src.origin.y)];
-      ns_unfocus (f);
     }
 }
 
@@ -3087,88 +3068,87 @@ so some key presses (TAB) are swallowed by the system.  */
     }
 
   /* Must clip because of partially visible lines.  */
-  ns_clip_to_row (w, row, ANY_AREA, YES);
-
-  if (!p->overlay_p)
+  if (ns_clip_to_row (w, row, ANY_AREA, YES))
     {
-      int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
-
-      if (bx >= 0 && nx > 0)
+      if (!p->overlay_p)
         {
-          NSRect r = NSMakeRect (bx, by, nx, ny);
-          NSRectClip (r);
-          [ns_lookup_indexed_color (face->background, f) set];
-          NSRectFill (r);
-        }
-    }
-
-  if (p->which)
-    {
-      NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
-      EmacsImage *img = bimgs[p->which - 1];
+          int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
 
-      if (!img)
-        {
-          // Note: For "periodic" images, allocate one EmacsImage for
-          // the base image, and use it for all dh:s.
-          unsigned short *bits = p->bits;
-          int full_height = p->h + p->dh;
-          int i;
-          unsigned char *cbits = xmalloc (full_height);
-
-          for (i = 0; i < full_height; i++)
-            cbits[i] = bits[i];
-          img = [[EmacsImage alloc] initFromXBM: cbits width: 8
-                                         height: full_height
-                                             fg: 0 bg: 0];
-          bimgs[p->which - 1] = img;
-          xfree (cbits);
+          if (bx >= 0 && nx > 0)
+            {
+              NSRect r = NSMakeRect (bx, by, nx, ny);
+              NSRectClip (r);
+              [ns_lookup_indexed_color (face->background, f) set];
+              NSRectFill (r);
+            }
         }
 
-      NSTRACE_RECT ("r", r);
+      if (p->which)
+        {
+          NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
+          EmacsImage *img = bimgs[p->which - 1];
 
-      NSRectClip (r);
-      /* Since we composite the bitmap instead of just blitting it, we need
-         to erase the whole background.  */
-      [ns_lookup_indexed_color(face->background, f) set];
-      NSRectFill (r);
+          if (!img)
+            {
+              // Note: For "periodic" images, allocate one EmacsImage for
+              // the base image, and use it for all dh:s.
+              unsigned short *bits = p->bits;
+              int full_height = p->h + p->dh;
+              int i;
+              unsigned char *cbits = xmalloc (full_height);
+
+              for (i = 0; i < full_height; i++)
+                cbits[i] = bits[i];
+              img = [[EmacsImage alloc] initFromXBM: cbits width: 8
+                                             height: full_height
+                                                 fg: 0 bg: 0];
+              bimgs[p->which - 1] = img;
+              xfree (cbits);
+            }
 
-      {
-        NSColor *bm_color;
-        if (!p->cursor_p)
-          bm_color = ns_lookup_indexed_color(face->foreground, f);
-        else if (p->overlay_p)
-          bm_color = ns_lookup_indexed_color(face->background, f);
-        else
-          bm_color = f->output_data.ns->cursor_color;
-        [img setXBMColor: bm_color];
-      }
+          NSTRACE_RECT ("r", r);
 
-#ifdef NS_IMPL_COCOA
-      // Note: For periodic images, the full image height is "h + hd".
-      // By using the height h, a suitable part of the image is used.
-      NSRect fromRect = NSMakeRect(0, 0, p->wd, p->h);
+          NSRectClip (r);
+          /* Since we composite the bitmap instead of just blitting it, we need
+             to erase the whole background.  */
+          [ns_lookup_indexed_color(face->background, f) set];
+          NSRectFill (r);
 
-      NSTRACE_RECT ("fromRect", fromRect);
+          {
+            NSColor *bm_color;
+            if (!p->cursor_p)
+              bm_color = ns_lookup_indexed_color(face->foreground, f);
+            else if (p->overlay_p)
+              bm_color = ns_lookup_indexed_color(face->background, f);
+            else
+              bm_color = f->output_data.ns->cursor_color;
+            [img setXBMColor: bm_color];
+          }
 
-      [img drawInRect: r
-              fromRect: fromRect
-             operation: NSCompositingOperationSourceOver
-              fraction: 1.0
-           respectFlipped: YES
-                hints: nil];
+#ifdef NS_IMPL_COCOA
+          // Note: For periodic images, the full image height is "h + hd".
+          // By using the height h, a suitable part of the image is used.
+          NSRect fromRect = NSMakeRect(0, 0, p->wd, p->h);
+
+          NSTRACE_RECT ("fromRect", fromRect);
+
+          [img drawInRect: r
+                 fromRect: fromRect
+                operation: NSCompositingOperationSourceOver
+                 fraction: 1.0
+               respectFlipped: YES
+                    hints: nil];
 #else
-      {
-        NSPoint pt = r.origin;
-        pt.y += p->h;
-        [img compositeToPoint: pt operation: NSCompositingOperationSourceOver];
-      }
+          {
+            NSPoint pt = r.origin;
+            pt.y += p->h;
+            [img compositeToPoint: pt operation: NSCompositingOperationSourceOver];
+          }
 #endif
+        }
+      ns_unfocus (f);
     }
-  ns_unfocus (f);
 }
-
-
 static void
 ns_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
 		       int x, int y, enum text_cursor_kinds cursor_type,
@@ -3248,66 +3228,65 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
   r.size.width = w->phys_cursor_width;
 
   /* Prevent the cursor from being drawn outside the text area.  */
-  ns_clip_to_row (w, glyph_row, TEXT_AREA, NO); /* do ns_focus(f, &r, 1); if remove */
-
-
-  face = FACE_FROM_ID_OR_NULL (f, phys_cursor_glyph->face_id);
-  if (face && NS_FACE_BACKGROUND (face)
-      == ns_index_color (FRAME_CURSOR_COLOR (f), f))
+  if (ns_clip_to_row (w, glyph_row, TEXT_AREA, NO))
     {
-      [ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), f) set];
-      hollow_color = FRAME_CURSOR_COLOR (f);
-    }
-  else
-    [FRAME_CURSOR_COLOR (f) set];
+      face = FACE_FROM_ID_OR_NULL (f, phys_cursor_glyph->face_id);
+      if (face && NS_FACE_BACKGROUND (face)
+          == ns_index_color (FRAME_CURSOR_COLOR (f), f))
+        {
+          [ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), f) set];
+          hollow_color = FRAME_CURSOR_COLOR (f);
+        }
+      else
+        [FRAME_CURSOR_COLOR (f) set];
 
 #ifdef NS_IMPL_COCOA
-  /* TODO: This makes drawing of cursor plus that of phys_cursor_glyph
-           atomic.  Cleaner ways of doing this should be investigated.
-           One way would be to set a global variable DRAWING_CURSOR
-           when making the call to draw_phys..(), don't focus in that
-           case, then move the ns_unfocus() here after that call.  */
-  NSDisableScreenUpdates ();
+      /* TODO: This makes drawing of cursor plus that of phys_cursor_glyph
+         atomic.  Cleaner ways of doing this should be investigated.
+         One way would be to set a global variable DRAWING_CURSOR
+         when making the call to draw_phys..(), don't focus in that
+         case, then move the ns_unfocus() here after that call.  */
+      NSDisableScreenUpdates ();
 #endif
 
-  switch (cursor_type)
-    {
-    case DEFAULT_CURSOR:
-    case NO_CURSOR:
-      break;
-    case FILLED_BOX_CURSOR:
-      NSRectFill (r);
-      break;
-    case HOLLOW_BOX_CURSOR:
-      NSRectFill (r);
-      [hollow_color set];
-      NSRectFill (NSInsetRect (r, 1, 1));
-      [FRAME_CURSOR_COLOR (f) set];
-      break;
-    case HBAR_CURSOR:
-      NSRectFill (r);
-      break;
-    case BAR_CURSOR:
-      s = r;
-      /* If the character under cursor is R2L, draw the bar cursor
-         on the right of its glyph, rather than on the left.  */
-      cursor_glyph = get_phys_cursor_glyph (w);
-      if ((cursor_glyph->resolved_level & 1) != 0)
-        s.origin.x += cursor_glyph->pixel_width - s.size.width;
-
-      NSRectFill (s);
-      break;
-    }
-  ns_unfocus (f);
+      switch (cursor_type)
+        {
+        case DEFAULT_CURSOR:
+        case NO_CURSOR:
+          break;
+        case FILLED_BOX_CURSOR:
+          NSRectFill (r);
+          break;
+        case HOLLOW_BOX_CURSOR:
+          NSRectFill (r);
+          [hollow_color set];
+          NSRectFill (NSInsetRect (r, 1, 1));
+          [FRAME_CURSOR_COLOR (f) set];
+          break;
+        case HBAR_CURSOR:
+          NSRectFill (r);
+          break;
+        case BAR_CURSOR:
+          s = r;
+          /* If the character under cursor is R2L, draw the bar cursor
+             on the right of its glyph, rather than on the left.  */
+          cursor_glyph = get_phys_cursor_glyph (w);
+          if ((cursor_glyph->resolved_level & 1) != 0)
+            s.origin.x += cursor_glyph->pixel_width - s.size.width;
+
+          NSRectFill (s);
+          break;
+        }
+      ns_unfocus (f);
 
-  /* draw the character under the cursor */
-  if (cursor_type != NO_CURSOR)
-    draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+      /* draw the character under the cursor */
+      if (cursor_type != NO_CURSOR)
+        draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
 
 #ifdef NS_IMPL_COCOA
-  NSEnableScreenUpdates ();
+      NSEnableScreenUpdates ();
 #endif
-
+    }
 }
 
 
@@ -3325,12 +3304,14 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
 
   face = FACE_FROM_ID_OR_NULL (f, VERTICAL_BORDER_FACE_ID);
 
-  ns_focus (f, &r, 1);
-  if (face)
-    [ns_lookup_indexed_color(face->foreground, f) set];
+  if (ns_focus (f, &r, 1))
+    {
+      if (face)
+        [ns_lookup_indexed_color(face->foreground, f) set];
 
-  NSRectFill(r);
-  ns_unfocus (f);
+      NSRectFill(r);
+      ns_unfocus (f);
+    }
 }
 
 
@@ -3357,39 +3338,40 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
 
   NSTRACE ("ns_draw_window_divider");
 
-  ns_focus (f, &divider, 1);
-
-  if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
-    /* A vertical divider, at least three pixels wide: Draw first and
-       last pixels differently.  */
+  if (ns_focus (f, &divider, 1))
     {
-      [ns_lookup_indexed_color(color_first, f) set];
-      NSRectFill(NSMakeRect (x0, y0, 1, y1 - y0));
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(NSMakeRect (x0 + 1, y0, x1 - x0 - 2, y1 - y0));
-      [ns_lookup_indexed_color(color_last, f) set];
-      NSRectFill(NSMakeRect (x1 - 1, y0, 1, y1 - y0));
-    }
-  else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
-    /* A horizontal divider, at least three pixels high: Draw first and
-       last pixels differently.  */
-    {
-      [ns_lookup_indexed_color(color_first, f) set];
-      NSRectFill(NSMakeRect (x0, y0, x1 - x0, 1));
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(NSMakeRect (x0, y0 + 1, x1 - x0, y1 - y0 - 2));
-      [ns_lookup_indexed_color(color_last, f) set];
-      NSRectFill(NSMakeRect (x0, y1 - 1, x1 - x0, 1));
-    }
-  else
-    {
-      /* In any other case do not draw the first and last pixels
-         differently.  */
-      [ns_lookup_indexed_color(color, f) set];
-      NSRectFill(divider);
-    }
+      if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
+        /* A vertical divider, at least three pixels wide: Draw first and
+           last pixels differently.  */
+        {
+          [ns_lookup_indexed_color(color_first, f) set];
+          NSRectFill(NSMakeRect (x0, y0, 1, y1 - y0));
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(NSMakeRect (x0 + 1, y0, x1 - x0 - 2, y1 - y0));
+          [ns_lookup_indexed_color(color_last, f) set];
+          NSRectFill(NSMakeRect (x1 - 1, y0, 1, y1 - y0));
+        }
+      else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
+        /* A horizontal divider, at least three pixels high: Draw first and
+           last pixels differently.  */
+        {
+          [ns_lookup_indexed_color(color_first, f) set];
+          NSRectFill(NSMakeRect (x0, y0, x1 - x0, 1));
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(NSMakeRect (x0, y0 + 1, x1 - x0, y1 - y0 - 2));
+          [ns_lookup_indexed_color(color_last, f) set];
+          NSRectFill(NSMakeRect (x0, y1 - 1, x1 - x0, 1));
+        }
+      else
+        {
+          /* In any other case do not draw the first and last pixels
+             differently.  */
+          [ns_lookup_indexed_color(color, f) set];
+          NSRectFill(divider);
+        }
 
-  ns_unfocus (f);
+      ns_unfocus (f);
+    }
 }
 
 static void
@@ -3988,83 +3970,84 @@ Function modeled after x_draw_glyph_string_box ().
       n = ns_get_glyph_string_clip_rect (s, r);
       *r = NSMakeRect (s->x, s->y, s->background_width, s->height);
 
-      ns_focus (s->f, r, n);
-
-      if (s->hl == DRAW_MOUSE_FACE)
-       {
-         face = FACE_FROM_ID_OR_NULL (s->f,
-				      MOUSE_HL_INFO (s->f)->mouse_face_face_id);
-         if (!face)
-           face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
-       }
-      else
-       face = FACE_FROM_ID (s->f, s->first_glyph->face_id);
-
-      bgCol = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f);
-      fgCol = ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f);
-
-      for (i = 0; i < n; ++i)
+      if (ns_focus (s->f, r, n))
         {
-          if (!s->row->full_width_p)
+          if (s->hl == DRAW_MOUSE_FACE)
             {
-	      int overrun, leftoverrun;
-
-              /* truncate to avoid overwriting fringe and/or scrollbar */
-	      overrun = max (0, (s->x + s->background_width)
-			     - (WINDOW_BOX_RIGHT_EDGE_X (s->w)
-				- WINDOW_RIGHT_FRINGE_WIDTH (s->w)));
-              r[i].size.width -= overrun;
-
-	      /* truncate to avoid overwriting to left of the window box */
-	      leftoverrun = (WINDOW_BOX_LEFT_EDGE_X (s->w)
-			     + WINDOW_LEFT_FRINGE_WIDTH (s->w)) - s->x;
-
-	      if (leftoverrun > 0)
-		{
-		  r[i].origin.x += leftoverrun;
-		  r[i].size.width -= leftoverrun;
-		}
-
-              /* XXX: Try to work between problem where a stretch glyph on
-                 a partially-visible bottom row will clear part of the
-                 modeline, and another where list-buffers headers and similar
-                 rows erroneously have visible_height set to 0.  Not sure
-                 where this is coming from as other terms seem not to show.  */
-              r[i].size.height = min (s->height, s->row->visible_height);
+              face = FACE_FROM_ID_OR_NULL (s->f,
+                                           MOUSE_HL_INFO (s->f)->mouse_face_face_id);
+              if (!face)
+                face = FACE_FROM_ID (s->f, MOUSE_FACE_ID);
             }
+          else
+            face = FACE_FROM_ID (s->f, s->first_glyph->face_id);
 
-          [bgCol set];
+          bgCol = ns_lookup_indexed_color (NS_FACE_BACKGROUND (face), s->f);
+          fgCol = ns_lookup_indexed_color (NS_FACE_FOREGROUND (face), s->f);
 
-          /* NOTE: under NS this is NOT used to draw cursors, but we must avoid
-             overwriting cursor (usually when cursor on a tab).  */
-          if (s->hl == DRAW_CURSOR)
+          for (i = 0; i < n; ++i)
             {
-              CGFloat x, width;
+              if (!s->row->full_width_p)
+                {
+                  int overrun, leftoverrun;
+
+                  /* truncate to avoid overwriting fringe and/or scrollbar */
+                  overrun = max (0, (s->x + s->background_width)
+                                 - (WINDOW_BOX_RIGHT_EDGE_X (s->w)
+                                    - WINDOW_RIGHT_FRINGE_WIDTH (s->w)));
+                  r[i].size.width -= overrun;
+
+                  /* truncate to avoid overwriting to left of the window box */
+                  leftoverrun = (WINDOW_BOX_LEFT_EDGE_X (s->w)
+                                 + WINDOW_LEFT_FRINGE_WIDTH (s->w)) - s->x;
+
+                    if (leftoverrun > 0)
+                      {
+                        r[i].origin.x += leftoverrun;
+                        r[i].size.width -= leftoverrun;
+                      }
+
+                    /* XXX: Try to work between problem where a stretch glyph on
+                       a partially-visible bottom row will clear part of the
+                       modeline, and another where list-buffers headers and similar
+                       rows erroneously have visible_height set to 0.  Not sure
+                       where this is coming from as other terms seem not to show.  */
+                    r[i].size.height = min (s->height, s->row->visible_height);
+                }
+
+              [bgCol set];
+
+              /* NOTE: under NS this is NOT used to draw cursors, but we must avoid
+                 overwriting cursor (usually when cursor on a tab).  */
+              if (s->hl == DRAW_CURSOR)
+                {
+                  CGFloat x, width;
 
-              x = r[i].origin.x;
-              width = s->w->phys_cursor_width;
-              r[i].size.width -= width;
-              r[i].origin.x += width;
+                  x = r[i].origin.x;
+                  width = s->w->phys_cursor_width;
+                  r[i].size.width -= width;
+                  r[i].origin.x += width;
 
-              NSRectFill (r[i]);
+                  NSRectFill (r[i]);
 
-              /* Draw overlining, etc. on the cursor.  */
-              if (s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-                ns_draw_text_decoration (s, face, bgCol, width, x);
+                  /* Draw overlining, etc. on the cursor.  */
+                  if (s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+                    ns_draw_text_decoration (s, face, bgCol, width, x);
+                  else
+                    ns_draw_text_decoration (s, face, fgCol, width, x);
+                }
               else
-                ns_draw_text_decoration (s, face, fgCol, width, x);
-            }
-          else
-            {
-              NSRectFill (r[i]);
-            }
+                {
+                  NSRectFill (r[i]);
+                }
 
-          /* Draw overlining, etc. on the stretch glyph (or the part
-             of the stretch glyph after the cursor).  */
-          ns_draw_text_decoration (s, face, fgCol, r[i].size.width,
-                                   r[i].origin.x);
+              /* Draw overlining, etc. on the stretch glyph (or the part
+                 of the stretch glyph after the cursor).  */
+              ns_draw_text_decoration (s, face, fgCol, r[i].size.width,
+                                       r[i].origin.x);
+            }
+          ns_unfocus (s->f);
         }
-      ns_unfocus (s->f);
       s->background_filled_p = 1;
     }
 }
@@ -4214,9 +4197,11 @@ overwriting cursor (usually when cursor on a tab).  */
             if (next->first_glyph->type != STRETCH_GLYPH)
               {
                 n = ns_get_glyph_string_clip_rect (s->next, r);
-                ns_focus (s->f, r, n);
-                ns_maybe_dumpglyphs_background (s->next, 1);
-                ns_unfocus (s->f);
+                if (ns_focus (s->f, r, n))
+                  {
+                    ns_maybe_dumpglyphs_background (s->next, 1);
+                    ns_unfocus (s->f);
+                  }
               }
             else
               {
@@ -4231,10 +4216,12 @@ overwriting cursor (usually when cursor on a tab).  */
 	    || s->first_glyph->type == COMPOSITE_GLYPH))
     {
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_maybe_dumpglyphs_background (s, 1);
-      ns_dumpglyphs_box_or_relief (s);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_maybe_dumpglyphs_background (s, 1);
+          ns_dumpglyphs_box_or_relief (s);
+          ns_unfocus (s->f);
+        }
       box_drawn_p = 1;
     }
 
@@ -4243,9 +4230,11 @@ overwriting cursor (usually when cursor on a tab).  */
 
     case IMAGE_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_dumpglyphs_image (s, r[0]);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_dumpglyphs_image (s, r[0]);
+          ns_unfocus (s->f);
+        }
       break;
 
     case STRETCH_GLYPH:
@@ -4255,66 +4244,68 @@ overwriting cursor (usually when cursor on a tab).  */
     case CHAR_GLYPH:
     case COMPOSITE_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
+      if (ns_focus (s->f, r, n))
+        {
+          if (s->for_overlaps || (s->cmp_from > 0
+                                  && ! s->first_glyph->u.cmp.automatic))
+            s->background_filled_p = 1;
+          else
+            ns_maybe_dumpglyphs_background
+              (s, s->first_glyph->type == COMPOSITE_GLYPH);
 
-      if (s->for_overlaps || (s->cmp_from > 0
-			      && ! s->first_glyph->u.cmp.automatic))
-        s->background_filled_p = 1;
-      else
-        ns_maybe_dumpglyphs_background
-          (s, s->first_glyph->type == COMPOSITE_GLYPH);
+          if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+            {
+              unsigned long tmp = NS_FACE_BACKGROUND (s->face);
+              NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
+              NS_FACE_FOREGROUND (s->face) = tmp;
+            }
 
-      if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-        {
-          unsigned long tmp = NS_FACE_BACKGROUND (s->face);
-          NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
-          NS_FACE_FOREGROUND (s->face) = tmp;
-        }
+          {
+            BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
 
-      {
-        BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
+            if (isComposite)
+              ns_draw_composite_glyph_string_foreground (s);
+            else
+              ns_draw_glyph_string_foreground (s);
+          }
 
-        if (isComposite)
-          ns_draw_composite_glyph_string_foreground (s);
-        else
-          ns_draw_glyph_string_foreground (s);
-      }
+          {
+            NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0
+                            ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (s->face),
+                                                       s->f)
+                            : FRAME_FOREGROUND_COLOR (s->f));
+            [col set];
+
+            /* Draw underline, overline, strike-through.  */
+            ns_draw_text_decoration (s, s->face, col, s->width, s->x);
+          }
 
-      {
-        NSColor *col = (NS_FACE_FOREGROUND (s->face) != 0
-                        ? ns_lookup_indexed_color (NS_FACE_FOREGROUND (s->face),
-                                                   s->f)
-                        : FRAME_FOREGROUND_COLOR (s->f));
-        [col set];
-
-        /* Draw underline, overline, strike-through.  */
-        ns_draw_text_decoration (s, s->face, col, s->width, s->x);
-      }
+          if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
+            {
+              unsigned long tmp = NS_FACE_BACKGROUND (s->face);
+              NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
+              NS_FACE_FOREGROUND (s->face) = tmp;
+            }
 
-      if (s->hl == DRAW_CURSOR && s->w->phys_cursor_type == FILLED_BOX_CURSOR)
-        {
-          unsigned long tmp = NS_FACE_BACKGROUND (s->face);
-          NS_FACE_BACKGROUND (s->face) = NS_FACE_FOREGROUND (s->face);
-          NS_FACE_FOREGROUND (s->face) = tmp;
+          ns_unfocus (s->f);
         }
-
-      ns_unfocus (s->f);
       break;
 
     case GLYPHLESS_GLYPH:
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-
-      if (s->for_overlaps || (s->cmp_from > 0
-			      && ! s->first_glyph->u.cmp.automatic))
-        s->background_filled_p = 1;
-      else
-        ns_maybe_dumpglyphs_background
-          (s, s->first_glyph->type == COMPOSITE_GLYPH);
-      /* ... */
-      /* Not yet implemented.  */
-      /* ... */
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          if (s->for_overlaps || (s->cmp_from > 0
+                                  && ! s->first_glyph->u.cmp.automatic))
+            s->background_filled_p = 1;
+          else
+            ns_maybe_dumpglyphs_background
+              (s, s->first_glyph->type == COMPOSITE_GLYPH);
+          /* ... */
+          /* Not yet implemented.  */
+          /* ... */
+          ns_unfocus (s->f);
+        }
       break;
 
     default:
@@ -4325,9 +4316,11 @@ overwriting cursor (usually when cursor on a tab).  */
   if (!s->for_overlaps && !box_drawn_p && s->face->box != FACE_NO_BOX)
     {
       n = ns_get_glyph_string_clip_rect (s, r);
-      ns_focus (s->f, r, n);
-      ns_dumpglyphs_box_or_relief (s);
-      ns_unfocus (s->f);
+      if (ns_focus (s->f, r, n))
+        {
+          ns_dumpglyphs_box_or_relief (s);
+          ns_unfocus (s->f);
+        }
     }
 
   s->num_clips = 0;
@@ -5133,7 +5126,7 @@ static Lisp_Object ns_string_to_lispmod (const char *s)
   ns_after_update_window_line,
   ns_update_window_begin,
   ns_update_window_end,
-  0, /* flush_display */
+  ns_flush_display, /* flush_display */
   x_clear_window_mouse_face,
   x_get_glyph_overhangs,
   x_fix_overlapping_area,
-- 
2.19.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2018-06-19 23:09 bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave zentrope@fastmail.fm
                   ` (3 preceding siblings ...)
  2018-09-19 16:36 ` bug#31904: bug##31904 Zack Piper
@ 2019-09-28 17:54 ` Stefan Kangas
  2019-09-28 21:14   ` Alan Third
  4 siblings, 1 reply; 16+ messages in thread
From: Stefan Kangas @ 2019-09-28 17:54 UTC (permalink / raw)
  To: Alan Third; +Cc: zentrope@fastmail.fm, 31904

Alan Third <alan@idiocy.org> writes:

> Sorry, I thought I’d already replied to this.
>
> On Sun, Aug 19, 2018 at 04:51:36PM -0700, zentrope@fastmail.fm wrote:
>>
>> Another interesting thing:
>>
>> * The problem does NOT occur when changing the size of the font.
>>
>> * If I change the font (to Monaco), the screen blanks, but
>>   immediately running a command to change the font size “fixes” it.
>>
>> Seems that the font-change isn’t triggering a “repaint the whole
>> thing”, rather, just repaint the line containing the pointer.
>
> Yes, that sounds right. Chances are the line with the cursor on it
> redraws because the cursor is drawn as a separate action.
>
> Probably the font change needs to mark the frame as garbaged so it’s
> redrawn completely, but that’s not happening. Unfortunately I don’t
> know where that should be done. I can’t see anywhere obvious in the NS
> code. I’ll keep looking.

What's the status here?  I can see that some code has been added in
reference to this bug in commit 7946445962372c42, but I'm not sure if
that fixed all outstanding issues.

I don't have macOS 10.14 so I can't test any of this myself.

Best regards,
Stefan Kangas





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#31904: scatch/ns-drawing
  2019-09-28 17:54 ` bug#31904: scatch/ns-drawing Stefan Kangas
@ 2019-09-28 21:14   ` Alan Third
  0 siblings, 0 replies; 16+ messages in thread
From: Alan Third @ 2019-09-28 21:14 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: zentrope@fastmail.fm, 31904

On Sat, Sep 28, 2019 at 07:54:26PM +0200, Stefan Kangas wrote:
> Alan Third <alan@idiocy.org> writes:
> 
> > Sorry, I thought I’d already replied to this.
> >
> > On Sun, Aug 19, 2018 at 04:51:36PM -0700, zentrope@fastmail.fm wrote:
> >>
> >> Another interesting thing:
> >>
> >> * The problem does NOT occur when changing the size of the font.
> >>
> >> * If I change the font (to Monaco), the screen blanks, but
> >>   immediately running a command to change the font size “fixes” it.
> >>
> >> Seems that the font-change isn’t triggering a “repaint the whole
> >> thing”, rather, just repaint the line containing the pointer.
> >
> > Yes, that sounds right. Chances are the line with the cursor on it
> > redraws because the cursor is drawn as a separate action.
> >
> > Probably the font change needs to mark the frame as garbaged so it’s
> > redrawn completely, but that’s not happening. Unfortunately I don’t
> > know where that should be done. I can’t see anywhere obvious in the NS
> > code. I’ll keep looking.
> 
> What's the status here?  I can see that some code has been added in
> reference to this bug in commit 7946445962372c42, but I'm not sure if
> that fixed all outstanding issues.
> 
> I don't have macOS 10.14 so I can't test any of this myself.

IIRC I’ve left this bug open as a centre for any further reports about
issues with macOS drawing. It’s not been resolved, and I have an
alternative approach, but I don’t seem to have the ability to complete
it (I’m absolutely fed up with Apple’s developer unfriendly approach
towards documenting their APIs).
-- 
Alan Third





^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-09-28 21:14 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-19 23:09 bug#31904: 27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave zentrope@fastmail.fm
2018-06-20 19:00 ` Alan Third
     [not found] ` <handler.31904.B.152945065229583.ack@debbugs.gnu.org>
2018-06-20 21:32   ` bug#31904: Acknowledgement (27.0.50; Emacs doesn't render text/modeline Mac OSX 10.14 Mojave) zentrope@fastmail.fm
2018-08-15 23:54 ` bug#31904: scatch/ns-drawing zentrope@fastmail.fm
2018-08-18 14:02   ` Alan Third
2018-08-18 18:56     ` zentrope@fastmail.fm
2018-08-18 19:16       ` zentrope@fastmail.fm
2018-08-18 19:23         ` zentrope@fastmail.fm
2018-08-19  9:59           ` Alan Third
2018-08-19 23:51             ` zentrope@fastmail.fm
2018-08-26 13:02               ` Alan Third
2018-08-19 12:41         ` Alan Third
2018-08-19 23:44           ` zentrope@fastmail.fm
2018-09-19 16:36 ` bug#31904: bug##31904 Zack Piper
2019-09-28 17:54 ` bug#31904: scatch/ns-drawing Stefan Kangas
2019-09-28 21:14   ` Alan Third

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).