Subject: bug#49195: Starting Emacs if required from emacsclient.desktop

From: Peter Oliver <[email-masked]>
Date: Thu, 24 Jun 2021 14:28:29 +0100 (BST)

On Thu, 24 Jun 2021, Eli Zaretskii wrote:

>> Date: Wed, 23 Jun 2021 20:59:31 +0100 (BST)
>> From: Peter Oliver <[email-masked]>
>>
>> Attached is a patch which enhances emacsclient.desktop so that it will start a new instance of Emacs if none is found to be running.  Users who like to reuse an existing Emacs can then always use emacsclient.desktop.
>
> FWIW, I would find this change surprising,

For someone to be unpleasantly surprised by this, they would need to launch emacsclient.desktop with the hope that it would fail because an Emacs daemon is not already running.  If they want it to fail, why would they try to launch it?

> and therefore would suggest to leave this off by default.  But that's me.

I’m not sure what off by default would mean in this context.  We’ll be providing emacsclient.desktop for the first time in Emacs 28, so users who prefer not to use it can carry on doing whatever they did before.

>> There was some discussion of how far to go with this on emacs-devel recently, but, if I understand correctly, the parts in this patch were not controversial.
>
> How do you understand that?  My recollection was that there was no
> consensus on this, but my memory is not what it used to be.

I thought that replacing emacs.desktop with emacsclient.desktop, so as to always use emacsclient, was the controversial part.  Apologies if I got that wrong.

>> +  If you launch Emacs from a desktop environment, you may use the
>
> "Desktop environment" is too general.  You mean GNU/Linux desktop
> environment, and possibly just the ones compatible with
> freedesktop.org?  The text should make that clear.

I’ve made this more specific.  Thanks.  A revised version of the patch is attached.

> More generally, I'm not sure we should even say this in the Emacs
> manual, as these features belong to the desktop, not to Emacs.

This section of the manual already describes how to start Emacs from systemd, which isn’t part of Emacs either.

> What is the advantage of having this text in our manual?

I think that providing two different .desktop files is confusing enough to be worth commenting on.

>> +*** New desktop integration for connecting to the server.
>> +You may use the "Emacs (Client)" menu entry to open files in an
>> +existing Emacs instance rather than starting a new one.
>
> This isn't detailed enough, especially if we decide not to say
> anything about that in the manual.  And even if we leave that text in
> the manual, it is buried in a place where finding it isn't easy, so
> NEWS should be more detailed.

I’ve expanded this, but please let me know if you think there’s anything else that needs to be explained or isn’t clear; I’m aware that things that are obvious to the person who wrote a feature may not be obvious to others, but it’s hard to know exactly what.

-- 
Peter Oliver

From 838418cee84442665eab8a2318869aac907f9099 Mon Sep 17 00:00:00 2001
From: Peter Oliver <[email-masked]>
Date: Tue, 8 Jun 2021 16:04:17 +0100
Subject: [PATCH] From .desktop files, reuse a frame or start a new Emacs as
 required

* doc/emacs/misc.texi: (Using Emacs as a Server) Explain emacsclient.desktop.
* etc/NEWS: (Emacs Server): Explain emacsclient.desktop.
* emacs-mail.desktop, etc/emacsclient.desktop: Automatically try to
reuse an existing frame, open a new frame, or start a new Emacs
daemon.  Add actions for specific behaviours.
---
 doc/emacs/misc.texi     |  7 +++++++
 etc/NEWS                |  9 +++++++++
 etc/emacs-mail.desktop  | 16 +++++++++++++---
 etc/emacsclient.desktop | 11 ++++++++++-
 4 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 027133cc3a..4bb2d72cc2 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1757,6 +1757,13 @@ Emacs Server
 @code{3}.  (If there is no server with that name, an error is
 signaled.)  Currently, this feature is mainly useful for developers.
 
+  If your operating system’s desktop environment is
+@url{https://www.freedesktop.org/wiki/Specifications/,,freedesktop.org-compatible}
+(which is true of most GNU/Linux and other recent Unix-like GUIs), you
+may use the @dfn{Emacs (Client)} menu entry to connect to an Emacs
+server with @command{emacsclient}.  If the daemon is not already
+running, it will be started for you.
+
 @menu
 * TCP Emacs server::     Listening to a TCP socket.
 * Invoking emacsclient:: Connecting to the Emacs server.
diff --git a/etc/NEWS b/etc/NEWS
index 64b39d737a..c0cfd9fe9a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -539,6 +539,15 @@ an edit instead of marking it as "Done" (which the 'C-x #' command
 does).  The 'emacsclient' program exits with an abnormal status as
 result of this command.
 
++++
+*** New desktop integration for connecting to the server.
+If your operating system’s desktop environment is
+freedesktop.org-compatible (which is true of most GNU/Linux and other
+recent Unix-like GUIs), you may use the new "Emacs (Client)" desktop
+menu entry to open files in an existing Emacs instance rather than
+starting a new one.  If the daemon is not already running, it will be
+started for you.
+
 ** Perl mode
 
 ---
diff --git a/etc/emacs-mail.desktop b/etc/emacs-mail.desktop
index 0c5fab1dd1..251afa100c 100644
--- a/etc/emacs-mail.desktop
+++ b/etc/emacs-mail.desktop
@@ -1,12 +1,22 @@
 [Desktop Entry]
 Categories=Network;Email;
 Comment=GNU Emacs is an extensible, customizable text editor - and more
-Exec=emacs -f message-mailto %u
-# If you prefer to use emacsclient, use this instead
-#Exec=emacsclient -e '(message-mailto "%u")'
 Icon=emacs
 Name=Emacs (Mail)
 MimeType=x-scheme-handler/mailto;
 NoDisplay=false
 Terminal=false
 Type=Application
+
+Exec=emacs -f message-mailto %u
+# # If you prefer to use emacsclient, use this instead:
+# Exec=sh -c 'emacsclient --alternate-editor= --display="$DISPLAY" --eval "(message-mailto \"%u\")"'
+# Actions=new-window;new-instance;
+
+# [Desktop Action new-window]
+# Name=New Window
+# Exec=emacsclient --alternate-editor= --create-frame --eval '(message-mailto "%u")'
+
+# [Desktop Action new-instance]
+# Name=New Instance
+# Exec=emacs -f message-mailto %u
diff --git a/etc/emacsclient.desktop b/etc/emacsclient.desktop
index 3feb83c729..43f2c31ddd 100644
--- a/etc/emacsclient.desktop
+++ b/etc/emacsclient.desktop
@@ -3,10 +3,19 @@ Name=Emacs (Client)
 GenericName=Text Editor
 Comment=Edit text
 MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
-Exec=emacsclient -c %F
+Exec=sh -c 'if [ -n "$*" ]; then exec emacsclient --alternate-editor= --display="$DISPLAY" "$@"; else exec emacsclient --alternate-editor= --create-frame; fi' placeholder %F
 Icon=emacs
 Type=Application
 Terminal=false
 Categories=Development;TextEditor;
 StartupWMClass=Emacsd
 Keywords=Text;Editor;
+Actions=new-window;new-instance;
+
+[Desktop Action new-instance]
+Name=New Window
+Exec=emacsclient --alternate-editor= --create-frame %F
+
+[Desktop Action new-instance]
+Name=New Instance
+Exec=emacs %F
-- 
2.31.1