forked from getlantern/systray
-
Notifications
You must be signed in to change notification settings - Fork 0
/
systray_windows.go
110 lines (90 loc) · 2.3 KB
/
systray_windows.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// +build windows
package systray
import (
"github.com/reefbarman/systray/win32"
"github.com/reefbarman/systray/wintray"
"unsafe"
"golang.org/x/sys/windows"
)
var wt wintray.WinTray
func init() {
wt.OnTrayMenuOpened = func() {
wt.ShowTrayMenu(trayMenu)
}
wt.OnMenuItemSelected = onMenuItemSelected
wt.OnExit = onExit
}
func quit() {
wt.Quit()
}
func setTooltip(tooltip string) {
if err := wt.SetTooltip(tooltip); err != nil {
log.Errorf("Unable to set tooltip: %v", err)
}
}
func addSeperator(menuItem *MenuItem) {
if err := wt.AddSeparator(menuItem, menuItem.parent); err != nil {
log.Errorf("Unable to add seperator: %v", err)
}
}
func setMenuItem(menuItem *MenuItem) {
if err := wt.SetMenuItem(menuItem, menuItem.parent); err != nil {
log.Errorf("Unable to add menu item: %v", err)
}
}
func addSubMenuItem(menuItem *MenuItem) *Menu {
subMenuHandle, err := wt.AddSubMenuItem(menuItem, menuItem.parent)
if err != nil {
log.Errorf("Unable to add menu item: %v", err)
return nil
}
return &Menu{handle: subMenuHandle}
}
func createMenu() (*Menu, error) {
menuHandle, err := wt.CreateMenu()
if err != nil {
return nil, err
}
return &Menu{handle: menuHandle}, nil
}
func setIcon(iconFilePath string) {
if err := wt.SetIcon(iconFilePath); err != nil {
log.Errorf("Unable to set icon: %v", err)
}
}
func nativeLoop() {
if err := wt.InitInstance(); err != nil {
log.Errorf("Unable to init instance: %v", err)
return
}
defer func() {
wt.DeInit()
}()
onTrayRun()
// Main message pump.
m := &struct {
WindowHandle windows.Handle
Message uint32
Wparam uintptr
Lparam uintptr
Time uint32
Pt win32.Point
}{}
for {
ret, _, err := win32.GetMessage.Call(uintptr(unsafe.Pointer(m)), 0, 0, 0)
// If the function retrieves a message other than WM_QUIT, the return value is nonzero.
// If the function retrieves the WM_QUIT message, the return value is zero.
// If there is an error, the return value is -1
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx
switch int32(ret) {
case -1:
log.Errorf("Error at message loop: %v", err)
return
case 0:
return
default:
win32.TranslateMessage.Call(uintptr(unsafe.Pointer(m)))
win32.DispatchMessage.Call(uintptr(unsafe.Pointer(m)))
}
}
}