github.com/shurcool/trayhost@v0.0.0-20181020202213-114974ef9e16/trayhost_exports.go (about) 1 package trayhost 2 3 import ( 4 "log" 5 "reflect" 6 "unsafe" 7 ) 8 9 /* 10 #include <stdlib.h> 11 #include "platform/common.h" 12 */ 13 import "C" 14 15 //export tray_callback 16 func tray_callback(itemId C.int) { 17 if itemId < 0 { 18 log.Println("tray click") 19 return 20 } 21 22 item := menuItems[itemId] 23 if item.Handler != nil { 24 item.Handler() 25 } 26 } 27 28 //export tray_enabled 29 func tray_enabled(itemId C.int) C.int { 30 item := menuItems[itemId] 31 32 return cbool(item.Enabled == nil || item.Enabled()) 33 } 34 35 //export notification_callback 36 func notification_callback(notificationId C.int) { 37 if notificationId < 0 { 38 log.Println("notificationId < 0:", notificationId) 39 return 40 } 41 42 notification := notifications[notificationId] 43 if notification.Handler != nil { 44 notification.Handler() 45 } 46 } 47 48 func create_image(image Image) (C.struct_image, func()) { 49 var img C.struct_image 50 51 if image.Kind == "" || len(image.Bytes) == 0 { 52 return img, func() {} 53 } 54 55 // Copy the image data into unmanaged memory. 56 cImageKind := C.CString(string(image.Kind)) 57 cImageData := C.malloc(C.size_t(len(image.Bytes))) 58 freeImg := func() { 59 C.free(unsafe.Pointer(cImageKind)) 60 C.free(cImageData) 61 } 62 var cImageDataSlice []C.uchar 63 sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&cImageDataSlice)) 64 sliceHeader.Cap = len(image.Bytes) 65 sliceHeader.Len = len(image.Bytes) 66 sliceHeader.Data = uintptr(cImageData) 67 for i, b := range image.Bytes { 68 cImageDataSlice[i] = C.uchar(b) 69 } 70 71 img.kind = cImageKind 72 img.bytes = unsafe.Pointer(&cImageDataSlice[0]) 73 img.length = C.int(len(image.Bytes)) 74 75 return img, freeImg 76 }