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

From: Peter Oliver <[email-masked]>
Date: Thu, 24 Jun 2021 16:50:07 +0100 (BST)

On Thu, 24 Jun 2021, Eli Zaretskii wrote:

>>> 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.
>
> systemd support code is in emacs.c, so that is (borderline) okay.
> What you describe is just normal desktop invocation, AFAIU.

It’s not normal to provide two different desktop entries for launching an application in slightly different ways.  However, I don’t object if we think that this addition to the manual is superfluous and decide to drop it.

>> +may use the @dfn{Emacs (Client)} menu entry to connect to an Emacs
>
> It is wrong to use @dfn here, since this is not new terminology you
> are introducing.  Better use @samp.
>
>> +server with @command{emacsclient}.  If the daemon is not already
>> +running, it will be started for you.
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^
> Please try rephrasing this to avoid passive tense.

Done.

-- 
Peter Oliver

From 1a2e04aead42c8ea13bdf7af2019a12b2df37ee7 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                |  8 ++++++++
 etc/emacs-mail.desktop  | 16 +++++++++++++---
 etc/emacsclient.desktop | 11 ++++++++++-
 4 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 027133cc3a..3c11a39de9 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 @samp{Emacs (Client)} menu entry to connect to an Emacs
+server with @command{emacsclient}.  The daemon starts if not
+already running.
+
 @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..1f489c0750 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -539,6 +539,14 @@ 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.  The daemon starts if not already running.
+
 ** 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