* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
@ 2017-02-17 18:16 Vasilij Schneidermann
2017-02-17 18:38 ` Eli Zaretskii
2017-03-10 3:13 ` Paul Eggert
0 siblings, 2 replies; 11+ messages in thread
From: Vasilij Schneidermann @ 2017-02-17 18:16 UTC (permalink / raw)
To: 25778
[-- Attachment #1: Type: text/plain, Size: 710 bytes --]
A user on #emacs brought it to my attention that the xdg-open detection
for browse-url is more complex than it should be and fails detecting
their Linux desktop. Looking at the definition of
`browse-url-can-use-xdg-open' reveals that it replicates the desktop
environment check as done by `xdg-open` (which is done to detect the
DE-specific default browser setting, not to prevent people not using a
popular desktop environment from using xdg-open). As enumerating all
possible kinds of Linux desktop is a futile endeavor, I've completely
eliminated this check from it so that the only ones left are whether
we're in a graphical session (by checking $DISPLAY) and whether
`xdg-open` has been found on $PATH.
[-- Attachment #2: 0001-Drastically-simplify-check-for-xdg-open.patch --]
[-- Type: text/x-patch, Size: 2714 bytes --]
From 6c99e7ace3110b73a5b212203acc728165be092b Mon Sep 17 00:00:00 2001
From: Vasilij Schneidermann <v.schneidermann@gmail.com>
Date: Fri, 17 Feb 2017 19:08:54 +0100
Subject: [PATCH] Drastically simplify check for xdg-open
* browse-url.el (browse-url-can-use-xdg-open): Simplify xdg-open check
---
lisp/net/browse-url.el | 34 +++-------------------------------
1 file changed, 3 insertions(+), 31 deletions(-)
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index a7c879cbfb..bf7561306c 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -45,7 +45,7 @@
;; browse-url-generic arbitrary
;; browse-url-default-windows-browser MS-Windows browser
;; browse-url-default-macosx-browser macOS browser
-;; browse-url-xdg-open Free Desktop xdg-open on Gnome, KDE, Xfce4, LXDE
+;; browse-url-xdg-open Free Desktop xdg-open
;; browse-url-kde KDE konqueror (kfm)
;; browse-url-elinks Elinks Don't know (tried with 0.12.GIT)
@@ -944,36 +944,8 @@ instead of `browse-url-new-window-flag'."
(defun browse-url-can-use-xdg-open ()
"Return non-nil if the \"xdg-open\" program can be used.
-xdg-open is a desktop utility that calls your preferred web browser.
-This requires you to be running either Gnome, KDE, Xfce4 or LXDE."
- (and (getenv "DISPLAY")
- (executable-find "xdg-open")
- ;; xdg-open may call gnome-open and that does not wait for its child
- ;; to finish. This child may then be killed when the parent dies.
- ;; Use nohup to work around. See bug#7166, bug#8917, bug#9779 and
- ;; http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg00279.html
- (executable-find "nohup")
- (or (getenv "GNOME_DESKTOP_SESSION_ID")
- ;; GNOME_DESKTOP_SESSION_ID is deprecated, check on Dbus also.
- (condition-case nil
- (eq 0 (call-process
- "dbus-send" nil nil nil
- "--dest=org.gnome.SessionManager"
- "--print-reply"
- "/org/gnome/SessionManager"
- "org.gnome.SessionManager.CanShutdown"))
- (error nil))
- (equal (getenv "KDE_FULL_SESSION") "true")
- (condition-case nil
- (eq 0 (call-process
- "/bin/sh" nil nil nil
- "-c"
- ;; FIXME use string-match rather than grep.
- "xprop -root _DT_SAVE_MODE|grep xfce4"))
- (error nil))
- (member (getenv "DESKTOP_SESSION") '("LXDE" "Lubuntu"))
- (equal (getenv "XDG_CURRENT_DESKTOP") "LXDE"))))
-
+xdg-open is a desktop utility that calls your preferred web browser."
+ (and (getenv "DISPLAY") (executable-find "xdg-open")))
;;;###autoload
(defun browse-url-xdg-open (url &optional ignored)
--
2.11.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-17 18:16 bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check Vasilij Schneidermann
@ 2017-02-17 18:38 ` Eli Zaretskii
2017-02-17 18:55 ` Vasilij Schneidermann
2017-03-10 3:13 ` Paul Eggert
1 sibling, 1 reply; 11+ messages in thread
From: Eli Zaretskii @ 2017-02-17 18:38 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778
> From: Vasilij Schneidermann <v.schneidermann@gmail.com>
> Date: Fri, 17 Feb 2017 19:16:48 +0100
>
> A user on #emacs brought it to my attention that the xdg-open detection
> for browse-url is more complex than it should be and fails detecting
> their Linux desktop. Looking at the definition of
> `browse-url-can-use-xdg-open' reveals that it replicates the desktop
> environment check as done by `xdg-open` (which is done to detect the
> DE-specific default browser setting, not to prevent people not using a
> popular desktop environment from using xdg-open). As enumerating all
> possible kinds of Linux desktop is a futile endeavor, I've completely
> eliminated this check from it so that the only ones left are whether
> we're in a graphical session (by checking $DISPLAY) and whether
> `xdg-open` has been found on $PATH.
First, checking $DISPLAY doesn't yet mean you are in a GUI frame. We
have display-graphic-p for that.
And second, I don't understand what will happen with all the bugs
mentioned in the comments if we remove the code that was supposed to
avoid hitting them. Maybe I'm missing something obvious.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-17 18:38 ` Eli Zaretskii
@ 2017-02-17 18:55 ` Vasilij Schneidermann
2017-02-18 3:39 ` Glenn Morris
2017-02-18 7:58 ` Eli Zaretskii
0 siblings, 2 replies; 11+ messages in thread
From: Vasilij Schneidermann @ 2017-02-17 18:55 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 25778
> First, checking $DISPLAY doesn't yet mean you are in a GUI frame. We
> have display-graphic-p for that.
The assumption that you need to be in a GUI frame is incorrect. If I
run `emacs -nw` in a graphical terminal emulator, why would that prevent
me from opening a graphical browser? The only way I see to detect
whether a graphical browser can be opened is by checking for X with
$DISPLAY.
> And second, I don't understand what will happen with all the bugs
> mentioned in the comments if we remove the code that was supposed to
> avoid hitting them. Maybe I'm missing something obvious.
OK, I'll go through them all for completeness' sake:
- bug#7166: This one arises from using /bin/sh in combination with
`nohup` for launching xdg-open, resulting in a lack of shell quoting.
As `xdg-open` is launched directly, it's no longer relevant and only
mentioned because of `nohup` (which is no longer used either).
- bug#8917: The old usage of `call-process` has made `nohup` obsolete.
Irrelevant as `nohup` isn't used any longer.
- bug#9779: Extension of the now removed xdg-open DE detection logic,
together with some discussion whether nohup is still necessary. Some
voices in favor of not doing any unnecessary detection.
- The linked emacs-devel thread: Sighting of a possible bug in
gnome-open. As `nohup` is no longer used, there's no way this could
have been worked around with its usage
Summary: All linked bugs are related to `nohup` which is only checked
for, but not actually used. Therefore they can be disregarded.
Do you have any actual objections based on a situation where one would
*not* want to use xdg-open, even though it's installed and the user in a
X11 session?
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-17 18:55 ` Vasilij Schneidermann
@ 2017-02-18 3:39 ` Glenn Morris
2017-02-18 3:46 ` Glenn Morris
2017-02-18 7:58 ` Eli Zaretskii
1 sibling, 1 reply; 11+ messages in thread
From: Glenn Morris @ 2017-02-18 3:39 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778
The area seems a mess, but:
1) nohup was removed from browse-url-xdg-open in 1c0f1a199ca, with no
explanation and as part of a change that seems unrelated.
2) In https://debbugs.gnu.org/9779#20, the author of that change said
I note that since 22-Jun-2011 browse-url-xdg-open no longer uses
nohup. This is either a mistake on my part (I didn't read the
comment in browse-url-can-use-xdg-open) or it is indeed
unnecessary and therefore isn't a requirement for xdg-open.
3) In reply, Jan said in https://debbugs.gnu.org/9779#29
See discussion at
http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg00279.html.
nohup is still needed for xdg-open.
And AFAICS that was the last comment about nohup. No-one ever seems to
have followed up Jan's comment.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-18 3:39 ` Glenn Morris
@ 2017-02-18 3:46 ` Glenn Morris
2017-02-18 8:55 ` Vasilij Schneidermann
0 siblings, 1 reply; 11+ messages in thread
From: Glenn Morris @ 2017-02-18 3:46 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778
PS Maybe you are just saying that since no-one (?) complained since
then, nohup can't have been needed after all. It would be better to test
it, though. It seems difficult to test all the possibilities for
xdg-open.
Ref https://debbugs.gnu.org/25234
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-17 18:55 ` Vasilij Schneidermann
2017-02-18 3:39 ` Glenn Morris
@ 2017-02-18 7:58 ` Eli Zaretskii
2017-02-18 8:50 ` Vasilij Schneidermann
1 sibling, 1 reply; 11+ messages in thread
From: Eli Zaretskii @ 2017-02-18 7:58 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778
> Date: Fri, 17 Feb 2017 19:55:14 +0100
> From: Vasilij Schneidermann <v.schneidermann@gmail.com>
> Cc: 25778@debbugs.gnu.org
>
> > First, checking $DISPLAY doesn't yet mean you are in a GUI frame. We
> > have display-graphic-p for that.
>
> The assumption that you need to be in a GUI frame is incorrect. If I
> run `emacs -nw` in a graphical terminal emulator, why would that prevent
> me from opening a graphical browser? The only way I see to detect
> whether a graphical browser can be opened is by checking for X with
> $DISPLAY.
In that case, maybe we shouldn't test $DISPLAY at all? Why restrict
this to X if xdg-open is already tested for availability?
> Do you have any actual objections based on a situation where one would
> *not* want to use xdg-open, even though it's installed and the user in a
> X11 session?
See Glenn's response about that. I think we should be more careful
with these issues, and at least do some more research of them before
we can be sure they are no longer relevant. If you could follow up on
that, it would be great.
Thanks.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-18 7:58 ` Eli Zaretskii
@ 2017-02-18 8:50 ` Vasilij Schneidermann
0 siblings, 0 replies; 11+ messages in thread
From: Vasilij Schneidermann @ 2017-02-18 8:50 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 25778
> In that case, maybe we shouldn't test $DISPLAY at all? Why restrict
> this to X if xdg-open is already tested for availability?
To quote its man page: "xdg-open is for use inside a desktop session
only.". If you attempt using it outside one (like, on the Linux
console), M-x browse-url fails silently.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-18 3:46 ` Glenn Morris
@ 2017-02-18 8:55 ` Vasilij Schneidermann
2017-02-19 0:31 ` Glenn Morris
0 siblings, 1 reply; 11+ messages in thread
From: Vasilij Schneidermann @ 2017-02-18 8:55 UTC (permalink / raw)
To: Glenn Morris; +Cc: 25778
> PS Maybe you are just saying that since no-one (?) complained since
> then, nohup can't have been needed after all.
Pretty much. Note that `gnome-open` belongs to GNOME 2 which last
release has been in 2010. Only Debian Squeeze is offering it in its
package archives and as that one has been EOL'd, I don't see any reason
to pursue it any further. If `gvfs-open` exhibits the same behavior,
maybe, but I still consider it upstream's fault if they have weird open
behavior, not an area of Emacs to clumsily work around.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-18 8:55 ` Vasilij Schneidermann
@ 2017-02-19 0:31 ` Glenn Morris
2017-02-19 13:06 ` Vasilij Schneidermann
0 siblings, 1 reply; 11+ messages in thread
From: Glenn Morris @ 2017-02-19 0:31 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778
Vasilij Schneidermann wrote:
> If `gvfs-open` exhibits the same behavior,
It does. https://bugzilla.gnome.org/show_bug.cgi?id=652262
And https://debbugs.gnu.org/25234, as previously mentioned.
> maybe, but I still consider it upstream's fault
As you can see from that above report, they don't show any signs of
fixing it.
> if they have weird open behavior, not an area of Emacs to clumsily
> work around.
The people who implemented support for xdg-open in Emacs disagreed.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-19 0:31 ` Glenn Morris
@ 2017-02-19 13:06 ` Vasilij Schneidermann
0 siblings, 0 replies; 11+ messages in thread
From: Vasilij Schneidermann @ 2017-02-19 13:06 UTC (permalink / raw)
To: Glenn Morris; +Cc: 25778
> As you can see from that above report, they don't show any signs of
> fixing it.
Well, fine. I'm sorry for not noticing a five year old piece of code
that got mistakenly removed without anyone complaining. What I don't
understand is why my patch (removing IMHO unnecessary DE detection) is
related to using nohup to work around a problem with xdg-open and
gnome-open/gvfs-open. If you consider fixing the nohup problem a
prerequisite before this patch can be applied, OK, do that then, I can
wait until that's done and recommence discussion on the other issue.
That aside, I cannot reproduce any weird behavior, be it with or without
nohup and gvfs-open. Both `(call-process "gvfs-open" nil 0 nil
"foo.pdf")` and `(call-process "nohup" nil 0 nil "gvfs-open"
"foo.pdf")` spawn my PDF reader successfully and don't do anything weird
after closing it. Same if I pass "http://ix.de/" as last argument. I
therefore consider the nohup issue a case of cargo-culting and would
like to drop its discussion entirely as it does not help with the
current issue.
^ permalink raw reply [flat|nested] 11+ messages in thread
* bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check
2017-02-17 18:16 bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check Vasilij Schneidermann
2017-02-17 18:38 ` Eli Zaretskii
@ 2017-03-10 3:13 ` Paul Eggert
1 sibling, 0 replies; 11+ messages in thread
From: Paul Eggert @ 2017-03-10 3:13 UTC (permalink / raw)
To: Vasilij Schneidermann; +Cc: 25778-done
[-- Attachment #1: Type: text/plain, Size: 765 bytes --]
Thanks for the bug report. I installed the attached somewhat-more-ambitious
patch that works along the line that you suggested. Although every heuristic in
this area will be wrong sometimes, I think nowadays we're probably better off
simply using xdg-open if it's available and if there's a display.
It turns out that nohup is ineffective on xdg-open, as xdg-open's child does a
'signal (SIGHUP, SIG_DFL)' before it execs (!). This may help to explain why
nobody noticed when Emacs stopped using nohup. Although nohup may have been
needed for ancient GNOME versions, I don't think we need to worry about these
old GNOME versions in future Emacs releases.
I'm closing the bug report as I think the bug is fixed. We can reopen it if I'm
wrong.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Simplify-checks-for-xdg-open-and-xdg-email.patch --]
[-- Type: text/x-diff; name="0001-Simplify-checks-for-xdg-open-and-xdg-email.patch", Size: 5679 bytes --]
From 095e7d126ee1fc56cb1ec0f9ab1a9cdd6417a232 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Thu, 9 Mar 2017 19:01:19 -0800
Subject: [PATCH] Simplify checks for xdg-open and xdg-email
browse-url's xdg-open detection was too picky on some GNU/Linux
desktops; see Bug#25778. Simplify the code by assuming xdg-open works
if it is executable, as nowadays this is more likely to be correct than
trying to use heuristics from a few years ago. Don't test for nohup: it
is ineffective nowadays, as xdg-open's child uses the default action for
SIGHUP even if xdg-open's invoker ignores SIGHUP. While we're at it,
allow for Wayland here, as "emacs -nw" might be running in a non-X
Wayland terminal.
* lisp/mail/emacsbug.el (report-emacs-bug-can-use-xdg-email):
* lisp/net/browse-url.el (browse-url-can-use-xdg-open):
Simplify to a test for DISPLAY and whether the helper program is
executable. Allow WAYLAND_DISPLAY as an option.
---
lisp/mail/emacsbug.el | 29 ++++-------------------------
lisp/net/browse-url.el | 40 +++++++++-------------------------------
2 files changed, 13 insertions(+), 56 deletions(-)
diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el
index ecb7db6..c1aec69 100644
--- a/lisp/mail/emacsbug.el
+++ b/lisp/mail/emacsbug.el
@@ -77,33 +77,12 @@ report-emacs-bug-can-use-osx-open
(equal (executable-find "open") "/usr/bin/open")
(memq system-type '(darwin))))
-;; FIXME this duplicates much of the logic from browse-url-can-use-xdg-open.
(defun report-emacs-bug-can-use-xdg-email ()
"Return non-nil if the \"xdg-email\" command can be used.
-xdg-email is a desktop utility that calls your preferred mail client.
-This requires you to be running either Gnome, KDE, or Xfce4."
- (and (getenv "DISPLAY")
- (executable-find "xdg-email")
- (or (getenv "GNOME_DESKTOP_SESSION_ID")
- ;; GNOME_DESKTOP_SESSION_ID is deprecated, check on Dbus also.
- (condition-case nil
- (eq 0 (call-process
- "dbus-send" nil nil nil
- "--dest=org.gnome.SessionManager"
- "--print-reply"
- "/org/gnome/SessionManager"
- "org.gnome.SessionManager.CanShutdown"))
- (error nil))
- (equal (getenv "KDE_FULL_SESSION") "true")
- ;; FIXME? browse-url-can-use-xdg-open also accepts LXDE.
- ;; Is that no good here, or just overlooked?
- (condition-case nil
- (eq 0 (call-process
- "/bin/sh" nil nil nil
- "-c"
- ;; FIXME use string-match rather than grep.
- "xprop -root _DT_SAVE_MODE|grep xfce4"))
- (error nil)))))
+xdg-email is a desktop utility that calls your preferred mail client."
+ (and ;; See browse-url-can-use-xdg-open.
+ (or (getenv "DISPLAY") (getenv "WAYLAND_DISPLAY"))
+ (executable-find "xdg-email")))
(defun report-emacs-bug-insert-to-mailer ()
"Send the message to your preferred mail client.
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index 04b49c4..20ae072 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -45,7 +45,7 @@
;; browse-url-generic arbitrary
;; browse-url-default-windows-browser MS-Windows browser
;; browse-url-default-macosx-browser macOS browser
-;; browse-url-xdg-open Free Desktop xdg-open on Gnome, KDE, Xfce4, LXDE
+;; browse-url-xdg-open freedesktop.org xdg-open
;; browse-url-kde KDE konqueror (kfm)
;; browse-url-elinks Elinks Don't know (tried with 0.12.GIT)
@@ -944,36 +944,14 @@ browse-url-default-browser
(defun browse-url-can-use-xdg-open ()
"Return non-nil if the \"xdg-open\" program can be used.
-xdg-open is a desktop utility that calls your preferred web browser.
-This requires you to be running either Gnome, KDE, Xfce4 or LXDE."
- (and (getenv "DISPLAY")
- (executable-find "xdg-open")
- ;; xdg-open may call gnome-open and that does not wait for its child
- ;; to finish. This child may then be killed when the parent dies.
- ;; Use nohup to work around. See bug#7166, bug#8917, bug#9779 and
- ;; http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg00279.html
- (executable-find "nohup")
- (or (getenv "GNOME_DESKTOP_SESSION_ID")
- ;; GNOME_DESKTOP_SESSION_ID is deprecated, check on Dbus also.
- (condition-case nil
- (eq 0 (call-process
- "dbus-send" nil nil nil
- "--dest=org.gnome.SessionManager"
- "--print-reply"
- "/org/gnome/SessionManager"
- "org.gnome.SessionManager.CanShutdown"))
- (error nil))
- (equal (getenv "KDE_FULL_SESSION") "true")
- (condition-case nil
- (eq 0 (call-process
- "/bin/sh" nil nil nil
- "-c"
- ;; FIXME use string-match rather than grep.
- "xprop -root _DT_SAVE_MODE|grep xfce4"))
- (error nil))
- (member (getenv "DESKTOP_SESSION") '("LXDE" "Lubuntu"))
- (equal (getenv "XDG_CURRENT_DESKTOP") "LXDE"))))
-
+xdg-open is a desktop utility that calls your preferred web browser."
+ ;; The exact set of situations where xdg-open works is complicated,
+ ;; and it would be a pain to duplicate xdg-open's situation-specific
+ ;; code here, as the code is a moving target. So assume that
+ ;; xdg-open will work if there is a graphical display; this should
+ ;; be good enough for platforms Emacs is likely to be running on.
+ (and (or (getenv "DISPLAY") (getenv "WAYLAND_DISPLAY"))
+ (executable-find "xdg-open")))
;;;###autoload
(defun browse-url-xdg-open (url &optional ignored)
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-03-10 3:13 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-17 18:16 bug#25778: 25.1; [PATCH] Drastically simplify xdg-open check Vasilij Schneidermann
2017-02-17 18:38 ` Eli Zaretskii
2017-02-17 18:55 ` Vasilij Schneidermann
2017-02-18 3:39 ` Glenn Morris
2017-02-18 3:46 ` Glenn Morris
2017-02-18 8:55 ` Vasilij Schneidermann
2017-02-19 0:31 ` Glenn Morris
2017-02-19 13:06 ` Vasilij Schneidermann
2017-02-18 7:58 ` Eli Zaretskii
2017-02-18 8:50 ` Vasilij Schneidermann
2017-03-10 3:13 ` Paul Eggert
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).