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

From: Peter Oliver <[email-masked]>
Date: Wed, 23 Jun 2021 20:59:31 +0100 (BST)

At present, we provide emacs.desktop (which starts a new instance of Emacs), and emacsclient.desktop (which connects to an existing instance of Emacs).  This is problematic if a users wants to associate a particular file type with Emacs in their desktop file manager, because they can’t know in advance which will be correct.

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.

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.

-- 
Peter Oliver

From 374c2b202dd8276506eaf2ed51edc946beebefcd 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     |  5 +++++
 etc/NEWS                |  5 +++++
 etc/emacs-mail.desktop  | 16 +++++++++++++---
 etc/emacsclient.desktop | 11 ++++++++++-
 4 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/doc/emacs/misc.texi b/doc/emacs/misc.texi
index 027133cc3a..2beedd6f5a 100644
--- a/doc/emacs/misc.texi
+++ b/doc/emacs/misc.texi
@@ -1757,6 +1757,11 @@ 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 you launch Emacs from a desktop environment, 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..02473257e2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -539,6 +539,11 @@ 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.
+You may use the "Emacs (Client)" menu entry to open files in an
+existing Emacs instance rather than starting a new one.
+
 ** 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