zenity/msg_darwin.go

122 lines
2.2 KiB
Go
Raw Normal View History

2020-01-04 22:21:39 -05:00
package zenity
import (
"os/exec"
2020-01-05 07:37:45 -05:00
"github.com/ncruces/zenity/internal/osa"
2020-01-04 22:21:39 -05:00
)
func Error(text string, options ...Option) (bool, error) {
return message(0, text, options)
}
func Info(text string, options ...Option) (bool, error) {
return message(1, text, options)
}
func Question(text string, options ...Option) (bool, error) {
return message(2, text, options)
}
func Warning(text string, options ...Option) (bool, error) {
return message(3, text, options)
}
2020-01-06 07:01:51 -05:00
func message(typ int, text string, options []Option) (bool, error) {
2020-01-04 22:21:39 -05:00
opts := optsParse(options)
2020-01-06 07:01:51 -05:00
dialog := opts.icon != 0 || typ == 2
var op string
if dialog {
op = "displayDialog"
} else {
op = "displayAlert"
}
2020-01-05 07:37:45 -05:00
data := osa.Msg{
2020-01-06 07:01:51 -05:00
Operation: op,
Text: text,
Title: opts.title,
2020-01-04 22:21:39 -05:00
}
2020-01-06 07:01:51 -05:00
if dialog {
2020-01-04 22:21:39 -05:00
switch opts.icon {
case ErrorIcon:
data.Icon = "stop"
case InfoIcon, QuestionIcon:
data.Icon = "note"
case WarningIcon:
data.Icon = "caution"
}
} else {
2020-01-06 07:01:51 -05:00
switch typ {
2020-01-04 22:21:39 -05:00
case 0:
data.As = "critical"
case 1:
data.As = "informational"
case 3:
data.As = "warning"
}
if opts.title != "" {
data.Text = opts.title
data.Message = text
}
}
2020-01-06 07:01:51 -05:00
if typ != 2 {
if dialog {
2020-01-04 22:21:39 -05:00
opts.ok = "OK"
}
2020-01-06 07:01:51 -05:00
opts.cancel = ""
2020-01-04 22:21:39 -05:00
}
2020-01-06 07:01:51 -05:00
if opts.ok != "" || opts.cancel != "" || opts.extra != "" {
2020-01-04 22:21:39 -05:00
if opts.ok == "" {
opts.ok = "OK"
}
if opts.cancel == "" {
opts.cancel = "Cancel"
}
2020-01-06 07:01:51 -05:00
if typ == 2 {
2020-01-04 22:21:39 -05:00
if opts.extra == "" {
data.Buttons = []string{opts.cancel, opts.ok}
data.Default = 2
data.Cancel = 1
} else {
data.Buttons = []string{opts.extra, opts.cancel, opts.ok}
data.Default = 3
data.Cancel = 2
}
} else {
if opts.extra == "" {
data.Buttons = []string{opts.ok}
data.Default = 1
} else {
data.Buttons = []string{opts.extra, opts.ok}
data.Default = 2
}
}
2020-01-06 19:57:00 -05:00
data.Extra = opts.extra
2020-01-04 22:21:39 -05:00
}
if opts.defcancel {
if data.Cancel != 0 {
data.Default = data.Cancel
}
2020-01-06 07:01:51 -05:00
if dialog && data.Buttons == nil {
2020-01-04 22:21:39 -05:00
data.Default = 1
}
}
2020-01-06 07:01:51 -05:00
out, err := osa.Run("msg", data)
2020-01-04 22:21:39 -05:00
if err, ok := err.(*exec.ExitError); ok && err.ExitCode() == 1 {
return false, nil
}
if err != nil {
return false, err
}
2020-01-06 07:01:51 -05:00
if len(out) > 0 && string(out[:len(out)-1]) == opts.extra {
return false, ErrExtraButton
}
2020-01-04 22:21:39 -05:00
return true, err
}