diff --git a/color_darwin.go b/color_darwin.go
new file mode 100644
index 0000000..686ee09
--- /dev/null
+++ b/color_darwin.go
@@ -0,0 +1,28 @@
+package zenity
+
+import (
+ "image/color"
+ "os/exec"
+
+ "github.com/ncruces/zenity/internal/osa"
+ "github.com/ncruces/zenity/internal/zen"
+)
+
+func SelectColor(options ...Option) (color.Color, error) {
+ opts := optsParse(options)
+
+ var data osa.Color
+ if opts.color != nil {
+ r, g, b, _ := opts.color.RGBA()
+ data.Color = []float32{float32(r) / 0xffff, float32(g) / 0xffff, float32(b) / 0xffff}
+ }
+
+ out, err := osa.Run("color", data)
+ if err, ok := err.(*exec.ExitError); ok && err.ExitCode() == 1 {
+ return nil, nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ return zen.ParseColor(string(out)), nil
+}
diff --git a/go.mod b/go.mod
index b62b7b6..0d81813 100644
--- a/go.mod
+++ b/go.mod
@@ -1,3 +1,5 @@
module github.com/ncruces/zenity
go 1.13
+
+require golang.org/x/image v0.0.0-20191214001246-9130b4cfad52
diff --git a/go.sum b/go.sum
index e69de29..9760eff 100644
--- a/go.sum
+++ b/go.sum
@@ -0,0 +1,3 @@
+golang.org/x/image v0.0.0-20191214001246-9130b4cfad52 h1:2fktqPPvDiVEEVT/vSTeoUPXfmRxRaGy6GU8jypvEn0=
+golang.org/x/image v0.0.0-20191214001246-9130b4cfad52/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/internal/osa/osa.go b/internal/osa/generate.go
similarity index 100%
rename from internal/osa/osa.go
rename to internal/osa/generate.go
diff --git a/internal/osa/generated.go b/internal/osa/generated.go
index a855546..ab02535 100644
--- a/internal/osa/generated.go
+++ b/internal/osa/generated.go
@@ -6,6 +6,21 @@ package osa
import "html/template"
var scripts = template.Must(template.New("").Parse(`
+{{define "color"}}{{end}}
{{define "file"}}