From 94602547096a11c86daec702710bf2c7b3be4e79 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 21 Jan 2020 12:03:58 +0000 Subject: [PATCH] Use AppleScript for color (macos). --- README.md | 5 +- color_darwin.go | 2 +- internal/zenutil/osa_generated.go | 73 +++++++++---------- internal/zenutil/osa_generator.go | 12 ++- internal/zenutil/osascripts/color.applescript | 9 +++ internal/zenutil/osascripts/color.gots | 17 ----- .../zenutil/osascripts/{file.gots => file.js} | 16 ++-- internal/zenutil/osascripts/msg.gots | 30 -------- internal/zenutil/osascripts/msg.js | 30 ++++++++ internal/zenutil/run_darwin.go | 15 ++-- 10 files changed, 102 insertions(+), 107 deletions(-) create mode 100644 internal/zenutil/osascripts/color.applescript delete mode 100644 internal/zenutil/osascripts/color.gots rename internal/zenutil/osascripts/{file.gots => file.js} (51%) delete mode 100644 internal/zenutil/osascripts/msg.gots create mode 100644 internal/zenutil/osascripts/msg.js diff --git a/README.md b/README.md index 3c98483..5c42765 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,5 @@ Why reinvent this particular wheel? * WSL/Cygwin/MSYS2 [support](https://github.com/ncruces/zenity/wiki/Zenity-for-WSL,-Cygwin,-MSYS2) * on macOS: * only dependency is `osascript` - (with [JXA](https://developer.apple.com/library/archive/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/Introduction.html); - `html/template` makes JavaScript easy to template) * on other Unixes: - * wraps either one of `qarma`, `zenity`, `matedialog`,\ - in that order of preference + * wraps either one of `zenity`, `qarma`, `matedialog` diff --git a/color_darwin.go b/color_darwin.go index de76781..1fe6d24 100644 --- a/color_darwin.go +++ b/color_darwin.go @@ -13,7 +13,7 @@ func SelectColor(options ...Option) (color.Color, error) { var data zenutil.Color if opts.color != nil { r, g, b, _ := opts.color.RGBA() - data.Color = []float32{float32(r) / 0xffff, float32(g) / 0xffff, float32(b) / 0xffff} + data.Color = []uint32{r, g, b} } out, err := zenutil.Run("color", data) diff --git a/internal/zenutil/osa_generated.go b/internal/zenutil/osa_generated.go index 57e0038..2934ecd 100644 --- a/internal/zenutil/osa_generated.go +++ b/internal/zenutil/osa_generated.go @@ -3,78 +3,77 @@ package zenutil -import "html/template" +import "encoding/json" +import "text/template" -var scripts = template.Must(template.New("").Parse(` -{{define "color"}}{{end}} -{{define "file"}}{{end}} -{{define "msg"}}{{end}}`)) +var res = app[{{json .Operation}}]({{json .Text}}, opts).buttonReturned +res === {{json .Extra}} ? res : void 0 +{{- end}}`)) diff --git a/internal/zenutil/osa_generator.go b/internal/zenutil/osa_generator.go index f0bb274..07cb08f 100644 --- a/internal/zenutil/osa_generator.go +++ b/internal/zenutil/osa_generator.go @@ -27,7 +27,7 @@ func main() { str.WriteString("\n" + `{{define "`) str.WriteString(strings.TrimSuffix(name, filepath.Ext(name))) - str.WriteString(`"}}{{end}}") + str.WriteString("{{- end}}") } out, err := os.Create("osa_generated.go") @@ -73,7 +73,11 @@ var generator = template.Must(template.New("").Parse(`// Code generated by zenit package zenutil -import "html/template" +import "encoding/json" +import "text/template" -var scripts = template.Must(template.New("").Parse(` + "`{{.}}`" + `)) +var scripts = template.Must(template.New("").Funcs(template.FuncMap{"json": func(v interface{}) (string, error) { + b, err := json.Marshal(v) + return string(b), err +}}).Parse(` + "`{{.}}`" + `)) `)) diff --git a/internal/zenutil/osascripts/color.applescript b/internal/zenutil/osascripts/color.applescript new file mode 100644 index 0000000..3f31ace --- /dev/null +++ b/internal/zenutil/osascripts/color.applescript @@ -0,0 +1,9 @@ +tell application (path to frontmost application as text) + activate + {{if .Color -}} + set c to choose color default color { {{index .Color 0}}, {{index .Color 1}}, {{index .Color 2}} } + {{else -}} + set c to choose color + {{end}} + "rgb(" & (item 1 of c) div 257 & "," & (item 2 of c) div 257 & "," & (item 3 of c) div 257 & ")" +end tell \ No newline at end of file diff --git a/internal/zenutil/osascripts/color.gots b/internal/zenutil/osascripts/color.gots deleted file mode 100644 index a25254b..0000000 --- a/internal/zenutil/osascripts/color.gots +++ /dev/null @@ -1,17 +0,0 @@ -var app = Application.currentApplication() -app.includeStandardAdditions = true -app.activate() - -var opts = {} - -{{if .Color -}} - opts.defaultColor = {{.Color}} -{{end -}} - -var res = app.chooseColor(opts) -if (Array.isArray(res)) { - res[0] = Math.round(255*res[0]) - res[1] = Math.round(255*res[1]) - res[2] = Math.round(255*res[2]) - 'rgb('+res+')' -} \ No newline at end of file diff --git a/internal/zenutil/osascripts/file.gots b/internal/zenutil/osascripts/file.js similarity index 51% rename from internal/zenutil/osascripts/file.gots rename to internal/zenutil/osascripts/file.js index d906f02..1d974d3 100644 --- a/internal/zenutil/osascripts/file.gots +++ b/internal/zenutil/osascripts/file.js @@ -5,27 +5,27 @@ app.activate() var opts = {} {{if .Prompt -}} - opts.withPrompt = {{.Prompt}} + opts.withPrompt = {{json .Prompt}} {{end -}} {{if .Type -}} - opts.ofType = {{.Type}} + opts.ofType = {{json .Type}} {{end -}} {{if .Name -}} - opts.defaultName = {{.Name}} + opts.defaultName = {{json .Name}} {{end -}} {{if .Location -}} - opts.defaultLocation = {{.Location}} + opts.defaultLocation = {{json .Location}} {{end -}} {{if .Invisibles -}} - opts.invisibles = {{.Invisibles}} + opts.invisibles = {{json .Invisibles}} {{end -}} {{if .Multiple -}} - opts.multipleSelectionsAllowed = {{.Multiple}} + opts.multipleSelectionsAllowed = {{json .Multiple}} {{end -}} -var res = app[{{.Operation}}](opts) +var res = app[{{json .Operation}}](opts) if (Array.isArray(res)) { - res.join({{.Separator}}) + res.join({{json .Separator}}) } else { res.toString() } \ No newline at end of file diff --git a/internal/zenutil/osascripts/msg.gots b/internal/zenutil/osascripts/msg.gots deleted file mode 100644 index f905217..0000000 --- a/internal/zenutil/osascripts/msg.gots +++ /dev/null @@ -1,30 +0,0 @@ -var app = Application.currentApplication() -app.includeStandardAdditions = true -app.activate() - -var opts = {} - -{{if .Message -}} - opts.message = {{.Message}} -{{end -}} -{{if .As -}} - opts.as = {{.As}} -{{end -}} -{{if .Title -}} - opts.withTitle = {{.Title}} -{{end -}} -{{if .Icon -}} - opts.withIcon = {{.Icon}} -{{end -}} -{{if .Buttons -}} - opts.buttons = {{.Buttons}} -{{end -}} -{{if .Default -}} - opts.defaultButton = {{.Default}} -{{end -}} -{{if .Cancel -}} - opts.cancelButton = {{.Cancel}} -{{end -}} - -var res = app[{{.Operation}}]({{.Text}}, opts).buttonReturned -res === {{.Extra}} ? res : void 0 \ No newline at end of file diff --git a/internal/zenutil/osascripts/msg.js b/internal/zenutil/osascripts/msg.js new file mode 100644 index 0000000..a87cd40 --- /dev/null +++ b/internal/zenutil/osascripts/msg.js @@ -0,0 +1,30 @@ +var app = Application.currentApplication() +app.includeStandardAdditions = true +app.activate() + +var opts = {} + +{{if .Message -}} + opts.message = {{json .Message}} +{{end -}} +{{if .As -}} + opts.as = {{json .As}} +{{end -}} +{{if .Title -}} + opts.withTitle = {{json .Title}} +{{end -}} +{{if .Icon -}} + opts.withIcon = {{json .Icon}} +{{end -}} +{{if .Buttons -}} + opts.buttons = {{json .Buttons}} +{{end -}} +{{if .Default -}} + opts.defaultButton = {{json .Default}} +{{end -}} +{{if .Cancel -}} + opts.cancelButton = {{json .Cancel}} +{{end -}} + +var res = app[{{json .Operation}}]({{json .Text}}, opts).buttonReturned +res === {{json .Extra}} ? res : void 0 \ No newline at end of file diff --git a/internal/zenutil/run_darwin.go b/internal/zenutil/run_darwin.go index a574092..92e0e0b 100644 --- a/internal/zenutil/run_darwin.go +++ b/internal/zenutil/run_darwin.go @@ -15,19 +15,22 @@ func Run(script string, data interface{}) ([]byte, error) { return nil, err } - res := buf.String() - res = res[len("")] + script = buf.String() + lang := "AppleScript" + if strings.HasPrefix(script, "var app") { + lang = "JavaScript" + } if Command { path, err := exec.LookPath("osascript") if err == nil { os.Stderr.Close() - syscall.Exec(path, []string{"osascript", "-l", "JavaScript", "-e", res}, nil) + syscall.Exec(path, []string{"osascript", "-l", lang, "-e", script}, nil) } } - cmd := exec.Command("osascript", "-l", "JavaScript") - cmd.Stdin = strings.NewReader(res) + cmd := exec.Command("osascript", "-l", lang) + cmd.Stdin = strings.NewReader(script) return cmd.Output() } @@ -43,7 +46,7 @@ type File struct { } type Color struct { - Color []float32 + Color []uint32 } type Msg struct {