Source file
src/tawesoft.co.uk/go/dialog/dialog-linux.go
Documentation:
src/tawesoft.co.uk/go/dialog/dialog-linux.go
1
2
3 package dialog
4
5 import (
6 "fmt"
7 "os"
8 "os/exec"
9 )
10
11 type provider struct {
12 command string
13 alert func(self *provider, title string, message string, args...interface{}) bool
14 }
15
16 var xmessageProvider = provider{
17 command: "xmessage",
18 alert: func(self *provider, title string, message string, args...interface{}) bool {
19 var buf string = wrap(fmt.Sprintf(title+": "+message+"\n", args...), 60)
20
21 var err = exec.Command(self.command, "-center", buf).Run()
22 if err != nil { fmt.Printf("system error: %v\n", err) }
23 return err == nil
24 },
25 }
26
27 var zenityProvider = provider{
28 command: "zenity",
29 alert: func(self *provider, title string, message string, args...interface{}) bool {
30 var buf string = fmt.Sprintf(message, args...)
31
32 var err = exec.Command(self.command,
33 "--info", "--no-markup",
34 "--title", title,
35 "--window-icon", "info",
36 "--width=400",
37 "--text="+buf,
38 ).Run()
39
40 if err != nil {
41 var _, ok = err.(*exec.ExitError)
42 if ok {
43
44 return true
45 }
46
47 fmt.Printf("system error: %v\n", err)
48 }
49 return err == nil
50 },
51 }
52
53 var stdioProvider = provider{
54 command: "",
55 alert: func(_self *provider, title string, message string, args...interface{}) bool {
56 fmt.Fprintf(os.Stderr, "\n===[%s]===\n\n", title)
57 fmt.Fprintf(os.Stderr, message, args...)
58 fmt.Fprintf(os.Stdout, "\n\n=========\n\n")
59 return true
60 },
61 }
62
63 var providers []*provider
64
65 func (p *provider) register() {
66 if len(p.command) == 0 || haveCommand(p.command) {
67 providers = append(providers, p)
68 }
69 }
70
71 func init() {
72 providers = make([]*provider, 0, 4)
73
74
75 zenityProvider.register()
76 xmessageProvider.register()
77 stdioProvider.register()
78 }
79
80 func haveCommand(cmd string) bool {
81
82 return (exec.Command("sh", "-c", "which "+cmd+" > /dev/null 2>&1").Run() == nil)
83 }
84
85 func platformAlert(title string, message string, args...interface{}) {
86 for _, provider := range(providers) {
87 if provider.alert == nil { continue }
88 if provider.alert(provider, title, message, args...) { break }
89 }
90 }
91
View as plain text