-
Notifications
You must be signed in to change notification settings - Fork 0
/
tray.go
89 lines (79 loc) · 1.85 KB
/
tray.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"bytes"
"context"
"image"
"os/exec"
"runtime"
ico "github.com/Kodeworks/golang-image-ico"
"github.com/getlantern/systray"
"github.com/ncruces/zenity"
log "github.com/sirupsen/logrus"
)
var kdialogAvailable bool
func init() {
_, err := exec.LookPath("kdialog")
kdialogAvailable = err == nil
}
func getIcon() []byte {
switch runtime.GOOS {
case "windows":
srcImg, _, err := image.Decode(bytes.NewReader(appIcon))
if err != nil {
log.Errorf("Failed to decode source image: %v", err)
return appIcon
}
destBuf := new(bytes.Buffer)
err = ico.Encode(destBuf, srcImg)
if err != nil {
log.Errorf("Failed to encode icon: %v", err)
return appIcon
}
return destBuf.Bytes()
default:
return appIcon
}
}
func initTray() {
systray.SetIcon(getIcon())
systray.SetTitle("Proxy") // TODO set app name
systray.SetTooltip("Proxy") // TODO set app name
mStartStop := systray.AddMenuItem("Start proxy", "")
go func() {
started := false
for range mStartStop.ClickedCh {
if !started {
err := app.StartProxy(context.Background())
if err != nil {
showErrorDialog("Start proxy server error", err.Error())
continue
}
mStartStop.SetTitle("Stop proxy")
started = true
} else {
app.StopProxy()
started = false
mStartStop.SetTitle("Start proxy")
}
}
}()
systray.AddSeparator()
mQuit := systray.AddMenuItem("Quit", "")
go func() {
for range mQuit.ClickedCh {
systray.Quit() // TODO add dialog?
}
}()
}
func showErrorDialog(title, message string) {
var err error
if kdialogAvailable {
args := []string{"--error", message, "--title", title, "--icon", "dialog-error"}
_, err = exec.Command("kdialog", args...).Output()
} else {
err = zenity.Error(message, zenity.Title(title), zenity.ErrorIcon)
}
if err != nil {
log.Errorf("show dialog: error handling: %v", err)
}
}