From: Alan Third <alan@idiocy.org>
To: Aaron Jensen <aaronjensen@gmail.com>
Cc: "Mattias Engdegård" <mattiase@acm.org>,
"Robert Pluim" <rpluim@gmail.com>,
32932@debbugs.gnu.org
Subject: bug#32932: 27.0.50; render bugs on macOS Mojave
Date: Mon, 3 Feb 2020 21:28:17 +0000 [thread overview]
Message-ID: <20200203212817.GB59034@breton.holly.idiocy.org> (raw)
In-Reply-To: <CAHyO48yg8nEZtvOaF47mNgDi7F7HjuiNSNKiMeOobD_KZ9UCEg@mail.gmail.com>
On Sun, Feb 02, 2020 at 04:14:51PM -0800, Aaron Jensen wrote:
> On Sun, Feb 2, 2020 at 2:30 PM Alan Third <alan@idiocy.org> wrote:
> >
> > I know exactly what’s causing the glitching, but I’ll come back to
> > this tomorrow.
>
> Looking forward to hearing more.
How Cocoa is supposed to work:
When a part of the view must be updated you mark it as dirty. You can
also mark the entire view.
At some point in the NS run loop the graphics context for the window
is set up and drawing is clipped to the areas that were marked as
dirty.
Starting with the first opaque view drawRect is called on each view
that intersects the dirty rectangles. drawRect redraws the contents of
those rectangles.
The dirty rectangles are reset and the process begins again.
The application may not draw to the view outwith drawRect, the only
exception being scrollRect, which appears to require being called
outwith drawRect.
Emacs 27:
Redisplay thinks it’s drawing to the view as it runs, however on NS it
just marks areas as dirty and calling scrollRect.
Once redisplay is completed the run loop starts the process that calls
drawRect.
In the normal case the first opaque view is the NSWindow, which is
blank. It’s just set to the background colour. This immediately clears
anything that was in the dirty rectangles.
Sometimes the NSWindow may be transparent as well in which case the
first opaque view will be the root window. The end result is the same,
the dirty rectangles are now ‘clear’.
EmacsView’s drawRect is called. This calls expose_frame which
draws the contents of the dirty rectangles for real this time.
All is well.
But not always.
Sometimes when expose_frame is called the frame has been marked as
garbaged, so expose_frame refuses to do any drawing. Since the dirty
rectangles have already been cleared by the NSWindow we now have blank
spaces displayed to the user.
Even worse the dirty rectangles are now reset and Emacs has no idea
that those areas are blank so it makes no further attempts to redraw
them.
(IIRC just forcing a display at the end of redisplay, before anything
else has had a chance to garbage the frame, doesn’t work.)
Scrolling is a problem too. scrollRect (which is deprecated and will
be removed) copies the contents of the screen. Sometimes the parts of
the screen it copies contain the cursor. Normally Emacs clears the
cursor before copying parts of the screen, however Cocoa doesn’t let
us draw to the screen outwith drawRect, so we can’t clear the cursor
before calling scrollRect.
The work‐around in use here is to copy the dirty rectangles with the
part of the screen we’re copying. There’s a reasonable chance that we
end up redrawing most of the area that was copied in an attempt to
clear the cursor(s).
Conclusion:
Drawing to a bitmap is just much easier than trying to fix these
issues, although they probably are fixable.
We need a replacement for scrollRect. My hope is that we can save up
the copy commands and replay them within drawRect, that way we can
remove the cursor before copying.
If we make the EmacsView opaque the dirty rectangles aren’t cleared,
however we need to be much more careful about drawing to the whole
view as blank areas aren’t magically cleared for us. And we can never
have a transparent background, which I don’t see as much of a loss,
but some might.
IMO the best solution would be if expose_frame was able to always
redraw the last matrix created by redisplay, however this isn’t
possible, and I’ve never managed to understand enough of redisplay to
know why.
If expose_frame does nothing we could save the dirty rectangles and
re‐mark them sometime after. Probably at the end of the next
redisplay.
I think there were some other problems that I’ve forgotten, but those
were the main issues. I hope this helps explain the issues.
--
Alan Third
next prev parent reply other threads:[~2020-02-03 21:28 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
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 [this message]
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=20200203212817.GB59034@breton.holly.idiocy.org \
--to=alan@idiocy.org \
--cc=32932@debbugs.gnu.org \
--cc=aaronjensen@gmail.com \
--cc=mattiase@acm.org \
--cc=rpluim@gmail.com \
/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).