/
callback.go
94 lines (71 loc) · 2.77 KB
/
callback.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
package tw
/*
#include "callback.h"
#include <string.h>
*/
import "C"
import "unsafe"
type SetVarCallback func(value unsafe.Pointer)
type GetVarCallback func(value unsafe.Pointer)
type ButtonCallback func()
type SummaryCallback func(value unsafe.Pointer) string
const MaxCallbacks = 32
var setVarCallbacks = make([]SetVarCallback, 0, MaxCallbacks)
var getVarCallbacks = make([]GetVarCallback, 0, MaxCallbacks)
var buttonCallbacks = make([]ButtonCallback, 0, MaxCallbacks)
//export goSetVarCallbackN
func goSetVarCallbackN(value unsafe.Pointer, N C.int) {
setVarCallbacks[uint(N)](value)
}
//export goGetVarCallbackN
func goGetVarCallbackN(value unsafe.Pointer, N C.int) {
getVarCallbacks[uint(N)](value)
}
//export goButtonCallbackN
func goButtonCallbackN(N C.int) {
buttonCallbacks[uint(N)]()
}
func (bar *Bar) AddVarCB(name string, type_ Type, setCallback SetVarCallback, getCallback GetVarCallback, clientData unsafe.Pointer, def string) bool {
currentSetVar := C.int(len(setVarCallbacks))
currentGetVar := C.int(len(getVarCallbacks))
setVarCallbacks = append(setVarCallbacks, setCallback)
getVarCallbacks = append(getVarCallbacks, getCallback)
return toBool(C.myAddVarCB((*C.TwBar)(bar), C.CString(name), C.TwType(type_), currentSetVar, currentGetVar, C.CString(def)))
}
func (bar *Bar) AddButton(name string, callback ButtonCallback, def string) bool {
currentButton := C.int(len(buttonCallbacks))
buttonCallbacks = append(buttonCallbacks, callback)
return toBool(C.myAddButton((*C.TwBar)(bar), C.CString(name), currentButton, C.CString(def)))
}
type ErrorHandler func(errorMessage string)
var errorHandler0 ErrorHandler
//export goHandleError
func goHandleError(errorMessage *C.char) {
errorHandler0(C.GoString(errorMessage))
}
func HandleErrors(errorHandler ErrorHandler) {
errorHandler0 = errorHandler
C.myHandleErrors()
}
var summaryCallback0 SummaryCallback
//export goSummary
func goSummary(summaryString *C.char, summaryMaxLength C.size_t, value unsafe.Pointer) {
str := summaryCallback0(value)
C.strncpy(summaryString, C.CString(str), summaryMaxLength)
}
func DefineStruct(name string, structMembers []StructMember, structSize uint, summaryCallback SummaryCallback) Type {
c_name := C.CString(name)
c_size := C.size_t(structSize)
numMembers := C.uint(len(structMembers))
memberPtr := (*C.TwStructMember)(&structMembers[0])
if summaryCallback == nil {
return Type(C.TwDefineStruct(c_name, memberPtr, numMembers, c_size, nil, nil))
} else {
summaryCallback0 = summaryCallback
return Type(C.myDefineStruct(c_name, memberPtr, numMembers, c_size))
}
panic("")
}
func CreateStructMember(name string, type_ Type, offset uint, defString string) StructMember {
return StructMember(C.myCreateStructMember(C.CString(name), C.TwType(type_), C.size_t(offset), C.CString(defString)))
}