unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Third <alan@idiocy.org>
To: Aaron Jensen <aaronjensen@gmail.com>
Cc: Boris Buliga <boris@d12frosted.io>, 32932@debbugs.gnu.org
Subject: bug#32932: 27.0.50; render bugs on macOS Mojave
Date: Mon, 29 Oct 2018 16:09:43 +0000	[thread overview]
Message-ID: <20181029160943.GA60662@breton.holly.idiocy.org> (raw)
In-Reply-To: <CAHyO48zkzjTVTAMmSh++eyc=RqhQTNwNmCJyFsBYnzg43noM1Q@mail.gmail.com>

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

On Sun, Oct 28, 2018 at 07:18:04PM -0700, Aaron Jensen wrote:
> On October 24, 2018 at 3:42:47 AM, Alan Third
> (alan@idiocy.org(mailto:alan@idiocy.org)) wrote:
> 
> > I’ve pushed a slight variant of this change to emacs-26. I’ve
> > witnessed a very rare flicker of the modeline and the line containing
> > the cursor in other windows while scrolling, but I can’t replicate it
> > consistently.
> 
> I am definitely seeing the flicker on the current line. It happens
> occasionally when my emacs is idle (probably not truly idle). I see it
> sometimes when I tell emacs to do something that is a thread blocking
> operation (like loading some autoloaded lisp for the first time). It’s
> as if it clears the current line and then immediately blocks the
> rendering thread before it gets a chance to rerender the line. As soon
> as Emacs is done doing whatever it was doing, the line rerenders.
> 
> No clue if that helps, but if there’s anything you want to try, I’ll
> be able to let you know if it fixes it :)

One more go. I don’t think I’ve seen the cursor line flicker after
installing this.

Simply, all I’ve done is stop making it redraw the entire line the
cursor is on. That should stop any flicker of the line text caused by
redrawing the cursor, but won’t stop any flicker of the cursor itself,
although I’ve not seen it flicker.

There’s a bit more in here to do with drawing the fringe bitmaps,
because that was the only other place ns_clip_to_row was being used,
so I’ve removed it from there too.
-- 
Alan Third

[-- Attachment #2: 0001-Fix-more-drawing-bugs-in-NS-port-bug-32932.patch --]
[-- Type: text/plain, Size: 7070 bytes --]

From 95160c34b4f41e867761f29239db02e8e7232bbe Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
Date: Mon, 29 Oct 2018 15:37:35 +0000
Subject: [PATCH] Fix more drawing bugs in NS port (bug#32932)

* src/nsterm.m (ns_row_rect): New function.
(ns_clip_to_row): Remove function.
(ns_copy_bits): Fix mistake.
(ns_draw_fringe_bitmap): Stop using ns_clip_to_row.
(ns_draw_window_cursor): Stop using ns_clip_to_row and move
ns_reset_clipping to try and force cursor drawing to be atomic.
---
 src/nsterm.m | 105 +++++++++++++++++++++++++++++----------------------
 1 file changed, 59 insertions(+), 46 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 4b5d025ee3..39a7b25f60 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -796,6 +796,27 @@ Free a pool and temporary objects it refers to (callable from C)
 }
 
 
+static NSRect
+ns_row_rect (struct window *w, struct glyph_row *row,
+               enum glyph_row_area area)
+/* Get the row as an NSRect.  */
+{
+  struct frame *f = XFRAME (WINDOW_FRAME (w));
+  NSRect rect;
+  int window_x, window_y, window_width;
+
+  window_box (w, area, &window_x, &window_y, &window_width, 0);
+
+  rect.origin.x = window_x;
+  rect.origin.y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, row->y));
+  rect.origin.y = max (rect.origin.y, window_y);
+  rect.size.width = window_width;
+  rect.size.height = row->visible_height;
+
+  return rect;
+}
+
+
 /* ==========================================================================
 
     Focus (clipping) and screen update
@@ -1206,28 +1227,6 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
 }
 
 
-static BOOL
-ns_clip_to_row (struct window *w, struct glyph_row *row,
-		enum glyph_row_area area, BOOL gc)
-/* --------------------------------------------------------------------------
-     Internal (but parallels other terms): Focus drawing on given row
-   -------------------------------------------------------------------------- */
-{
-  struct frame *f = XFRAME (WINDOW_FRAME (w));
-  NSRect clip_rect;
-  int window_x, window_y, window_width;
-
-  window_box (w, area, &window_x, &window_y, &window_width, 0);
-
-  clip_rect.origin.x = window_x;
-  clip_rect.origin.y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, row->y));
-  clip_rect.origin.y = max (clip_rect.origin.y, window_y);
-  clip_rect.size.width = window_width;
-  clip_rect.size.height = row->visible_height;
-
-  return ns_clip_to_rect (f, &clip_rect, 1);
-}
-
 /* ==========================================================================
 
     Visible bell and beep.
@@ -2692,7 +2691,7 @@ so some key presses (TAB) are swallowed by the system. */
 ns_copy_bits (struct frame *f, NSRect src, NSRect dest)
 {
   NSSize delta = NSMakeSize (dest.origin.x - src.origin.x,
-                             dest.origin.y - src.origin.y)
+                             dest.origin.y - src.origin.y);
   NSTRACE ("ns_copy_bits");
 
   if (FRAME_NS_VIEW (f))
@@ -2911,6 +2910,9 @@ so some key presses (TAB) are swallowed by the system. */
   struct face *face = p->face;
   static EmacsImage **bimgs = NULL;
   static int nBimgs = 0;
+  NSRect clearRect = NSZeroRect;
+  NSRect imageRect = NSZeroRect;
+  NSRect rowRect = ns_row_rect (w, row, ANY_AREA);
 
   NSTRACE_WHEN (NSTRACE_GROUP_FRINGE, "ns_draw_fringe_bitmap");
   NSTRACE_MSG ("which:%d cursor:%d overlay:%d width:%d height:%d period:%d",
@@ -2925,25 +2927,40 @@ so some key presses (TAB) are swallowed by the system. */
       nBimgs = max_used_fringe_bitmap;
     }
 
-  /* Must clip because of partially visible lines.  */
-  if (ns_clip_to_row (w, row, ANY_AREA, YES))
+  /* Work out the rectangle we will composite into.  */
+  if (p->which)
+    imageRect = NSMakeRect (p->x, p->y, p->wd, p->h);
+
+  /* Work out the rectangle we will need to clear.  Because we're
+     compositing rather than blitting, we need to clear the area under
+     the image regardless of anything else.  */
+  if (!p->overlay_p)
+    {
+      clearRect = NSMakeRect (p->bx, p->by, p->nx, p->ny);
+      clearRect = NSUnionRect (clearRect, imageRect);
+    }
+  else
     {
-      if (!p->overlay_p)
+      clearRect = imageRect;
+    }
+
+  /* Handle partially visible rows.  */
+  clearRect = NSIntersectionRect (clearRect, rowRect);
+
+  /* The visible portion of imageRect will always be contained within
+     clearRect.  */
+  if (ns_clip_to_rect (f, &clearRect, 1))
+    {
+      if (! NSIsEmptyRect (clearRect))
         {
-          int bx = p->bx, by = p->by, nx = p->nx, ny = p->ny;
+          NSTRACE_RECT ("clearRect", clearRect);
 
-          if (bx >= 0 && nx > 0)
-            {
-              NSRect r = NSMakeRect (bx, by, nx, ny);
-              NSRectClip (r);
-              [ns_lookup_indexed_color (face->background, f) set];
-              NSRectFill (r);
-            }
+          [ns_lookup_indexed_color(face->background, f) set];
+          NSRectFill (clearRect);
         }
 
       if (p->which)
         {
-          NSRect r = NSMakeRect (p->x, p->y, p->wd, p->h);
           EmacsImage *img = bimgs[p->which - 1];
 
           if (!img)
@@ -2964,13 +2981,6 @@ so some key presses (TAB) are swallowed by the system. */
               xfree (cbits);
             }
 
-          NSTRACE_RECT ("r", r);
-
-          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);
 
           {
             NSColor *bm_color;
@@ -2990,7 +3000,7 @@ so some key presses (TAB) are swallowed by the system. */
 
           NSTRACE_RECT ("fromRect", fromRect);
 
-          [img drawInRect: r
+          [img drawInRect: imageRect
                  fromRect: fromRect
                 operation: NSCompositingOperationSourceOver
                  fraction: 1.0
@@ -2998,7 +3008,7 @@ so some key presses (TAB) are swallowed by the system. */
                     hints: nil];
 #else
           {
-            NSPoint pt = r.origin;
+            NSPoint pt = imageRect.origin;
             pt.y += p->h;
             [img compositeToPoint: pt operation: NSCompositingOperationSourceOver];
           }
@@ -3088,7 +3098,9 @@ 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.  */
-  if (ns_clip_to_row (w, glyph_row, TEXT_AREA, NO))
+  r = NSIntersectionRect (r, ns_row_rect (w, glyph_row, TEXT_AREA));
+
+  if (ns_clip_to_rect (f, &r, 1))
     {
       face = FACE_FROM_ID_OR_NULL (f, phys_cursor_glyph->face_id);
       if (face && NS_FACE_BACKGROUND (face)
@@ -3128,11 +3140,12 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
           NSRectFill (s);
           break;
         }
-      ns_reset_clipping (f);
 
       /* draw the character under the cursor */
       if (cursor_type != NO_CURSOR)
         draw_phys_cursor_glyph (w, glyph_row, DRAW_CURSOR);
+
+      ns_reset_clipping (f);
     }
 }
 
-- 
2.18.0


  reply	other threads:[~2018-10-29 16:09 UTC|newest]

Thread overview: 144+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-04 13:05 bug#32932: 27.0.50; render bugs on macOS Mojave Aaron Jensen
2018-10-04 14:07 ` Alan Third
2018-10-04 17:33   ` Charles A. Roelli
2018-10-04 17:48   ` Aaron Jensen
2018-10-04 18:25     ` Alan Third
     [not found]       ` <CAHyO48xS6yOWVvw2Gu+Hjumahe5BC3-EA+Mwztz4831Ac2U6aA@mail.gmail.com>
2018-10-04 18:45         ` Alan Third
2018-10-04 21:51           ` Alan Third
2018-10-04 23:03             ` Aaron Jensen
     [not found]               ` <CAHyO48zMuX95RB7hRYxAxt6wH_XB6sF1kmnbWZWmjpPhnkqjdg@mail.gmail.com>
2018-10-09  7:15                 ` Boris Buliga
2018-10-10 18:27                   ` Alan Third
2018-10-11  3:40                     ` Aaron Jensen
2018-10-14  8:19                       ` Aaron Jensen
2018-10-14  9:04                         ` Boris Buliga
2018-10-14 18:20                         ` Alan Third
2018-10-14 20:17                           ` Aaron Jensen
2018-10-16  4:53                             ` Boris Buliga
2018-10-16  8:39                               ` Boris Buliga
2018-10-16 19:04                               ` Aaron Jensen
2018-10-19 16:26                                 ` Aaron Jensen
2018-10-19 18:48                                   ` Alan Third
2018-10-19 19:24                                     ` Aaron Jensen
2018-10-20 20:04                                       ` Alan Third
2018-10-23  2:15                                         ` Aaron Jensen
2018-10-24 10:42                                           ` Alan Third
2018-10-29  2:18                                             ` Aaron Jensen
2018-10-29 16:09                                               ` Alan Third [this message]
2018-10-29 17:41                                                 ` Boris Buliga
2018-10-30  5:56                                                 ` Aaron Jensen
2018-10-30 15:35                                                   ` Boris Buliga
2018-10-31 21:59                                                     ` Alan Third
2018-11-01  4:25                                                       ` Aaron Jensen
2018-10-31 17:12                                                   ` Alan Third
2018-11-01  4:51                                                     ` Aaron Jensen
2018-11-01  4:58                                                       ` Aaron Jensen
2018-11-01  5:11                                                         ` Aaron Jensen
2018-11-01  6:13                                                           ` Boris Buliga
2018-11-01  6:51                                                             ` Aaron Jensen
2018-11-01 18:10                                                               ` Eli Zaretskii
2018-11-01 19:52                                                                 ` Aaron Jensen
2018-11-01 20:12                                                                   ` Eli Zaretskii
2018-11-01 20:29                                                                     ` Aaron Jensen
2018-11-03  9:23                                                                       ` Eli Zaretskii
2018-11-01 22:55                                                                 ` Alan Third
2018-11-03  9:31                                                                   ` Eli Zaretskii
2018-11-03 20:36                                                                     ` Alan Third
2018-11-03 21:03                                                                       ` Eli Zaretskii
2018-11-04 13:24                                                                         ` Alan Third
2018-11-04 20:11                                                                           ` Alan Third
2018-11-05 16:11                                                                             ` Aaron Jensen
2018-11-05 18:55                                                                               ` Alan Third
2018-11-06  4:04                                                                                 ` Aaron Jensen
2018-11-06 14:58                                                                                   ` Aaron Jensen
2018-11-08 15:21                                                                                     ` Alan Third
2018-11-08 15:35                                                                                       ` Eli Zaretskii
2018-11-08 16:17                                                                                         ` Alan Third
2018-11-08 16:28                                                                                           ` Aaron Jensen
2018-11-08 23:21                                                                                             ` Alan Third
2018-11-09  1:02                                                                                               ` Aaron Jensen
2018-11-09  9:08                                                                                                 ` bug#32932: [PATCH v2] Fix more drawing bugs in NS port (bug#32932) Alan Third
2018-11-09 13:45                                                                                                   ` Aaron Jensen
2018-11-09 14:15                                                                                                     ` Aaron Jensen
2018-11-13 22:13                                                                                                       ` Alan Third
2018-11-14 17:08                                                                                                         ` Aaron Jensen
2018-11-14 18:19                                                                                                           ` Alan Third
2018-11-16  1:20                                                                                                             ` Aaron Jensen
2018-11-19 22:35                                                                                                               ` Alan Third
2018-11-20  2:30                                                                                                                 ` Aaron Jensen
2018-11-23 18:17                                                                                                                   ` Alan Third
2018-11-26 16:20                                                                                                                     ` Aaron Jensen
2019-01-25 14:02                                                                                                                       ` Aaron Jensen
2019-01-25 22:01                                                                                                                         ` Alan Third
2018-11-09  8:02                                                                                               ` bug#32932: 27.0.50; render bugs on macOS Mojave Eli Zaretskii
2018-11-08 16:51                                                                                           ` Eli Zaretskii
2018-11-08 23:23                                                                                             ` Alan Third
2018-11-03 17:57                                                                   ` Aaron Jensen
2018-11-03 19:09                                                                     ` Alan Third
2018-11-03 20:51                                                                       ` Alan Third
2018-11-03 23:56                                                                         ` Aaron Jensen
2018-11-04 13:24                                                                           ` Alan Third
2018-11-04 17:12                                                                             ` Aaron Jensen
2018-11-04 18:28                                                                               ` Eli Zaretskii
2018-10-04 19:43       ` Aaron Jensen
2018-11-03 17:56 ` Aaron Jensen
2018-11-03 18:17   ` Eli Zaretskii
2018-11-05 16:20     ` Aaron Jensen
2018-11-27  1:42 ` bug#32932: 26.2: Too many flickers with normal operations on macOS 10.13.6 Zhang Haijun
2019-11-11 18:16 ` bug#32932: 27.0.50; render bugs on macOS Mojave Alan Third
2019-11-12 13:27   ` Robert Pluim
2019-11-12 14:38     ` Alan Third
2020-01-25 12:44       ` Alan Third
2020-01-25 13:37         ` Eli Zaretskii
2020-01-27 11:06           ` Robert Pluim
2020-01-27 20:45             ` Alan Third
2020-01-28  3:21               ` Eli Zaretskii
2020-01-28 18:23                 ` Alan Third
2020-01-28 19:35 ` Aaron Jensen
2020-01-28 20:07   ` Eli Zaretskii
2020-01-28 20:11     ` Aaron Jensen
2020-01-28 20:21       ` Eli Zaretskii
2020-01-28 20:24         ` Aaron Jensen
2020-01-29 10:08   ` Alan Third via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-01-29 16:32     ` Aaron Jensen
2020-01-29 20:04       ` Alan Third
2020-01-30  1:40         ` Aaron Jensen
2020-01-30 19:11           ` Alan Third
2020-01-30 20:07             ` Aaron Jensen
2020-01-31 14:57               ` Robert Pluim
2020-01-31 20:23                 ` Alan Third
2020-01-31 20:26                   ` Aaron Jensen
2020-02-01  1:26                     ` Aaron Jensen
2020-02-01 14:22                       ` Alan Third
2020-02-01 16:29                         ` Aaron Jensen
2020-02-01 21:20                           ` Alan Third
2020-02-01 23:05                             ` Aaron Jensen
2020-02-02 13:42                               ` Alan Third
2020-01-31  1:16             ` Stefan Kangas
2020-01-31 21:34 ` Mattias Engdegård
2020-02-02 12:31 ` Mattias Engdegård
2020-02-02 13:46   ` Alan Third
2020-02-02 16:49     ` Aaron Jensen
2020-02-02 22:30       ` Alan Third
2020-02-02 22:44         ` Mattias Engdegård
2020-02-03  0:14         ` Aaron Jensen
2020-02-03  7:39           ` Alan Third
2020-02-03  8:16             ` Aaron Jensen
2020-02-03 20:44               ` Alan Third
2020-02-03 20:46                 ` Aaron Jensen
2020-02-03 21:30                   ` Alan Third
2020-02-06 18:04                     ` Aaron Jensen
2020-02-07 20:18                       ` Alan Third
2020-02-08  1:26                         ` Aaron Jensen
2020-02-08 14:13                           ` Alan Third
2020-02-08 16:45                             ` Aaron Jensen
2020-02-10  7:44                               ` Alan Third
2020-02-10 15:21                                 ` Aaron Jensen
2020-02-10 17:14                                   ` Aaron Jensen
2020-02-10 21:33                                   ` Alan Third
2020-02-13 17:24                                     ` Aaron Jensen
2020-02-13 18:32                                       ` Alan Third
2020-02-03 16:04             ` Mattias Engdegård
2020-02-03 16:05               ` Aaron Jensen
2020-02-03 16:09                 ` Mattias Engdegård
2020-02-03 21:28           ` Alan Third
2020-02-10  8:59 ` Robert Pluim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181029160943.GA60662@breton.holly.idiocy.org \
    --to=alan@idiocy.org \
    --cc=32932@debbugs.gnu.org \
    --cc=aaronjensen@gmail.com \
    --cc=boris@d12frosted.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).