From: Alan Third <alan@idiocy.org>
To: Nick Helm <nick@tenpoint.co.nz>
Cc: emacs-devel@gnu.org,
George Plymale II <georgedp@orbitalimpact.com>,
monnier@iro.umontreal.ca
Subject: Re: Should this package be included into the NS port?
Date: Sat, 19 May 2018 11:33:29 +0100 [thread overview]
Message-ID: <20180519103329.GB31853@breton.holly.idiocy.org> (raw)
In-Reply-To: <m2wow0i7ch.fsf@tenpoint.co.nz>
On Sat, May 19, 2018 at 04:42:54PM +1200, Nick Helm wrote:
> On Sat, 19 May 2018 at 07:36:32 +1200, Alan Third wrote:
>
> > There are two problems, though.
> >
> > * Application Menu
> >
> > When the last NS frame is deleted the menus aren’t updated, so I think
> > they’ll be the menus as defined for the last frame. They should
> > probably be cut right back to just the ‘Emacs’ menu, and perhaps
> > ‘help’.
>
> This is interesting. I think we could tweak the EmacsMenu side of things
> to do this, even with the current code. We'd want to make sure to
> include some kind of new frame command somewhere.
>
> These menus are derived dynamically from Lisp though, and it might be
> difficult to convince it to provide valid entries when no frame is
> selected.
I’m not sure if the ‘Emacs’ menu is derived from lisp. If you turn off
menus completely it still exists.
> One way around that might be to create a new menu containing
> static NSMenu versions of File and Help, much like we do for the appMenu
> now. When no frame is selected and there are no Lisp menu entries, we
> switch mainMenu to this new menu. When a frame is created, we switch
> back.
Perhaps we could modify ns_update_menubar to handle the case where
there’s no frame?
> > * Dock Menu
> >
> > This has a ‘new frame’ option but just plain doesn’t work. I think the
> > problem is the way it’s trying to create a new frame:...
> >
> > This seems to rely on there being an existing NS frame, but we’ve
> > deleted the last one. I assume if we were clever we’d be able to use
> > the, still open, terminal frame.
>
> With all of this discussion, I feel like I'm missing something really
> fundamental. Putting emacsclient aside for a moment, if we were dealing
> with a standard Cocoa app, the window server and NSApp loop would keep
> running in the background and we could close everything, then create a
> new frame (as a view on an NSWindow instance) as needed.
FWIW, the NSApp loop does keep running, but it’s embedded in ns_select
and ns_read_socket. We can, in theory, create a new frame directly,
but it needs to run through Emacs first.
> How is the architecture of Emacs on NS so different from standard Cocoa
> that these kinds of workarounds are necessary?
The fundamental issue in the NS port is that we have two bosses: the
NSApp run loop, and Emacs lisp, and we need to mediate between them.
A standard Cocoa app responds to events from the NSApp loop, and
that’s pretty much it. As I understand it you can make a complete app
without very much work this way. The NSApp loop is the boss.
Emacs’ architecture expects everything to go through lisp and it makes
decisions on what we do with our GUI. Emacs lisp is the boss.
We can’t react directly to NS events like a normal NS app. We get
input from the NSApp loop and send it to lisp. Lisp might tell us to
do something any time. We also need to know how Emacs expects to do
things (the GUI code was originally written for a completely different
platform after all) and then try and make Cocoa/GNUstep handle it
correctly.
In an ideal world (and I believe the Mac port has gone this way) we
would put the NSApp run loop in one thread, and Emacs lisp in another
and let them communicate with each other asynchronously. This wouldn’t
solve everything, but it would make some of our problems easier.
We can’t easily do that, though, as the inter‐thread communication
systems provided in Objective‐C are either a pain to implement with
complex types like Lisp_Object, or aren’t compatible with GCC and/or
GNUstep (Grand Central Dispatch).
Additionally I think we sometimes have workarounds fixing workarounds
fixing hacks, all written by different people, and the simplest
solution is to strip it right back to the basics. I have a feeling the
menus fall somewhat into this category, and the drag‐n‐drop stuff
definitely does.
In an ideal world (and I believe the Mac port has gone this way) we
TL;DR: Emacs internal architecture doesn’t fit well into the standard
NS application architecture.
--
Alan Third
next prev parent reply other threads:[~2018-05-19 10:33 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-15 5:19 Should this package be included into the NS port? George Plymale II
2018-05-15 18:25 ` Stefan Monnier
2018-05-15 18:36 ` Alan Third
2018-05-16 2:48 ` George Plymale II
2018-05-18 19:36 ` Alan Third
2018-05-18 21:21 ` George Plymale II
2018-05-19 4:57 ` Nick Helm
2018-05-19 15:49 ` George Plymale II
2018-05-23 5:22 ` Nick Helm
2018-05-23 19:29 ` George Plymale II
2018-05-19 9:50 ` Alan Third
2018-05-19 16:06 ` George Plymale II
2018-05-19 18:33 ` Stefan Monnier
2018-05-22 1:42 ` George Plymale II
2018-05-22 1:48 ` Van L
2018-05-22 19:04 ` Alan Third
2018-05-23 2:30 ` Off Topic (was: Should this package be included into the NS port?) Van L
2018-05-23 20:43 ` Alan Third
2018-05-24 1:27 ` emacs-26.1-rc1: ./configure (was: Off Topic) Van L
2018-05-24 8:55 ` emacs-26.1-rc1: ./configure Robert Pluim
2018-05-24 10:51 ` Van L
2018-05-24 11:51 ` Robert Pluim
2018-05-24 11:57 ` Van L
2018-05-24 23:47 ` Van L
2018-05-22 19:15 ` Should this package be included into the NS port? Alan Third
2018-05-22 20:09 ` George Plymale II
2018-05-19 4:42 ` Nick Helm
2018-05-19 10:33 ` Alan Third [this message]
2018-05-19 11:51 ` Philipp Stephani
2018-05-19 16:52 ` George Plymale II
2018-05-23 4:55 ` Nick Helm
2018-05-23 5:11 ` Nick Helm
2018-05-23 15:26 ` Eli Zaretskii
2018-05-23 16:37 ` Stefan Monnier
2018-05-23 17:23 ` Eli Zaretskii
2018-05-23 21:21 ` Alan Third
2018-05-24 16:37 ` Eli Zaretskii
2018-05-24 17:46 ` Philipp Stephani
2018-05-24 17:51 ` Philipp Stephani
2018-05-24 18:14 ` Eli Zaretskii
2018-05-16 2:44 ` George Plymale II
2018-05-17 22:13 ` George Plymale II
2018-05-18 18:50 ` Alan Third
2018-05-18 20:40 ` George Plymale II
2018-05-19 8:31 ` Michael Albinus
2018-05-19 4:29 ` Nick Helm
2018-05-19 15:38 ` George Plymale II
2018-05-29 21:29 ` George Plymale II
2018-05-29 21:42 ` Alan Third
2018-05-29 23:40 ` George Plymale II
2018-05-31 20:40 ` Alan Third
2018-06-01 1:58 ` Stefan Monnier
2018-06-02 18:31 ` George Plymale II
2018-06-02 19:39 ` Stefan Monnier
2018-06-02 20:11 ` Alan Third
2018-06-03 2:25 ` Stefan Monnier
2018-06-02 18:26 ` George Plymale II
2018-06-02 16:45 ` Ryan Thompson
2018-06-02 17:22 ` Stefan Monnier
2018-06-02 18:56 ` George Plymale II
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=20180519103329.GB31853@breton.holly.idiocy.org \
--to=alan@idiocy.org \
--cc=emacs-devel@gnu.org \
--cc=georgedp@orbitalimpact.com \
--cc=monnier@iro.umontreal.ca \
--cc=nick@tenpoint.co.nz \
/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).