all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Akira Kyle <ak@akirakyle.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Rethinking the design of xwidgets
Date: Tue, 13 Oct 2020 14:37:31 -0600	[thread overview]
Message-ID: <86pn5luak4.fsf@akirakyle.com> (raw)
In-Reply-To: <83imbe1040.fsf@gnu.org>


On Tue, Oct 13, 2020 at 11:55 AM, Eli Zaretskii <eliz@gnu.org> 
wrote:

> I'll need to read up on those two topics, but in general, as 
> someone
> already pointed out, the Emacs display of images supports
> interactivity by letting you call functions triggered by mouse
> gestures on the varipous spots on the image.  If such a function
> produces a zoomed-in/out image and displays it instead of the 
> original
> one, wouldn't that fulfill the need?  E.g., we already support
> animated GIF images and zoom-in/out by mouse scroll, so it is
> inaccurate to say that we can only display static images.

Can actions be triggered on a click and drag as one would do to 
pan within a plot?

> This use case doesn't necessarily call for the same solution, 
> but I
> could think of a differently designed pdf-viewer that didn't 
> need to
> rasterize each page separately.  Again, the mouse-sensitivity 
> feature
> of our image display could perhaps be used for something like 
> that.  I
> reckon the hardest problem is to find an engine, be it a library 
> or a
> program, that could convert PDF into something Emacs can 
> display.

As far as I know there are really only two FLOSS PDF libraries out 
there: poppler and muPDF. Between them poppler supports more PDF 
features and seems to be more widely used. I agree this isn't 
really as compelling of a use case for xwidgets, but I seems like 
it would be easier to achieve better PDF rendering via xwidgets. I 
don't think it's about needing to rasterize each page separately, 
its more about directly rendering the rasterized image without 
having to copy it around a bunch or convert it to different 
formats. I suppose the image rendering from an elisp string could 
be made more performant or Emacs could handle pdf display natively 
but that would require adding poppler as a dependency.

> E.g., the kludge in dispnew.c around line 4365.  It disables one 
> of
> the most important redisplay optimizations in Emacs, once you 
> build
> with xwidgets enabled.

Ah, I had briefly looked at that but I wasn't sure how important 
it was. I may be able to make some progress on that but it's hard 
to understand the context for that function. It seems like that 
function is responsible for an optimization that avoids redrawing 
glyphs if the window is being scrolled by copying them, however I 
couldn't find where or how the glyphs are actually copied?

>> For example, consider svg support, which is my preferred image 
>> format. As far is I can tell, currently Emacs rasterizes svgs 
>> itself before ultimately drawing them on a cairo context.
>
> Do we actually do that?  We use librsvg, don't we?
>
> Or maybe you are talking about the generic layer of image 
> handling,
> which basically needs a bitmap/pixmap?

Yes this is what I'm talking about. In svg_load_image librsvg is 
used to end up with the rasterized svg in an Emacs_Pix_Container 
which then goes through a song and dance of pixel level color and 
transparency transformations to all eventually end back up as a 
cairo surface. Unless I'm missing something it seems like all this 
extra complexity and copying around is just for the sake of 
maintaining Emacs's own image format which was established long 
before HiDPI, deep color depth displays and libraries like cairo 
that do the hard work of transforming and rendering onto the 
glass.

> In any case, this seems to be a much more fundamental issue of 
> how we
> display images in Emacs.  Which is not necessarily the same as 
> the
> issue you raised originally.

It's at least related since the integration xwidgets into Emacs' 
display was originally modeled off of the way Emacs' displays 
images, however I see it as potentially being a simpler and more 
flexible alternative to the way Emacs currently displays images.

> The problem with that is that handling such "widgets" in our 
> display
> engine is entirely non-trivial, as the xwidgets code clearly 
> shows.
> There are basic problems in displaying xwidgets that from my POV 
> are
> left unsolved, and I'm not sure we will be able to find 
> satisfactory
> solutions for them.  The display engine has several requirements 
> that
> aren't easy to support with widgets that want to manage 
> themselves.

I think it would be good to try to either resolve such issues or 
decide that Emacs would be better off without xwidgets and instead 
focus on enhancing its existing rich display capabilities because 
as it is, the xwidgets code seems to have been lingering in this 
experimental state for a decade now. I think many like myself are 
drawn by its promise of being able to rendering complex dynamic 
content using existing optimized toolkits. There is of course the 
fact that in its current state on master the only thing it does do 
is embed a webkit browser in an Emacs window. A feature many would 
like to see enhanced while many others have voiced both security, 
privacy, and freedom concerns with such a feature. I'd just like 
to see a plan on where the community thinks xwidgets should go and 
work from there since it's been experimental for far too long.

> I see where you are coming from with the idea of dynamic 
> modules, but
> I'm not sure your assumption that it will make things easier for
> implementing "display elements" that have their own behavior
> independent of Emacs -- I'm not sure this assumption is indeed 
> true.
> The Emacs display code has a deceptively simple main design idea 
> and
> execution concept, and as long as one thinks this is all there 
> is to
> it, it could indeed seem that adding such widgets should be 
> almost
> trivial.  But the reality is that there are a lot of details to 
> go
> with the main idea, and it's the details that make implementing 
> this
> stuff more difficult than one thinks first.

Thank you for taking the time to talk through this with me. I'm 
seeing more and more that when it comes to the C portion of Emacs' 
code, nothing is ever quite so straightforward and it's difficult 
to understand all the intricacies due to the sheer amount of code.

> I'm not trying to scare you, mind you, just point out that the 
> ideas
> you have should probably be talked through in mode detail, to 
> see that
> they are workable.  For example, did you study the various
> window-redisplay optimizations, and if so, did you think how the
> widgets will adapt to them?

I'm just starting to dig my teeth into some of that. However I'm 
wondering if anyone has more recently tried to quantify the 
improvements the various redisplay optimizations make to both 
actual and perceived render time of Emacs. For example the comment 
on the scrolling_window function in dispnew.c that you pointed me 
too references that it is implementing an algorithm from 1978, 
perhaps it would be worth exploring if there are any algorithmic 
advances? It strikes me that perhaps some optimizations may no 
longer be as necessary on modern hardware or on GUI displays as 
they were when running emacs in a VT on 20 year 
hardware. Conversely there may be further optimization that could 
be done by taking advantage of more recent hardware advances such 
as offloading to a GPU or utilizing vectorized instructions. If 
there's one think I've taken away from my CS education, its that 
indeed "premature optimization is the root of all evil". I know 
Emacs prides itself on its broad portability, however when it 
comes to xwidgets we already know such a feature is restricted to 
running on the hardware that gtk3 expects. Anyways I know these 
are mostly lofty thoughts but I'd like to continue to see Emacs 
evolve.



  parent reply	other threads:[~2020-10-13 20:37 UTC|newest]

Thread overview: 224+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-12 20:58 Rethinking the design of xwidgets Akira Kyle
2020-10-12 22:18 ` joakim
2020-10-13 16:07   ` Akira Kyle
2020-10-13 19:06     ` joakim
2020-10-14  0:33       ` Akira Kyle
2020-10-13 13:36 ` Stefan Monnier
2020-10-13 16:09   ` Akira Kyle
2020-10-13 14:16 ` Eli Zaretskii
2020-10-13 17:05   ` Akira Kyle
2020-10-13 17:24     ` Qiantan Hong
2020-10-13 18:29       ` Akira Kyle
2020-10-13 18:44         ` Qiantan Hong
2020-10-13 19:17           ` Eli Zaretskii
2020-10-13 20:52           ` Akira Kyle
2020-10-14 14:36             ` Eli Zaretskii
2020-10-14 17:01               ` Stefan Monnier
2020-10-15 19:55                 ` arthur miller
2020-10-13 18:45         ` Eli Zaretskii
2020-10-13 21:00           ` Akira Kyle
2020-10-14 14:44             ` Eli Zaretskii
2020-10-15  0:35               ` Akira Kyle
2020-10-15  2:07                 ` Stefan Monnier
2020-10-15  3:35                   ` arthur miller
2020-10-15 15:06                     ` Eli Zaretskii
2020-10-15 15:20                       ` Arthur Miller
2020-10-15 15:48                         ` Eli Zaretskii
2020-10-13 17:55     ` Eli Zaretskii
2020-10-13 18:42       ` Basil L. Contovounesios
2020-10-13 19:10         ` Eli Zaretskii
2020-10-13 20:37       ` Akira Kyle [this message]
2020-10-14 14:33         ` Eli Zaretskii
2020-10-14 15:04           ` Arthur Miller
2020-10-14 15:32             ` Eli Zaretskii
2020-10-15 13:20               ` Arthur Miller
2020-10-17  4:26                 ` Kai Ma
2020-10-17  4:42                   ` Qiantan Hong
2020-11-14  5:40                   ` Richard Stallman
2020-10-14 16:53             ` Stefan Monnier
2020-10-14 18:56               ` Aiko Kyle
2020-10-15 12:48                 ` Arthur Miller
2020-10-15 16:25                   ` Akira Kyle
2020-10-15 12:35               ` Arthur Miller
2020-10-16  4:02             ` Richard Stallman
2020-10-16 13:03               ` Arthur Miller
2020-10-16 18:38                 ` Dmitry Gutov
2020-10-17  4:19                   ` Richard Stallman
2020-10-17  4:21                 ` Richard Stallman
2020-10-17  6:30                   ` Arthur Miller
2020-10-17 13:35                     ` Stefan Monnier
2020-10-17 19:15                       ` Arthur Miller
2020-10-19  3:44                         ` Richard Stallman
2020-10-18  4:17                     ` Richard Stallman
2020-10-18  4:17                     ` Richard Stallman
2020-10-18  9:31                       ` Dmitry Gutov
2020-10-19  3:44                         ` Richard Stallman
2020-10-19 12:37                           ` Dmitry Gutov
2020-10-19 13:43                             ` Arthur Miller
2020-10-20  5:13                               ` Richard Stallman
2020-10-20  5:47                                 ` Arthur Miller
2020-10-20 12:58                                   ` Stefan Monnier
2020-10-20 13:40                                     ` Arthur Miller
2020-10-21  4:42                                       ` Richard Stallman
2020-10-21 12:25                                         ` Arthur Miller
2020-10-21  4:46                                   ` Richard Stallman
2020-10-20  5:14                             ` Richard Stallman
2020-10-20  5:56                               ` Arthur Miller
2020-10-20 10:45                                 ` Dmitry Gutov
2020-10-20 13:49                                   ` Arthur Miller
2020-10-20 20:11                                     ` Jean Louis
2020-10-20 23:25                                       ` Sv: " arthur miller
2020-10-21  8:10                                         ` Jean Louis
2020-10-21 11:59                                           ` Arthur Miller
2020-10-21 12:58                                             ` Hardware respecting your freedom Jean Louis
2020-10-22  2:53                                               ` Arthur Miller
2020-10-22  7:08                                                 ` Jean Louis
2020-10-23  3:40                                                 ` Richard Stallman
2020-10-23 12:53                                                   ` Arthur Miller
2020-10-23 15:15                                                     ` Pankaj Jangid
2020-10-24  3:49                                                     ` Richard Stallman
2020-10-24  6:02                                                       ` Jean Louis
2020-10-24 15:00                                                       ` Arthur Miller
2020-10-25  3:54                                                         ` Richard Stallman
2020-10-21  4:46                                 ` Rethinking the design of xwidgets Richard Stallman
2020-10-19 13:34                           ` Arthur Miller
2020-10-19 14:04                           ` Stefan Monnier
2020-10-20  5:13                             ` Richard Stallman
2020-10-18 14:41                       ` Arthur Miller
2020-10-19  3:48                         ` Richard Stallman
2020-10-19 13:48                           ` Arthur Miller
2020-10-16 14:54               ` Dmitry Gutov
2020-10-14 18:07           ` Akira Kyle
2020-10-14 18:32             ` Eli Zaretskii
2020-10-14 19:10               ` Akira Kyle
2020-10-13 18:36     ` Tomas Hlavaty
2020-10-13 18:38       ` Tomas Hlavaty
2020-10-13 21:20       ` Aiko Kyle
2020-10-14  0:12         ` Corwin Brust
2020-10-14 19:16           ` Akira Kyle
2020-10-14  7:32         ` Tomas Hlavaty
2020-10-14 15:02           ` Eli Zaretskii
2020-10-14 16:35             ` Tomas Hlavaty
2020-10-14 19:22               ` Akira Kyle
2020-10-14 21:29                 ` Tomas Hlavaty
2020-10-16  4:02                 ` Richard Stallman
2020-10-16 13:09                   ` Arthur Miller
2020-10-14 19:24     ` Mingde (Matthew) Zeng
2020-10-14 21:46       ` Akira Kyle
2020-10-15  5:17         ` Mingde (Matthew) Zeng
2020-10-14  4:38 ` Richard Stallman
2020-10-14  6:36   ` Akira Kyle
2020-11-22  3:35 ` Introducing emacs-webkit and more thoughts on Emacs rendering (was Rethinking the design of xwidgets) Akira Kyle
2020-11-22 12:01   ` Jean Louis
2020-11-22 12:04   ` Jean Louis
2020-11-22 12:18     ` tomas
2020-11-22 12:57       ` Jean Louis
2020-11-22 16:24         ` tomas
2020-11-22 17:18           ` Jean Louis
2020-11-22 17:48             ` tomas
2020-11-22 18:40             ` Akira Kyle
2020-11-22 19:58               ` Jean Louis
2020-11-22 20:29                 ` Akira Kyle
2020-11-22 20:38                   ` Jean Louis
2020-11-22 15:27     ` Arthur Miller
2020-11-22 12:50   ` Jean Louis
2020-11-22 18:33     ` Akira Kyle
2020-11-22 18:04   ` Eli Zaretskii
2020-11-22 18:46     ` Akira Kyle
2020-11-22 21:20       ` Vasilij Schneidermann
2020-11-22 22:04         ` Akira Kyle
2020-11-22 18:29   ` T.V Raman
2020-11-22 18:53     ` Akira Kyle
2020-11-22 19:35       ` T.V Raman
2020-11-22 20:26         ` Akira Kyle
2020-11-23  0:46           ` T.V Raman
2020-11-23  3:44             ` Akira Kyle
2020-11-23  3:01       ` T.V Raman
2020-11-23  3:47         ` Akira Kyle
2020-11-23 16:29           ` Jose A. Ortega Ruiz
2020-11-23  9:39   ` Lars Ingebrigtsen
2020-11-23 13:26     ` joakim
2020-11-24  6:21       ` Lars Ingebrigtsen
2020-11-23 14:59     ` Arthur Miller
2020-11-23 23:47       ` Alan Third
2020-11-24  3:58         ` Akira Kyle
2020-11-24  8:06         ` Arthur Miller
2020-11-24  5:51       ` Richard Stallman
2020-11-24  6:24         ` Lars Ingebrigtsen
2020-11-26  4:49           ` Richard Stallman
2020-11-26  5:25             ` Arthur Miller
2020-11-26  8:27               ` tomas
2020-11-26 14:55                 ` Arthur Miller
2020-11-26 19:11                 ` Tomas Hlavaty
2020-11-26 19:34                   ` arthur miller
2020-11-27  8:04                     ` Tomas Hlavaty
2020-11-27  8:44                       ` Arthur Miller
2020-11-27 13:35                     ` Richard Stallman
2020-11-27 19:22                       ` Arthur Miller
2020-11-27 20:01                         ` Eli Zaretskii
2020-11-27 21:22                           ` Arthur Miller
2020-11-27 20:07                         ` Stefan Monnier
2020-11-27 21:09                           ` Arthur Miller
2020-11-27 21:35                             ` Stefan Monnier
2020-11-27 23:23                               ` Arthur Miller
2020-11-28  0:28                                 ` Stefan Monnier
2020-11-28  8:48                                   ` Arthur Miller
2020-11-27 21:22                           ` Akira Kyle
2020-11-28  7:31                             ` Eli Zaretskii
2020-11-28  5:55                         ` Richard Stallman
2020-11-28  8:50                           ` Arthur Miller
2020-11-29  5:24               ` Richard Stallman
2020-11-24  7:50         ` Arthur Miller
2020-11-24  8:47           ` tomas
2020-11-24  9:04             ` Arthur Miller
2020-11-25  5:38               ` Richard Stallman
2020-11-25  8:46                 ` tomas
2020-11-25 15:26                 ` Arthur Miller
2020-11-25 16:15                   ` Eric S Fraga
2020-11-24 15:43             ` T.V Raman
2020-11-25  5:38             ` Richard Stallman
2020-11-25  8:54               ` tomas
2020-11-24  6:23       ` Lars Ingebrigtsen
2020-11-24  3:33     ` Akira Kyle
2020-11-24  6:27       ` Lars Ingebrigtsen
2020-11-25  1:36         ` Akira Kyle
2020-11-25 15:11           ` Eli Zaretskii
2020-11-27 20:56             ` Akira Kyle
2020-11-28  8:38               ` Eli Zaretskii
2020-11-28  8:57                 ` Arthur Miller
2020-11-28  9:19                   ` Eli Zaretskii
2020-11-29  0:22                     ` Arthur Miller
2020-11-29  1:29                 ` Akira Kyle
2020-11-29  8:22                   ` martin rudalics
2020-11-29 19:01                   ` Eli Zaretskii
2020-11-30  3:54                     ` Akira Kyle
2020-11-30 15:39                       ` Eli Zaretskii
2020-11-30 17:03                         ` Akira Kyle
2020-11-30 18:11                           ` Eli Zaretskii
2020-11-30 18:30                             ` Akira Kyle
2020-12-01  7:44                           ` Tomas Hlavaty
2020-12-03  0:24                             ` Akira Kyle
2020-12-03  8:07                               ` Tomas Hlavaty
2020-12-03 20:34                                 ` Arthur Miller
2020-12-03 20:53                                 ` Stefan Monnier
2020-12-01  8:01                       ` Tomas Hlavaty
2020-12-01 15:36                         ` Arthur Miller
2020-12-01 16:48                           ` Tomas Hlavaty
2020-12-01 15:58                         ` Eli Zaretskii
2020-12-01 17:33                           ` Tomas Hlavaty
2020-12-01 19:41                             ` Eli Zaretskii
2020-12-02 20:37                               ` Tomas Hlavaty
2020-12-03 14:39                                 ` Eli Zaretskii
2020-12-03 21:02                                   ` Tomas Hlavaty
2020-12-04  7:48                                     ` Eli Zaretskii
2020-12-03  0:37                         ` Akira Kyle
2020-12-03  8:15                           ` Tomas Hlavaty
2020-12-03 15:13                             ` Eli Zaretskii
2020-12-03 21:15                               ` Tomas Hlavaty
2020-12-04  8:00                                 ` Eli Zaretskii
2020-11-30  9:05                     ` martin rudalics
2020-11-30 16:10                       ` Eli Zaretskii
2020-11-23 22:12   ` Alexander Adolf
2020-11-24  1:30     ` T.V Raman
2020-11-24  8:13       ` Arthur Miller
2020-11-24  3:51     ` Akira Kyle

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

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

  git send-email \
    --in-reply-to=86pn5luak4.fsf@akirakyle.com \
    --to=ak@akirakyle.com \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    /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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.