WIP: zenity command (linux).

This commit is contained in:
Nuno Cruces 2020-01-09 11:17:39 +00:00
parent 51595d7ecc
commit 3fe55c184b
7 changed files with 64 additions and 17 deletions

View File

@ -5,6 +5,9 @@ package zenity
import ( import (
"os/exec" "os/exec"
"strings" "strings"
"github.com/ncruces/zenity/internal/cmd"
"github.com/ncruces/zenity/internal/zen"
) )
func SelectFile(options ...Option) (string, error) { func SelectFile(options ...Option) (string, error) {
@ -18,8 +21,8 @@ func SelectFile(options ...Option) (string, error) {
args = append(args, "--filename", opts.filename) args = append(args, "--filename", opts.filename)
} }
args = append(args, zenityFilters(opts.filters)...) args = append(args, zenityFilters(opts.filters)...)
cmd := exec.Command("zenity", args...)
out, err := cmd.Output() out, err := zen.Run(args)
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 { if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 {
return "", nil return "", nil
} }
@ -35,7 +38,7 @@ func SelectFile(options ...Option) (string, error) {
func SelectFileMutiple(options ...Option) ([]string, error) { func SelectFileMutiple(options ...Option) ([]string, error) {
opts := optsParse(options) opts := optsParse(options)
args := []string{"--file-selection", "--multiple", "--separator=\x1e"} args := []string{"--file-selection", "--multiple", "--separator", cmd.Separator}
if opts.title != "" { if opts.title != "" {
args = append(args, "--title", opts.title) args = append(args, "--title", opts.title)
} }
@ -43,8 +46,8 @@ func SelectFileMutiple(options ...Option) ([]string, error) {
args = append(args, "--filename", opts.filename) args = append(args, "--filename", opts.filename)
} }
args = append(args, zenityFilters(opts.filters)...) args = append(args, zenityFilters(opts.filters)...)
cmd := exec.Command("zenity", args...)
out, err := cmd.Output() out, err := zen.Run(args)
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 { if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 {
return nil, nil return nil, nil
} }
@ -54,7 +57,7 @@ func SelectFileMutiple(options ...Option) ([]string, error) {
if len(out) > 0 { if len(out) > 0 {
out = out[:len(out)-1] out = out[:len(out)-1]
} }
return strings.Split(string(out), "\x1e"), nil return strings.Split(string(out), cmd.Separator), nil
} }
func SelectFileSave(options ...Option) (string, error) { func SelectFileSave(options ...Option) (string, error) {
@ -71,8 +74,8 @@ func SelectFileSave(options ...Option) (string, error) {
args = append(args, "--confirm-overwrite") args = append(args, "--confirm-overwrite")
} }
args = append(args, zenityFilters(opts.filters)...) args = append(args, zenityFilters(opts.filters)...)
cmd := exec.Command("zenity", args...)
out, err := cmd.Output() out, err := zen.Run(args)
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 { if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 {
return "", nil return "", nil
} }
@ -95,8 +98,8 @@ func SelectDirectory(options ...Option) (string, error) {
if opts.filename != "" { if opts.filename != "" {
args = append(args, "--filename", opts.filename) args = append(args, "--filename", opts.filename)
} }
cmd := exec.Command("zenity", args...)
out, err := cmd.Output() out, err := zen.Run(args)
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 { if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 {
return "", nil return "", nil
} }

View File

@ -1,4 +1,6 @@
package cmd package cmd
const LineBreak = "\n"
var Command bool var Command bool
var Separator = "\x00" var Separator = "\x00"

View File

@ -1,5 +1,8 @@
// +build !windows // +build !windows,!darwin
package cmd package cmd
const LineBreak = "\n" const LineBreak = "\n"
var Command bool
var Separator = "\x1e"

View File

@ -1,3 +1,6 @@
package cmd package cmd
const LineBreak = "\r\n" const LineBreak = "\r\n"
var Command bool
var Separator string

View File

@ -21,10 +21,10 @@ func Run(script string, data interface{}) ([]byte, error) {
res = res[len("<script>") : len(res)-len("\n</script>")] res = res[len("<script>") : len(res)-len("\n</script>")]
if cmd.Command { if cmd.Command {
cmd, err := exec.LookPath("osascript") path, err := exec.LookPath("osascript")
if err == nil { if err == nil {
os.Stderr.Close() os.Stderr.Close()
syscall.Exec(cmd, []string{"osascript", "-l", "JavaScript", "-e", res}, nil) syscall.Exec(path, []string{"osascript", "-l", "JavaScript", "-e", res}, nil)
} }
} }

30
internal/zen/zen_unix.go Normal file
View File

@ -0,0 +1,30 @@
// +build !windows,!darwin
package zen
import (
"os"
"os/exec"
"syscall"
"github.com/ncruces/zenity/internal/cmd"
)
var tool, path string
func init() {
for _, tool = range [3]string{"matedialog", "qarma", "zenity"} {
path, _ = exec.LookPath(tool)
if path != "" {
return
}
}
tool = "zenity"
}
func Run(args []string) ([]byte, error) {
if cmd.Command && path != "" {
syscall.Exec(path, append([]string{tool}, args...), os.Environ())
}
return exec.Command(tool, args...).Output()
}

View File

@ -2,7 +2,11 @@
package zenity package zenity
import "os/exec" import (
"os/exec"
"github.com/ncruces/zenity/internal/zen"
)
func Error(text string, options ...Option) (bool, error) { func Error(text string, options ...Option) (bool, error) {
return message("--error", text, options) return message("--error", text, options)
@ -23,7 +27,10 @@ func Warning(text string, options ...Option) (bool, error) {
func message(arg, text string, options []Option) (bool, error) { func message(arg, text string, options []Option) (bool, error) {
opts := optsParse(options) opts := optsParse(options)
args := []string{arg, "--text", text, "--no-markup"} args := []string{arg}
if text != "" {
args = append(args, "--text", text, "--no-markup")
}
if opts.title != "" { if opts.title != "" {
args = append(args, "--title", opts.title) args = append(args, "--title", opts.title)
} }
@ -56,8 +63,7 @@ func message(arg, text string, options []Option) (bool, error) {
args = append(args, "--icon-name=dialog-warning") args = append(args, "--icon-name=dialog-warning")
} }
cmd := exec.Command("zenity", args...) out, err := zen.Run(args)
out, err := cmd.Output()
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 { if err, ok := err.(*exec.ExitError); ok && err.ExitCode() != 255 {
if len(out) > 0 && string(out[:len(out)-1]) == opts.extra { if len(out) > 0 && string(out[:len(out)-1]) == opts.extra {
return false, ErrExtraButton return false, ErrExtraButton