Implement a more robust algorithm for opening web links on unices (#93)
Co-authored-by: makeworld <25111343+makeworld-the-better-one@users.noreply.github.com>
This commit is contained in:
parent
e84cebc88c
commit
4a71b691ea
|
@ -4,6 +4,7 @@ package webbrowser
|
||||||
|
|
||||||
import "os/exec"
|
import "os/exec"
|
||||||
|
|
||||||
|
// Open opens `url` in default system browser.
|
||||||
func Open(url string) (string, error) {
|
func Open(url string) (string, error) {
|
||||||
err := exec.Command("open", url).Start()
|
err := exec.Command("open", url).Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -4,6 +4,7 @@ package webbrowser
|
||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
|
// Open opens `url` in default system browser, but not on this OS.
|
||||||
func Open(url string) (string, error) {
|
func Open(url string) (string, error) {
|
||||||
return "", fmt.Errorf("unsupported OS for default HTTP handling. Set a command in the config")
|
return "", fmt.Errorf("unsupported OS for default HTTP handling. Set a command in the config")
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,27 +9,40 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OpenInBrowser checks for the presence of a display server
|
// Open opens `url` in default system browser. It tries to do so in two
|
||||||
// and environment variables indicating a gui is present. If found
|
// ways (xdg-open and $BROWSER). It only works if there is a display
|
||||||
// then xdg-open is called on a url to open said url in the default
|
// server working.
|
||||||
// gui web browser for the system
|
//
|
||||||
|
// bouncepaw: I tried to support TTYs as well. The idea was to open
|
||||||
|
// a browser in foreground and return back to amfora after the browser
|
||||||
|
// is closed. While all browsers I tested opened correctly (w3m, lynx),
|
||||||
|
// I couldn't make it restore amfora correctly. The screen always ended
|
||||||
|
// up distorted. None of my stunts with altscreen buffers helped.
|
||||||
func Open(url string) (string, error) {
|
func Open(url string) (string, error) {
|
||||||
disp := os.Getenv("DISPLAY")
|
var (
|
||||||
wayland := os.Getenv("WAYLAND_DISPLAY")
|
// In prev versions there was also Xorg executable checked for.
|
||||||
_, err := exec.LookPath("Xorg")
|
// I don't see any reason to check for it.
|
||||||
if disp == "" && wayland == "" && err != nil {
|
xorgDisplay = os.Getenv("DISPLAY")
|
||||||
return "", fmt.Errorf("no gui is available")
|
waylandDisplay = os.Getenv("WAYLAND_DISPLAY")
|
||||||
|
xdgOpenPath, xdgOpenNotFoundErr = exec.LookPath("xdg-open")
|
||||||
|
envBrowser = os.Getenv("BROWSER")
|
||||||
|
)
|
||||||
|
switch {
|
||||||
|
case xorgDisplay == "" && waylandDisplay == "":
|
||||||
|
return "", fmt.Errorf("no display server was found")
|
||||||
|
case xdgOpenNotFoundErr == nil: // Prefer xdg-open over $BROWSER
|
||||||
|
// Use start rather than run or output in order
|
||||||
|
// to make browser running in background.
|
||||||
|
if err := exec.Command(xdgOpenPath, url).Start(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return "Opened in system default web browser", nil
|
||||||
|
case envBrowser != "":
|
||||||
|
if err := exec.Command(envBrowser, url).Start(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return "Opened in system default web browser", nil
|
||||||
|
default:
|
||||||
|
return "", fmt.Errorf("could not determine system browser")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = exec.LookPath("xdg-open")
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("xdg-open command not found, cannot open in web browser")
|
|
||||||
}
|
|
||||||
// Use start rather than run or output in order
|
|
||||||
// to release the process and not block
|
|
||||||
err = exec.Command("xdg-open", url).Start()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return "Opened in system default web browser", nil
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ package webbrowser
|
||||||
|
|
||||||
import "os/exec"
|
import "os/exec"
|
||||||
|
|
||||||
|
// Open opens `url` in default system browser.
|
||||||
func Open(url string) (string, error) {
|
func Open(url string) (string, error) {
|
||||||
err := exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
|
err := exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue