/
Menu_linux.go
96 lines (83 loc) · 1.49 KB
/
Menu_linux.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
// +build freebsd linux netbsd openbsd solaris
package frame
/*
#ifndef WEBVIEW_GTK
#define WEBVIEW_GTK
#endif
#include "c_linux.h"
*/
import "C"
import (
"unsafe"
)
type (
// Menu struct
Menu struct {
title string
key string
menu *C.GtkWidget
menuItem *C.GtkWidget
parent *Menu
}
// MenuItem element
MenuItem struct {
Action func()
title string
key string
menuItem *C.GtkWidget
parent *Menu
}
)
var (
menuItems = []*MenuItem{}
)
// AddSubMenu returns a new submenu
func (m *Menu) AddSubMenu(title string) *Menu {
retM := C.addSubMenu(C.MenuObj{
title: C.CString(title),
menu: m.menu,
})
menu := Menu{
title: title,
menu: retM.menu,
menuItem: retM.menuItem,
parent: m,
}
return &menu
}
// AddItem returns a new menu item
func (m *Menu) AddItem(title string, action func(), key ...string) *MenuItem {
k := ""
if len(key) > 0 {
k = key[0]
}
retM := C.addItem(C.MenuObj{
title: C.CString(title),
key: C.CString(k),
menu: m.menu,
})
item := MenuItem{
Action: action,
title: title,
menuItem: retM.menuItem,
parent: m,
}
menuItems = append(menuItems, &item)
return &item
}
// AddSeparatorItem adds separator item to menu
func (m *Menu) AddSeparatorItem() {
C.addSeparatorItem(C.MenuObj{
menu: m.menu,
})
}
//export goMenuFunc
func goMenuFunc(mi *C.GtkWidget) {
go func() {
for _, mm := range menuItems {
if unsafe.Pointer(mm.menuItem) == unsafe.Pointer(mi) {
go mm.Action()
}
}
}()
}