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  }