changeset 99:ad39f3ddb362

Switch to using cgo.Handle to pass Go functions and other objects through the C API. The avoids Go checks that were introduced around 1.5... This also means we can remove the list that stopped garbage collection.
author Brian Smith <brian@dbsoft.org>
date Sat, 06 Nov 2021 07:14:50 -0500
parents f1837535d46c
children 0c720f011dad
files dw/dw.go dwtest/dwtest.go
diffstat 2 files changed, 429 insertions(+), 438 deletions(-) [+]
line wrap: on
line diff
--- a/dw/dw.go	Fri Nov 05 16:45:46 2021 -0500
+++ b/dw/dw.go	Sat Nov 06 07:14:50 2021 -0500
@@ -10,6 +10,7 @@
 #include "dwglue.c"
 */
 import "C"
+import "runtime/cgo"
 import "unsafe"
 import "runtime"
 import "reflect"
@@ -137,7 +138,7 @@
 }
 type COLOR C.ulong
 type POINTER unsafe.Pointer
-type SIGNAL_FUNC unsafe.Pointer
+type DWFUNC cgo.Handle
 
 type Env struct {
 	OSName, BuildDate, BuildTime                       string
@@ -414,9 +415,6 @@
 var VK_LCONTROL = int(C.VK_LCONTROL)
 var VK_RCONTROL = int(C.VK_RCONTROL)
 
-// Cache the function pointers so they don't get garbage collected
-var backs []unsafe.Pointer
-
 // Convert a resource ID into a pointer
 func RESOURCE(id uintptr) unsafe.Pointer {
 	return unsafe.Pointer(id)
@@ -430,6 +428,12 @@
 	return COLOR((0xF0000000 | (lred) | (lgreen << 8) | (lblue << 16)))
 }
 
+// Convert a Go Function into a C compatible handle
+func SIGNAL_FUNC(h interface{}) DWFUNC {
+	fhandle := cgo.NewHandle(h)
+	return DWFUNC(fhandle)
+}
+
 // Convert a POINTER to a HANDLE (use with care)
 func POINTER_TO_HANDLE(ptr POINTER) HANDLE {
 	return HANDLE(HGENERIC{unsafe.Pointer(ptr)})
@@ -445,6 +449,18 @@
 	return POINTER(handle.GetHandle())
 }
 
+// Convert a Go Object to a POINTER
+func OBJECT_TO_POINTER(h interface{}) POINTER {
+	handle := cgo.NewHandle(h)
+	return POINTER(handle)
+}
+
+// Convert a POINTER containing a Go Object to a string
+func POINTER_TO_STRING(ptr POINTER) string {
+	h := cgo.Handle(ptr)
+	return h.Value().(string)
+}
+
 // Convert a HNOTEPAGE to a UINT, mostly used for display purposes
 func HNOTEPAGE_TO_UINT(handle HNOTEPAGE) uint {
 	return uint(handle.pageid)
@@ -2726,8 +2742,7 @@
 }
 
 // Add a callback to a timer event.
-func Timer_connect(interval int, sigfunc SIGNAL_FUNC, data POINTER) HTIMER {
-	backs = append(backs, unsafe.Pointer(sigfunc))
+func Timer_connect(interval int, sigfunc DWFUNC, data POINTER) HTIMER {
 	return HTIMER{C.go_timer_connect(C.int(interval), unsafe.Pointer(sigfunc), unsafe.Pointer(data), 0)}
 }
 
@@ -2744,11 +2759,10 @@
 }
 
 // Add a callback to a widget event.
-func Signal_connect(window HANDLE, signame string, sigfunc SIGNAL_FUNC, data POINTER) {
+func Signal_connect(window HANDLE, signame string, sigfunc DWFUNC, data POINTER) {
 	csigname := C.CString(signame)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(sigfunc))
 	thissigfunc := unsafe.Pointer(sigfunc)
 	thisdata := unsafe.Pointer(data)
 	C.go_signal_connect(window.GetHandle(), csigname, thissigfunc, thisdata, window.GetType()<<8)
@@ -4647,8 +4661,7 @@
 }
 
 // Creates a new print object.
-func Print_new(jobname string, flags uint, pages uint, drawfunc SIGNAL_FUNC, drawdata POINTER) HPRINT {
-	backs = append(backs, unsafe.Pointer(drawfunc))
+func Print_new(jobname string, flags uint, pages uint, drawfunc DWFUNC, drawdata POINTER) HPRINT {
 	cjobname := C.CString(jobname)
 	defer C.free(unsafe.Pointer(cjobname))
 
@@ -4823,8 +4836,7 @@
 	csigname := C.CString(C.DW_SIGNAL_DELETE)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a widget clicked event.
@@ -4832,8 +4844,7 @@
 	csigname := C.CString(C.DW_SIGNAL_CLICKED)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a focus clicked event.
@@ -4841,8 +4852,7 @@
 	csigname := C.CString(C.DW_SIGNAL_SET_FOCUS)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a key press event.
@@ -4850,8 +4860,7 @@
 	csigname := C.CString(C.DW_SIGNAL_KEY_PRESS)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a key press event.
@@ -4859,8 +4868,7 @@
 	csigname := C.CString(C.DW_SIGNAL_KEY_PRESS)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a mouse motion event.
@@ -4868,8 +4876,7 @@
 	csigname := C.CString(C.DW_SIGNAL_MOTION_NOTIFY)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a mouse button press event.
@@ -4877,8 +4884,7 @@
 	csigname := C.CString(C.DW_SIGNAL_BUTTON_PRESS)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a mouse button release event.
@@ -4886,8 +4892,7 @@
 	csigname := C.CString(C.DW_SIGNAL_BUTTON_RELEASE)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a render expose event.
@@ -4895,8 +4900,7 @@
 	csigname := C.CString(C.DW_SIGNAL_EXPOSE)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a configure (size change) event.
@@ -4904,8 +4908,7 @@
 	csigname := C.CString(C.DW_SIGNAL_CONFIGURE)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a tree ENTER/RETURN press event.
@@ -4913,8 +4916,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_ENTER)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a container ENTER/RETURN press event.
@@ -4922,8 +4924,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_ENTER)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a tree context event.
@@ -4931,8 +4932,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_CONTEXT)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a container context event.
@@ -4940,8 +4940,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_CONTEXT)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a tree select event.
@@ -4949,8 +4948,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_SELECT)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a container select event.
@@ -4958,8 +4956,7 @@
 	csigname := C.CString(C.DW_SIGNAL_ITEM_SELECT)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a listbox select event.
@@ -4967,8 +4964,7 @@
 	csigname := C.CString(C.DW_SIGNAL_LIST_SELECT)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a value changed event.
@@ -4976,8 +4972,7 @@
 	csigname := C.CString(C.DW_SIGNAL_VALUE_CHANGED)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a value changed event.
@@ -4985,8 +4980,7 @@
 	csigname := C.CString(C.DW_SIGNAL_VALUE_CHANGED)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a value changed event.
@@ -4994,8 +4988,7 @@
 	csigname := C.CString(C.DW_SIGNAL_VALUE_CHANGED)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a column title click event.
@@ -5003,8 +4996,7 @@
 	csigname := C.CString(C.DW_SIGNAL_COLUMN_CLICK)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a notebook switch page event.
@@ -5012,8 +5004,7 @@
 	csigname := C.CString(C.DW_SIGNAL_SWITCH_PAGE)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a tree item (node) expand event.
@@ -5021,8 +5012,7 @@
 	csigname := C.CString(C.DW_SIGNAL_TREE_EXPAND)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a menu item clicked event.
@@ -5030,15 +5020,13 @@
 	csigname := C.CString(C.DW_SIGNAL_CLICKED)
 	defer C.free(unsafe.Pointer(csigname))
 
-	backs = append(backs, unsafe.Pointer(&sigfunc))
-	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(&sigfunc), nil, (window.GetType()<<8)|go_flags_no_data)
+	C.go_signal_connect(unsafe.Pointer(window.hwnd), csigname, unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, (window.GetType()<<8)|go_flags_no_data)
 }
 
 // Connect a function or closure to a timer event.
 func (id *HTIMER) Connect(sigfunc func() int, interval int) {
 	if id.tid == 0 {
-		backs = append(backs, unsafe.Pointer(&sigfunc))
-		id.tid = C.go_timer_connect(C.int(interval), unsafe.Pointer(&sigfunc), nil, go_flags_no_data)
+		id.tid = C.go_timer_connect(C.int(interval), unsafe.Pointer(cgo.NewHandle(sigfunc)), nil, go_flags_no_data)
 	}
 }
 
@@ -5052,1060 +5040,1063 @@
 // Connect a function or closure to a print object draw page event.
 func (print HPRINT) Connect(drawfunc func(HPRINT, HPIXMAP, int) int, flags uint, pages int) {
 	if print.hprint == nil {
-		backs = append(backs, unsafe.Pointer(&drawfunc))
 		cjobname := C.CString(print.jobname)
 		defer C.free(unsafe.Pointer(cjobname))
 
-		print.hprint = C.go_print_new(cjobname, C.ulong(flags), C.uint(pages), unsafe.Pointer(&drawfunc), nil, go_flags_no_data)
+		print.hprint = C.go_print_new(cjobname, C.ulong(flags), C.uint(pages), unsafe.Pointer(cgo.NewHandle(drawfunc)), nil, go_flags_no_data)
 	}
 }
 
 //export go_callback_remove
-func go_callback_remove(pfunc unsafe.Pointer) {
-	// Scan through the callback function pointer list...
-	for i, p := range backs {
-		// When we find the pointer of the function
-		// we are removing...
-		if p == pfunc {
-			// Remove it from the callback list...
-			// So it can be garbage collected if not used
-			backs = append(backs[:i], backs[i+1:]...)
-			//delete(backs, i);
-			return
-		}
-	}
+func go_callback_remove(h unsafe.Pointer) {
+	pfunc := cgo.Handle(h)
+	pfunc.Delete()
 }
 
 //export go_int_callback_basic
-func go_int_callback_basic(pfunc unsafe.Pointer, window unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_basic(h unsafe.Pointer, window unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, POINTER) int)
 		return C.int(thisfunc(HWND{window}, POINTER(data)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, POINTER) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, POINTER(data)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, POINTER) int)
 		return C.int(thisfunc(HTEXT{window}, POINTER(data)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, POINTER(data)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, POINTER(data)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, POINTER) int)
 		return C.int(thisfunc(HMLE{window}, POINTER(data)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, POINTER) int)
 		return C.int(thisfunc(HBUTTON{window}, POINTER(data)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, POINTER) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, POINTER(data)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, POINTER(data)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, POINTER) int)
 		return C.int(thisfunc(HBOX{window}, POINTER(data)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, POINTER) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, POINTER(data)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, POINTER) int)
 		return C.int(thisfunc(HMENUITEM{window}, POINTER(data)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, POINTER) int)
 		return C.int(thisfunc(HLISTBOX{window}, POINTER(data)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, POINTER) int)
 		return C.int(thisfunc(HPERCENT{window}, POINTER(data)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, POINTER) int)
 		return C.int(thisfunc(HSLIDER{window}, POINTER(data)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, POINTER) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, POINTER(data)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, POINTER(data)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, POINTER) int)
 		return C.int(thisfunc(HHTML{window}, POINTER(data)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, POINTER) int)
 		return C.int(thisfunc(HCALENDAR{window}, POINTER(data)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, POINTER) int)
 		return C.int(thisfunc(HBITMAP{window}, POINTER(data)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, POINTER) int)
 		return C.int(thisfunc(HSPLITBAR{window}, POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE) int)
 		return C.int(thisfunc(HGENERIC{window}))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND) int)
 		return C.int(thisfunc(HWND{window}))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD) int)
 		return C.int(thisfunc(HENTRYFIELD{window}))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT) int)
 		return C.int(thisfunc(HTEXT{window}))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE) int)
 		return C.int(thisfunc(HTREE{window}))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE) int)
 		return C.int(thisfunc(HMLE{window}))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON) int)
 		return C.int(thisfunc(HBUTTON{window}))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON) int)
 		return C.int(thisfunc(HSPINBUTTON{window}))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK) int)
 		return C.int(thisfunc(HNOTEBOOK{window}))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX) int)
 		return C.int(thisfunc(HBOX{window}))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX) int)
 		return C.int(thisfunc(HSCROLLBOX{window}))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM) int)
 		return C.int(thisfunc(HMENUITEM{window}))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX) int)
 		return C.int(thisfunc(HLISTBOX{window}))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT) int)
 		return C.int(thisfunc(HPERCENT{window}))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER) int)
 		return C.int(thisfunc(HSLIDER{window}))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR) int)
 		return C.int(thisfunc(HSCROLLBAR{window}))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER) int)
 		return C.int(thisfunc(HRENDER{window}))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML) int)
 		return C.int(thisfunc(HHTML{window}))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR) int)
 		return C.int(thisfunc(HCALENDAR{window}))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP) int)
 		return C.int(thisfunc(HBITMAP{window}))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR) int)
 		return C.int(thisfunc(HSPLITBAR{window}))
 	}
-	thisfunc := *(*func(HANDLE, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, POINTER(data)))
 }
 
 //export go_int_callback_configure
-func go_int_callback_configure(pfunc unsafe.Pointer, window unsafe.Pointer, width C.int, height C.int, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_configure(h unsafe.Pointer, window unsafe.Pointer, width C.int, height C.int, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int, int, POINTER) int)
 		return C.int(thisfunc(HWND{window}, int(width), int(height), POINTER(data)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int, int, POINTER) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(width), int(height), POINTER(data)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int, int, POINTER) int)
 		return C.int(thisfunc(HTEXT{window}, int(width), int(height), POINTER(data)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int, int, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, int(width), int(height), POINTER(data)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int, int, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(width), int(height), POINTER(data)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int, int, POINTER) int)
 		return C.int(thisfunc(HMLE{window}, int(width), int(height), POINTER(data)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int, int, POINTER) int)
 		return C.int(thisfunc(HBUTTON{window}, int(width), int(height), POINTER(data)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int, int, POINTER) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(width), int(height), POINTER(data)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int, int, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(width), int(height), POINTER(data)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int, int, POINTER) int)
 		return C.int(thisfunc(HBOX{window}, int(width), int(height), POINTER(data)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(width), int(height), POINTER(data)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int, int, POINTER) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(width), int(height), POINTER(data)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int, int, POINTER) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(width), int(height), POINTER(data)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int, int, POINTER) int)
 		return C.int(thisfunc(HPERCENT{window}, int(width), int(height), POINTER(data)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int, int, POINTER) int)
 		return C.int(thisfunc(HSLIDER{window}, int(width), int(height), POINTER(data)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(width), int(height), POINTER(data)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, int(width), int(height), POINTER(data)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int, int, POINTER) int)
 		return C.int(thisfunc(HHTML{window}, int(width), int(height), POINTER(data)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int, int, POINTER) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(width), int(height), POINTER(data)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int, int, POINTER) int)
 		return C.int(thisfunc(HBITMAP{window}, int(width), int(height), POINTER(data)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int, int, POINTER) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int, int, POINTER) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(width), int(height), POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, int, int) int)
 		return C.int(thisfunc(HGENERIC{window}, int(width), int(height)))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int, int) int)
 		return C.int(thisfunc(HWND{window}, int(width), int(height)))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int, int) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(width), int(height)))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int, int) int)
 		return C.int(thisfunc(HTEXT{window}, int(width), int(height)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int, int) int)
 		return C.int(thisfunc(HTREE{window}, int(width), int(height)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int, int) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(width), int(height)))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int, int) int)
 		return C.int(thisfunc(HMLE{window}, int(width), int(height)))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int, int) int)
 		return C.int(thisfunc(HBUTTON{window}, int(width), int(height)))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int, int) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(width), int(height)))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int, int) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(width), int(height)))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int, int) int)
 		return C.int(thisfunc(HBOX{window}, int(width), int(height)))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int, int) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(width), int(height)))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int, int) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(width), int(height)))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int, int) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(width), int(height)))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int, int) int)
 		return C.int(thisfunc(HPERCENT{window}, int(width), int(height)))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int, int) int)
 		return C.int(thisfunc(HSLIDER{window}, int(width), int(height)))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int, int) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(width), int(height)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int) int)
 		return C.int(thisfunc(HRENDER{window}, int(width), int(height)))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int, int) int)
 		return C.int(thisfunc(HHTML{window}, int(width), int(height)))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int, int) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(width), int(height)))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int, int) int)
 		return C.int(thisfunc(HBITMAP{window}, int(width), int(height)))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int, int) C.int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int, int) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(width), int(height)))
 	}
-	thisfunc := *(*func(HANDLE, int, int, POINTER) C.int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, int, int, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, int(width), int(height), POINTER(data)))
 }
 
 //export go_int_callback_keypress
-func go_int_callback_keypress(pfunc unsafe.Pointer, window unsafe.Pointer, ch C.char, vk C.int, state C.int, data unsafe.Pointer, utf8 *C.char, flags C.uint) C.int {
+func go_int_callback_keypress(h unsafe.Pointer, window unsafe.Pointer, ch C.char, vk C.int, state C.int, data unsafe.Pointer, utf8 *C.char, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HWND{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HTEXT{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HTREE{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, uint8, int, int, POINTER, string) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HMLE{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HBUTTON{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HBOX{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HMENUITEM{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HLISTBOX{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HPERCENT{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HSLIDER{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HRENDER{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HHTML{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HCALENDAR{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HBITMAP{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, uint8, int, int, POINTER, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, uint8, int, int, POINTER, string) int)
 		return C.int(thisfunc(HSPLITBAR{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, uint8, int, int, string) int)
 		return C.int(thisfunc(HGENERIC{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, uint8, int, int, string) int)
 		return C.int(thisfunc(HWND{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, uint8, int, int, string) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, uint8, int, int, string) int)
 		return C.int(thisfunc(HTEXT{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, uint8, int, int, string) int)
 		return C.int(thisfunc(HTREE{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, uint8, int, int, string) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, uint8, int, int, string) int)
 		return C.int(thisfunc(HMLE{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, uint8, int, int, string) int)
 		return C.int(thisfunc(HBUTTON{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, uint8, int, int, string) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, uint8, int, int, string) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, uint8, int, int, string) int)
 		return C.int(thisfunc(HBOX{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, uint8, int, int, string) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, uint8, int, int, string) int)
 		return C.int(thisfunc(HMENUITEM{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, uint8, int, int, string) int)
 		return C.int(thisfunc(HLISTBOX{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, uint8, int, int, string) int)
 		return C.int(thisfunc(HPERCENT{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, uint8, int, int, string) int)
 		return C.int(thisfunc(HSLIDER{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, uint8, int, int, string) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, uint8, int, int, string) int)
 		return C.int(thisfunc(HRENDER{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, uint8, int, int, string) int)
 		return C.int(thisfunc(HHTML{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, uint8, int, int, string) int)
 		return C.int(thisfunc(HCALENDAR{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, uint8, int, int, string) int)
 		return C.int(thisfunc(HBITMAP{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, uint8, int, int, string) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, uint8, int, int, string) int)
 		return C.int(thisfunc(HSPLITBAR{window}, uint8(ch), int(vk), int(state), C.GoString(utf8)))
 	}
-	thisfunc := *(*func(HANDLE, uint8, int, int, POINTER, string) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, uint8, int, int, POINTER, string) int)
 	return C.int(thisfunc(HGENERIC{window}, uint8(ch), int(vk), int(state), POINTER(data), C.GoString(utf8)))
 }
 
 //export go_int_callback_mouse
-func go_int_callback_mouse(pfunc unsafe.Pointer, window unsafe.Pointer, x C.int, y C.int, mask C.int, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_mouse(h unsafe.Pointer, window unsafe.Pointer, x C.int, y C.int, mask C.int, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int, int, int, POINTER) int)
 		return C.int(thisfunc(HWND{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int, int, int, POINTER) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int, int, int, POINTER) int)
 		return C.int(thisfunc(HTEXT{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int, int, int, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int, int, int, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(x), int(y), int(mask), POINTER(data)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int, int, int, POINTER) int)
 		return C.int(thisfunc(HMLE{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int, int, int, POINTER) int)
 		return C.int(thisfunc(HBUTTON{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int, int, int, POINTER) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int, int, int, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int, int, int, POINTER) int)
 		return C.int(thisfunc(HBOX{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int, int, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int, int, int, POINTER) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int, int, int, POINTER) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int, int, int, POINTER) int)
 		return C.int(thisfunc(HPERCENT{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int, int, int, POINTER) int)
 		return C.int(thisfunc(HSLIDER{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int, int, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int, int, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int, int, int, POINTER) int)
 		return C.int(thisfunc(HHTML{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int, int, int, POINTER) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int, int, int, POINTER) int)
 		return C.int(thisfunc(HBITMAP{window}, int(x), int(y), int(mask), POINTER(data)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int, int, int, POINTER) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(x), int(y), int(mask), POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, int, int, int) int)
 		return C.int(thisfunc(HGENERIC{window}, int(x), int(y), int(mask)))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int, int, int) int)
 		return C.int(thisfunc(HWND{window}, int(x), int(y), int(mask)))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int, int, int) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(x), int(y), int(mask)))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int, int, int) int)
 		return C.int(thisfunc(HTEXT{window}, int(x), int(y), int(mask)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int, int, int) int)
 		return C.int(thisfunc(HTREE{window}, int(x), int(y), int(mask)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int, int, int) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(x), int(y), int(mask)))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int, int, int) int)
 		return C.int(thisfunc(HMLE{window}, int(x), int(y), int(mask)))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int, int, int) int)
 		return C.int(thisfunc(HBUTTON{window}, int(x), int(y), int(mask)))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int, int, int) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(x), int(y), int(mask)))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int, int, int) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(x), int(y), int(mask)))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int, int, int) int)
 		return C.int(thisfunc(HBOX{window}, int(x), int(y), int(mask)))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int, int, int) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(x), int(y), int(mask)))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int, int, int) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(x), int(y), int(mask)))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int, int, int) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(x), int(y), int(mask)))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int, int, int) int)
 		return C.int(thisfunc(HPERCENT{window}, int(x), int(y), int(mask)))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int, int, int) int)
 		return C.int(thisfunc(HSLIDER{window}, int(x), int(y), int(mask)))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int, int, int) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(x), int(y), int(mask)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int, int) int)
 		return C.int(thisfunc(HRENDER{window}, int(x), int(y), int(mask)))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int, int, int) int)
 		return C.int(thisfunc(HHTML{window}, int(x), int(y), int(mask)))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int, int, int) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(x), int(y), int(mask)))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int, int, int) int)
 		return C.int(thisfunc(HBITMAP{window}, int(x), int(y), int(mask)))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int, int, int) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(x), int(y), int(mask)))
 	}
-	thisfunc := *(*func(HANDLE, int, int, int, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, int, int, int, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, int(x), int(y), int(mask), POINTER(data)))
 }
 
 //export go_int_callback_expose
-func go_int_callback_expose(pfunc unsafe.Pointer, window unsafe.Pointer, x C.int, y C.int, width C.int, height C.int, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_expose(h unsafe.Pointer, window unsafe.Pointer, x C.int, y C.int, width C.int, height C.int, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, int, int, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int, int, int, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, int(x), int(y), int(width), int(height), POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, int, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, int, int, int, int) int)
 		return C.int(thisfunc(HGENERIC{window}, int(x), int(y), int(width), int(height)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, int, int, int, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, int, int, int) int)
 		return C.int(thisfunc(HRENDER{window}, int(x), int(y), int(width), int(height)))
 	}
-	thisfunc := *(*func(HANDLE, int, int, int, int, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, int, int, int, int, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, int(x), int(y), int(width), int(height), POINTER(data)))
 }
 
 //export go_int_callback_item_enter
-func go_int_callback_item_enter(pfunc unsafe.Pointer, window unsafe.Pointer, text *C.char, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_item_enter(h unsafe.Pointer, window unsafe.Pointer, text *C.char, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, string, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, string, POINTER, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, string, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, string, POINTER, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, string, POINTER) int)
 		return C.int(thisfunc(HGENERIC{window}, C.GoString(text), POINTER(itemdata)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, string, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, C.GoString(text), POINTER(itemdata)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, string, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, C.GoString(text), POINTER(itemdata)))
 	}
-	thisfunc := *(*func(HANDLE, string, POINTER, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, string, POINTER, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 }
 
 //export go_int_callback_item_context
-func go_int_callback_item_context(pfunc unsafe.Pointer, window unsafe.Pointer, text *C.char, x C.int, y C.int, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_item_context(h unsafe.Pointer, window unsafe.Pointer, text *C.char, x C.int, y C.int, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, string, int, int, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, string, int, int, POINTER, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, C.GoString(text), int(x), int(y), POINTER(data), POINTER(itemdata)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, string, int, int, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, string, int, int, POINTER, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, C.GoString(text), int(x), int(y), POINTER(data), POINTER(itemdata)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, string, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, string, int, int, POINTER) int)
 		return C.int(thisfunc(HGENERIC{window}, C.GoString(text), int(x), int(y), POINTER(itemdata)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, string, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, string, int, int, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, C.GoString(text), int(x), int(y), POINTER(itemdata)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, string, int, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, string, int, int, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, C.GoString(text), int(x), int(y), POINTER(itemdata)))
 	}
-	thisfunc := *(*func(HANDLE, string, int, int, POINTER, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, string, int, int, POINTER, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, C.GoString(text), int(x), int(y), POINTER(data), POINTER(itemdata)))
 }
 
 //export go_int_callback_item_select
-func go_int_callback_item_select(pfunc unsafe.Pointer, window unsafe.Pointer, item unsafe.Pointer, text *C.char, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_item_select(h unsafe.Pointer, window unsafe.Pointer, item unsafe.Pointer, text *C.char, data unsafe.Pointer, itemdata unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, HTREEITEM, string, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, HTREEITEM, string, POINTER, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, HTREEITEM, string, POINTER, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, HTREEITEM, string, POINTER, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, HTREEITEM, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, HTREEITEM, string, POINTER) int)
 		return C.int(thisfunc(HGENERIC{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(itemdata)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, HTREEITEM, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, HTREEITEM, string, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(itemdata)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, HTREEITEM, string, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, HTREEITEM, string, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(itemdata)))
 	}
-	thisfunc := *(*func(HANDLE, HTREEITEM, string, POINTER, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, HTREEITEM, string, POINTER, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, HTREEITEM{item, HWND{window}}, C.GoString(text), POINTER(data), POINTER(itemdata)))
 }
 
 //export go_int_callback_numeric
-func go_int_callback_numeric(pfunc unsafe.Pointer, window unsafe.Pointer, val C.int, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_numeric(h unsafe.Pointer, window unsafe.Pointer, val C.int, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int, POINTER) int)
 		return C.int(thisfunc(HWND{window}, int(val), POINTER(data)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int, POINTER) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(val), POINTER(data)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int, POINTER) int)
 		return C.int(thisfunc(HTEXT{window}, int(val), POINTER(data)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, int(val), POINTER(data)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(val), POINTER(data)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int, POINTER) int)
 		return C.int(thisfunc(HMLE{window}, int(val), POINTER(data)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int, POINTER) int)
 		return C.int(thisfunc(HBUTTON{window}, int(val), POINTER(data)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int, POINTER) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(val), POINTER(data)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(val), POINTER(data)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int, POINTER) int)
 		return C.int(thisfunc(HBOX{window}, int(val), POINTER(data)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(val), POINTER(data)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int, POINTER) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(val), POINTER(data)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int, POINTER) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(val), POINTER(data)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int, POINTER) int)
 		return C.int(thisfunc(HPERCENT{window}, int(val), POINTER(data)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int, POINTER) int)
 		return C.int(thisfunc(HSLIDER{window}, int(val), POINTER(data)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int, POINTER) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(val), POINTER(data)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, int(val), POINTER(data)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int, POINTER) int)
 		return C.int(thisfunc(HHTML{window}, int(val), POINTER(data)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int, POINTER) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(val), POINTER(data)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int, POINTER) int)
 		return C.int(thisfunc(HBITMAP{window}, int(val), POINTER(data)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int, POINTER) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(val), POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, int) int)
 		return C.int(thisfunc(HGENERIC{window}, int(val)))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, int) int)
 		return C.int(thisfunc(HWND{window}, int(val)))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, int) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, int(val)))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, int) int)
 		return C.int(thisfunc(HTEXT{window}, int(val)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, int) int)
 		return C.int(thisfunc(HTREE{window}, int(val)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, int) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, int(val)))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, int) int)
 		return C.int(thisfunc(HMLE{window}, int(val)))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, int) int)
 		return C.int(thisfunc(HBUTTON{window}, int(val)))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, int) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, int(val)))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, int) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, int(val)))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, int) int)
 		return C.int(thisfunc(HBOX{window}, int(val)))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, int) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, int(val)))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, int) int)
 		return C.int(thisfunc(HMENUITEM{window}, int(val)))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, int) int)
 		return C.int(thisfunc(HLISTBOX{window}, int(val)))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, int) int)
 		return C.int(thisfunc(HPERCENT{window}, int(val)))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, int) int)
 		return C.int(thisfunc(HSLIDER{window}, int(val)))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, int) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, int(val)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, int) int)
 		return C.int(thisfunc(HRENDER{window}, int(val)))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, int) int)
 		return C.int(thisfunc(HHTML{window}, int(val)))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, int) int)
 		return C.int(thisfunc(HCALENDAR{window}, int(val)))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, int) int)
 		return C.int(thisfunc(HBITMAP{window}, int(val)))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, int) int)
 		return C.int(thisfunc(HSPLITBAR{window}, int(val)))
 	}
-	thisfunc := *(*func(HANDLE, int, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, int, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, int(val), POINTER(data)))
 }
 
 //export go_int_callback_ulong
-func go_int_callback_ulong(pfunc unsafe.Pointer, window unsafe.Pointer, val C.ulong, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_ulong(h unsafe.Pointer, window unsafe.Pointer, val C.ulong, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (1 << 8): // HWND
-		thisfunc := *(*func(HWND, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, uint, POINTER) int)
 		return C.int(thisfunc(HWND{window}, uint(val), POINTER(data)))
 	case (2 << 8): // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, uint, POINTER) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, uint(val), POINTER(data)))
 	case (3 << 8): // HTEXT
-		thisfunc := *(*func(HTEXT, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, uint, POINTER) int)
 		return C.int(thisfunc(HTEXT{window}, uint(val), POINTER(data)))
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, uint, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, uint(val), POINTER(data)))
 	case (5 << 8): // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, uint, POINTER) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, uint(val), POINTER(data)))
 	case (6 << 8): // HMLE
-		thisfunc := *(*func(HMLE, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, uint, POINTER) int)
 		return C.int(thisfunc(HMLE{window}, uint(val), POINTER(data)))
 	case (7 << 8): // HBUTTON
-		thisfunc := *(*func(HBUTTON, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, uint, POINTER) int)
 		return C.int(thisfunc(HBUTTON{window}, uint(val), POINTER(data)))
 	case (8 << 8): // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, uint, POINTER) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, uint(val), POINTER(data)))
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, uint, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, uint(val), POINTER(data)))
 	case (10 << 8): // HBOX
-		thisfunc := *(*func(HBOX, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, uint, POINTER) int)
 		return C.int(thisfunc(HBOX{window}, uint(val), POINTER(data)))
 	case (11 << 8): // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, uint, POINTER) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, uint(val), POINTER(data)))
 	case (12 << 8): // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, uint, POINTER) int)
 		return C.int(thisfunc(HMENUITEM{window}, uint(val), POINTER(data)))
 	case (13 << 8): // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, uint, POINTER) int)
 		return C.int(thisfunc(HLISTBOX{window}, uint(val), POINTER(data)))
 	case (14 << 8): // HPERCENT
-		thisfunc := *(*func(HPERCENT, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, uint, POINTER) int)
 		return C.int(thisfunc(HPERCENT{window}, uint(val), POINTER(data)))
 	case (15 << 8): // HSLIDER
-		thisfunc := *(*func(HSLIDER, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, uint, POINTER) int)
 		return C.int(thisfunc(HSLIDER{window}, uint(val), POINTER(data)))
 	case (16 << 8): // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, uint, POINTER) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, uint(val), POINTER(data)))
 	case (17 << 8): // HRENDER
-		thisfunc := *(*func(HRENDER, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, uint, POINTER) int)
 		return C.int(thisfunc(HRENDER{window}, uint(val), POINTER(data)))
 	case (18 << 8): // HHTML
-		thisfunc := *(*func(HHTML, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, uint, POINTER) int)
 		return C.int(thisfunc(HHTML{window}, uint(val), POINTER(data)))
 	case (19 << 8): // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, uint, POINTER) int)
 		return C.int(thisfunc(HCALENDAR{window}, uint(val), POINTER(data)))
 	case (20 << 8): // HBITMAP
-		thisfunc := *(*func(HBITMAP, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, uint, POINTER) int)
 		return C.int(thisfunc(HBITMAP{window}, uint(val), POINTER(data)))
 	case (21 << 8): // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, uint, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, uint, POINTER) int)
 		return C.int(thisfunc(HSPLITBAR{window}, uint(val), POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, uint) int)
 		return C.int(thisfunc(HGENERIC{window}, uint(val)))
 	case (1 << 8) | go_flags_no_data: // HWND
-		thisfunc := *(*func(HWND, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HWND, uint) int)
 		return C.int(thisfunc(HWND{window}, uint(val)))
 	case (2 << 8) | go_flags_no_data: // HENTRYFIELD
-		thisfunc := *(*func(HENTRYFIELD, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HENTRYFIELD, uint) int)
 		return C.int(thisfunc(HENTRYFIELD{window}, uint(val)))
 	case (3 << 8) | go_flags_no_data: // HTEXT
-		thisfunc := *(*func(HTEXT, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTEXT, uint) int)
 		return C.int(thisfunc(HTEXT{window}, uint(val)))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, uint) int)
 		return C.int(thisfunc(HTREE{window}, uint(val)))
 	case (5 << 8) | go_flags_no_data: // HCONTAINER
-		thisfunc := *(*func(HCONTAINER, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCONTAINER, uint) int)
 		filesystem := false
 		if Window_get_data(HCONTAINER{window, false}, "_go_filesystem") != nil {
 			filesystem = true
 		}
 		return C.int(thisfunc(HCONTAINER{window, filesystem}, uint(val)))
 	case (6 << 8) | go_flags_no_data: // HMLE
-		thisfunc := *(*func(HMLE, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMLE, uint) int)
 		return C.int(thisfunc(HMLE{window}, uint(val)))
 	case (7 << 8) | go_flags_no_data: // HBUTTON
-		thisfunc := *(*func(HBUTTON, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBUTTON, uint) int)
 		return C.int(thisfunc(HBUTTON{window}, uint(val)))
 	case (8 << 8) | go_flags_no_data: // HSPINBUTTON
-		thisfunc := *(*func(HSPINBUTTON, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPINBUTTON, uint) int)
 		return C.int(thisfunc(HSPINBUTTON{window}, uint(val)))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, uint) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, uint(val)))
 	case (10 << 8) | go_flags_no_data: // HBOX
-		thisfunc := *(*func(HBOX, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBOX, uint) int)
 		return C.int(thisfunc(HBOX{window}, uint(val)))
 	case (11 << 8) | go_flags_no_data: // HSCROLLBOX
-		thisfunc := *(*func(HSCROLLBOX, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBOX, uint) int)
 		return C.int(thisfunc(HSCROLLBOX{window}, uint(val)))
 	case (12 << 8) | go_flags_no_data: // HMENUITEM
-		thisfunc := *(*func(HMENUITEM, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HMENUITEM, uint) int)
 		return C.int(thisfunc(HMENUITEM{window}, uint(val)))
 	case (13 << 8) | go_flags_no_data: // HLISTBOX
-		thisfunc := *(*func(HLISTBOX, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HLISTBOX, uint) int)
 		return C.int(thisfunc(HLISTBOX{window}, uint(val)))
 	case (14 << 8) | go_flags_no_data: // HPERCENT
-		thisfunc := *(*func(HPERCENT, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPERCENT, uint) int)
 		return C.int(thisfunc(HPERCENT{window}, uint(val)))
 	case (15 << 8) | go_flags_no_data: // HSLIDER
-		thisfunc := *(*func(HSLIDER, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSLIDER, uint) int)
 		return C.int(thisfunc(HSLIDER{window}, uint(val)))
 	case (16 << 8) | go_flags_no_data: // HSCROLLBAR
-		thisfunc := *(*func(HSCROLLBAR, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSCROLLBAR, uint) int)
 		return C.int(thisfunc(HSCROLLBAR{window}, uint(val)))
 	case (17 << 8) | go_flags_no_data: // HRENDER
-		thisfunc := *(*func(HRENDER, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HRENDER, uint) int)
 		return C.int(thisfunc(HRENDER{window}, uint(val)))
 	case (18 << 8) | go_flags_no_data: // HHTML
-		thisfunc := *(*func(HHTML, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HHTML, uint) int)
 		return C.int(thisfunc(HHTML{window}, uint(val)))
 	case (19 << 8) | go_flags_no_data: // HCALENDAR
-		thisfunc := *(*func(HCALENDAR, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HCALENDAR, uint) int)
 		return C.int(thisfunc(HCALENDAR{window}, uint(val)))
 	case (20 << 8) | go_flags_no_data: // HBITMAP
-		thisfunc := *(*func(HBITMAP, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HBITMAP, uint) int)
 		return C.int(thisfunc(HBITMAP{window}, uint(val)))
 	case (21 << 8) | go_flags_no_data: // HSPLITBAR
-		thisfunc := *(*func(HSPLITBAR, uint) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HSPLITBAR, uint) int)
 		return C.int(thisfunc(HSPLITBAR{window}, uint(val)))
 	}
-	thisfunc := *(*func(HANDLE, uint, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, uint, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, uint(val), POINTER(data)))
 }
 
 //export go_int_callback_notepage
-func go_int_callback_notepage(pfunc unsafe.Pointer, window unsafe.Pointer, val C.ulong, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_notepage(h unsafe.Pointer, window unsafe.Pointer, val C.ulong, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (9 << 8): // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, HNOTEPAGE, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, HNOTEPAGE, POINTER) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, HNOTEPAGE{val, HNOTEBOOK{window}}, POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, HNOTEPAGE) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, HNOTEPAGE) int)
 		return C.int(thisfunc(HGENERIC{window}, HNOTEPAGE{val, HNOTEBOOK{window}}))
 	case (9 << 8) | go_flags_no_data: // HNOTEBOOK
-		thisfunc := *(*func(HNOTEBOOK, HNOTEPAGE) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HNOTEBOOK, HNOTEPAGE) int)
 		return C.int(thisfunc(HNOTEBOOK{window}, HNOTEPAGE{val, HNOTEBOOK{window}}))
 	}
-	thisfunc := *(*func(HANDLE, HNOTEPAGE, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, HNOTEPAGE, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, HNOTEPAGE{val, HNOTEBOOK{window}}, POINTER(data)))
 }
 
 //export go_int_callback_tree
-func go_int_callback_tree(pfunc unsafe.Pointer, window unsafe.Pointer, tree unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_tree(h unsafe.Pointer, window unsafe.Pointer, tree unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	switch flags {
 	case (4 << 8): // HTREE
-		thisfunc := *(*func(HTREE, HTREEITEM, POINTER) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, HTREEITEM, POINTER) int)
 		return C.int(thisfunc(HTREE{window}, HTREEITEM{tree, HWND{window}}, POINTER(data)))
 	case go_flags_no_data:
-		thisfunc := *(*func(HANDLE, HTREEITEM) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HANDLE, HTREEITEM) int)
 		return C.int(thisfunc(HGENERIC{window}, HTREEITEM{tree, HWND{window}}))
 	case (4 << 8) | go_flags_no_data: // HTREE
-		thisfunc := *(*func(HTREE, HTREEITEM) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HTREE, HTREEITEM) int)
 		return C.int(thisfunc(HTREE{window}, HTREEITEM{tree, HWND{window}}))
 	}
-	thisfunc := *(*func(HANDLE, HTREEITEM, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HANDLE, HTREEITEM, POINTER) int)
 	return C.int(thisfunc(HGENERIC{window}, HTREEITEM{tree, HWND{window}}, POINTER(data)))
 }
 
 //export go_int_callback_timer
-func go_int_callback_timer(pfunc unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_timer(h unsafe.Pointer, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	if (flags & go_flags_no_data) == go_flags_no_data {
-		thisfunc := *(*func() int)(pfunc)
+		thisfunc := pfunc.Value().(func() int)
 		return C.int(thisfunc())
 	}
-	thisfunc := *(*func(POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(POINTER) int)
 	return C.int(thisfunc(POINTER(data)))
 }
 
 //export go_int_callback_print
-func go_int_callback_print(pfunc unsafe.Pointer, print unsafe.Pointer, pixmap unsafe.Pointer, page_num C.int, data unsafe.Pointer, flags C.uint) C.int {
+func go_int_callback_print(h unsafe.Pointer, print unsafe.Pointer, pixmap unsafe.Pointer, page_num C.int, data unsafe.Pointer, flags C.uint) C.int {
+	pfunc := cgo.Handle(h)
 	if (flags & go_flags_no_data) == go_flags_no_data {
-		thisfunc := *(*func(HPRINT, HPIXMAP, int) int)(pfunc)
+		thisfunc := pfunc.Value().(func(HPRINT, HPIXMAP, int) int)
 		return C.int(thisfunc(HPRINT{print, ""}, HPIXMAP{pixmap}, int(page_num)))
 	}
-	thisfunc := *(*func(HPRINT, HPIXMAP, int, POINTER) int)(pfunc)
+	thisfunc := pfunc.Value().(func(HPRINT, HPIXMAP, int, POINTER) int)
 	return C.int(thisfunc(HPRINT{print, ""}, HPIXMAP{pixmap}, int(page_num), POINTER(data)))
 }
--- a/dwtest/dwtest.go	Fri Nov 05 16:45:46 2021 -0500
+++ b/dwtest/dwtest.go	Sat Nov 06 07:14:50 2021 -0500
@@ -156,7 +156,7 @@
 }
 
 func menu_callback(window dw.HMENUITEM, data dw.POINTER) int {
-	info := *(*string)(data)
+	info := dw.POINTER_TO_STRING(data)
 	buf := fmt.Sprintf("%s menu item selected", info)
 	dw.Messagebox("Menu Item Callback", dw.MB_OK|dw.MB_INFORMATION, buf)
 	return FALSE
@@ -283,10 +283,10 @@
 	hwndMenu := dw.Menu_new(0)
 	menuitem := dw.Menu_append_item(hwndMenu, "~Quit", dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU)
 
-	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 	dw.Menu_append_item(hwndMenu, dw.MENU_SEPARATOR, dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU)
 	menuitem = dw.Menu_append_item(hwndMenu, "~Show Window", dw.MENU_POPUP, 0, TRUE, FALSE, dw.NOMENU)
-	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&show_window_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(show_window_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 	px, py := dw.Pointer_query_pos()
 	/* Use the toplevel window handle here.... because on the Mac..
 	 * using the control itself, when a different tab is active
@@ -440,7 +440,7 @@
 }
 
 func print_callback(window dw.HANDLE, data dw.POINTER) int {
-	print := dw.Print_new("DWTest Job", 0, 2, dw.SIGNAL_FUNC(&draw_page_func), nil)
+	print := dw.Print_new("DWTest Job", 0, 2, dw.SIGNAL_FUNC(draw_page_func), nil)
 	dw.Print_run(print, 0)
 	return FALSE
 }
@@ -1027,7 +1027,7 @@
 	/* add menus to the menubar */
 	menu := dw.Menu_new(0)
 	menuitem := dw.Menu_append_item(menu, "~Quit", dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU)
-	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 	/*
 	 * Add the "File" menu to the menubar...
 	 */
@@ -1035,14 +1035,14 @@
 
 	changeable_menu := dw.Menu_new(0)
 	checkable_menuitem = dw.Menu_append_item(changeable_menu, "~Checkable Menu Item", dw.MENU_AUTO, 0, dw.TRUE, dw.TRUE, dw.NOMENU)
-	dw.Signal_connect(checkable_menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&menu_callback_func), dw.POINTER(&checkable_string))
+	dw.Signal_connect(checkable_menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(menu_callback_func), dw.OBJECT_TO_POINTER(checkable_string))
 	noncheckable_menuitem = dw.Menu_append_item(changeable_menu, "~Non-checkable Menu Item", dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU)
-	dw.Signal_connect(noncheckable_menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&menu_callback_func), dw.POINTER(&noncheckable_string))
+	dw.Signal_connect(noncheckable_menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(menu_callback_func), dw.OBJECT_TO_POINTER(noncheckable_string))
 	dw.Menu_append_item(changeable_menu, "~Disabled menu Item", dw.MENU_AUTO, dw.MIS_DISABLED|dw.MIS_CHECKED, dw.TRUE, dw.TRUE, dw.NOMENU)
 	/* seperator */
 	dw.Menu_append_item(changeable_menu, dw.MENU_SEPARATOR, dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU)
 	menuitem = dw.Menu_append_item(changeable_menu, "~Menu Items Disabled", dw.MENU_AUTO, 0, dw.TRUE, dw.TRUE, dw.NOMENU)
-	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&menutoggle_callback_func), nil)
+	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(menutoggle_callback_func), nil)
 	/*
 	 * Add the "Menu" menu to the menubar...
 	 */
@@ -1050,7 +1050,7 @@
 
 	menu = dw.Menu_new(0)
 	menuitem = dw.Menu_append_item(menu, "~About", dw.MENU_AUTO, 0, dw.TRUE, dw.FALSE, dw.NOMENU)
-	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&helpabout_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(menuitem, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(helpabout_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 	/*
 	 * Add the "Help" menu to the menubar...
 	 */
@@ -1136,14 +1136,14 @@
 	dw.Window_set_color(buttonbox, dw.CLR_DARKCYAN, dw.CLR_PALEGRAY)
 	dw.Window_set_color(okbutton, dw.CLR_PALEGRAY, dw.CLR_DARKCYAN)
 
-	dw.Signal_connect(browsefilebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&browse_file_callback_func), nil)
-	dw.Signal_connect(browsefolderbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&browse_folder_callback_func), nil)
-	dw.Signal_connect(copybutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&copy_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield))
-	dw.Signal_connect(pastebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&paste_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield))
-	dw.Signal_connect(okbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&beep_callback_func), nil)
-	dw.Signal_connect(cancelbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
-	dw.Signal_connect(cursortogglebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&cursortoggle_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
-	dw.Signal_connect(colorchoosebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&colorchoose_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(browsefilebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(browse_file_callback_func), nil)
+	dw.Signal_connect(browsefolderbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(browse_folder_callback_func), nil)
+	dw.Signal_connect(copybutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(copy_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield))
+	dw.Signal_connect(pastebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(paste_clicked_callback_func), dw.HANDLE_TO_POINTER(copypastefield))
+	dw.Signal_connect(okbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(beep_callback_func), nil)
+	dw.Signal_connect(cancelbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(cursortogglebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(cursortoggle_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(colorchoosebutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(colorchoose_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 }
 
 // Create Page 2
@@ -1250,19 +1250,19 @@
 	dw.Messagebox("DWTest", dw.MB_OK|dw.MB_INFORMATION, fmt.Sprintf("Width: %d Height: %d\n", font_width, font_height))
 	dw.Draw_rect(dw.NOHWND, text1pm, dw.DRAW_FILL|dw.DRAW_NOAA, 0, 0, font_width*width1, font_height*rows)
 	dw.Draw_rect(dw.NOHWND, text2pm, dw.DRAW_FILL|dw.DRAW_NOAA, 0, 0, font_width*cols, font_height*rows)
-	dw.Signal_connect(textbox1, dw.SIGNAL_BUTTON_PRESS, dw.SIGNAL_FUNC(&context_menu_event_func), nil)
-	dw.Signal_connect(textbox1, dw.SIGNAL_EXPOSE, dw.SIGNAL_FUNC(&text_expose_func), nil)
-	dw.Signal_connect(textbox2, dw.SIGNAL_EXPOSE, dw.SIGNAL_FUNC(&text_expose_func), nil)
-	dw.Signal_connect(textbox2, dw.SIGNAL_CONFIGURE, dw.SIGNAL_FUNC(&configure_event_func), nil)
-	dw.Signal_connect(textbox2, dw.SIGNAL_MOTION_NOTIFY, dw.SIGNAL_FUNC(&motion_notify_event_func), dw.POINTER(uintptr(1)))
-	dw.Signal_connect(textbox2, dw.SIGNAL_BUTTON_PRESS, dw.SIGNAL_FUNC(&motion_notify_event_func), nil)
-	dw.Signal_connect(hscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1))
-	dw.Signal_connect(vscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1))
-	dw.Signal_connect(imagestretchcheck, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&refresh_callback_func), nil)
-	dw.Signal_connect(button1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&refresh_callback_func), nil)
-	dw.Signal_connect(button2, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&print_callback_func), nil)
-	dw.Signal_connect(rendcombo, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(&render_select_event_callback_func), nil)
-	dw.Signal_connect(mainwindow, dw.SIGNAL_KEY_PRESS, dw.SIGNAL_FUNC(&keypress_callback_func), nil)
+	dw.Signal_connect(textbox1, dw.SIGNAL_BUTTON_PRESS, dw.SIGNAL_FUNC(context_menu_event_func), nil)
+	dw.Signal_connect(textbox1, dw.SIGNAL_EXPOSE, dw.SIGNAL_FUNC(text_expose_func), nil)
+	dw.Signal_connect(textbox2, dw.SIGNAL_EXPOSE, dw.SIGNAL_FUNC(text_expose_func), nil)
+	dw.Signal_connect(textbox2, dw.SIGNAL_CONFIGURE, dw.SIGNAL_FUNC(configure_event_func), nil)
+	dw.Signal_connect(textbox2, dw.SIGNAL_MOTION_NOTIFY, dw.SIGNAL_FUNC(motion_notify_event_func), dw.POINTER(uintptr(1)))
+	dw.Signal_connect(textbox2, dw.SIGNAL_BUTTON_PRESS, dw.SIGNAL_FUNC(motion_notify_event_func), nil)
+	dw.Signal_connect(hscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1))
+	dw.Signal_connect(vscrollbar, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(scrollbar_valuechanged_callback_func), dw.HANDLE_TO_POINTER(status1))
+	dw.Signal_connect(imagestretchcheck, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(refresh_callback_func), nil)
+	dw.Signal_connect(button1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(refresh_callback_func), nil)
+	dw.Signal_connect(button2, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(print_callback_func), nil)
+	dw.Signal_connect(rendcombo, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(render_select_event_callback_func), nil)
+	dw.Signal_connect(mainwindow, dw.SIGNAL_KEY_PRESS, dw.SIGNAL_FUNC(keypress_callback_func), nil)
 
 	dw.Taskbar_insert(textbox1, fileicon, "DWTest")
 }
@@ -1287,8 +1287,8 @@
 	dw.Box_pack_start(notebookbox3, tree_status, 100, -1, TRUE, FALSE, 1)
 
 	/* set up our signal trappers... */
-	dw.Signal_connect(tree, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HANDLE_TO_POINTER(tree_status))
-	dw.Signal_connect(tree, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&item_select_cb_func), dw.HANDLE_TO_POINTER(tree_status))
+	dw.Signal_connect(tree, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(item_context_cb_func), dw.HANDLE_TO_POINTER(tree_status))
+	dw.Signal_connect(tree, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(item_select_cb_func), dw.HANDLE_TO_POINTER(tree_status))
 
 	t1 := dw.Tree_insert(tree, "tree folder 1", foldericon, dw.NOHTREEITEM, dw.POINTER(uintptr(1)))
 	t2 := dw.Tree_insert(tree, "tree folder 2", foldericon, dw.NOHTREEITEM, dw.POINTER(uintptr(2)))
@@ -1370,10 +1370,10 @@
 	mle_point = dw.Mle_import(container_mle, fmt.Sprintf("[%d]\r\n\r\n", mle_point), mle_point)
 	dw.Mle_set_cursor(container_mle, mle_point)
 	/* connect our event trappers... */
-	dw.Signal_connect(container, dw.SIGNAL_ITEM_ENTER, dw.SIGNAL_FUNC(&item_enter_cb_func), dw.HANDLE_TO_POINTER(container_status))
-	dw.Signal_connect(container, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(&item_context_cb_func), dw.HANDLE_TO_POINTER(container_status))
-	dw.Signal_connect(container, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(&container_select_cb_func), dw.HANDLE_TO_POINTER(container_status))
-	dw.Signal_connect(container, dw.SIGNAL_COLUMN_CLICK, dw.SIGNAL_FUNC(&column_click_cb_func), dw.HANDLE_TO_POINTER(container_status))
+	dw.Signal_connect(container, dw.SIGNAL_ITEM_ENTER, dw.SIGNAL_FUNC(item_enter_cb_func), dw.HANDLE_TO_POINTER(container_status))
+	dw.Signal_connect(container, dw.SIGNAL_ITEM_CONTEXT, dw.SIGNAL_FUNC(item_context_cb_func), dw.HANDLE_TO_POINTER(container_status))
+	dw.Signal_connect(container, dw.SIGNAL_ITEM_SELECT, dw.SIGNAL_FUNC(container_select_cb_func), dw.HANDLE_TO_POINTER(container_status))
+	dw.Signal_connect(container, dw.SIGNAL_COLUMN_CLICK, dw.SIGNAL_FUNC(column_click_cb_func), dw.HANDLE_TO_POINTER(container_status))
 }
 
 // Page 5
@@ -1400,11 +1400,11 @@
 	dw.Window_set_color(buttonboxperm, dw.CLR_WHITE, dw.CLR_WHITE)
 	abutton1 := dw.Bitmapbutton_new_from_file("Top Button", 0, fmt.Sprintf("%s/%s", SRCROOT, FILE_ICON_NAME))
 	dw.Box_pack_start(buttonboxperm, abutton1, 100, 30, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&button_callback_func), nil)
+	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(button_callback_func), nil)
 	dw.Box_pack_start(buttonboxperm, dw.NOHWND, 25, 5, FALSE, FALSE, 0)
 	abutton2 := dw.Bitmapbutton_new_from_file("Bottom", 0, fmt.Sprintf("%s/%s", SRCROOT, FOLDER_ICON_NAME))
 	dw.Box_pack_start(buttonsbox, abutton2, 25, 25, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton2, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&button_callback_func), nil)
+	dw.Signal_connect(abutton2, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(button_callback_func), nil)
 	dw.Window_set_bitmap(abutton2, 0, FILE_ICON_NAME)
 
 	create_button(false)
@@ -1417,14 +1417,14 @@
 	/*
 	   dw_window_set_text( combobox, "initial value");
 	*/
-	dw.Signal_connect(combobox1, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(&combobox_select_event_callback_func), nil)
+	dw.Signal_connect(combobox1, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(combobox_select_event_callback_func), nil)
 
 	combobox2 = dw.Combobox_new("joe", 0) /* no point in specifying an initial value */
 	dw.Box_pack_start(combox, combobox2, -1, -1, TRUE, FALSE, 0)
 	/*
 	   dw_window_set_text( combobox, "initial value");
 	*/
-	dw.Signal_connect(combobox2, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(&combobox_select_event_callback_func), nil)
+	dw.Signal_connect(combobox2, dw.SIGNAL_LIST_SELECT, dw.SIGNAL_FUNC(combobox_select_event_callback_func), nil)
 	/* add LOTS of items */
 	fmt.Printf("before appending 500 items to combobox using dw_listbox_list_append()\n")
 	text := make([]string, 500)
@@ -1441,11 +1441,11 @@
 	dw.Box_pack_start(combox, spinbutton, -1, -1, TRUE, FALSE, 0)
 	dw.Spinbutton_set_limits(spinbutton, 100, 1)
 	dw.Spinbutton_set_pos(spinbutton, 30)
-	dw.Signal_connect(spinbutton, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&spinbutton_valuechanged_callback_func), nil)
+	dw.Signal_connect(spinbutton, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(spinbutton_valuechanged_callback_func), nil)
 	/* make a slider */
 	slider = dw.Slider_new(FALSE, 11, 0) /* no point in specifying text */
 	dw.Box_pack_start(combox, slider, -1, -1, TRUE, FALSE, 0)
-	dw.Signal_connect(slider, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(&slider_valuechanged_callback_func), nil)
+	dw.Signal_connect(slider, dw.SIGNAL_VALUE_CHANGED, dw.SIGNAL_FUNC(slider_valuechanged_callback_func), nil)
 	/* make a percent */
 	percent = dw.Percent_new(0)
 	dw.Box_pack_start(combox, percent, -1, -1, TRUE, FALSE, 0)
@@ -1457,19 +1457,19 @@
 
 	abutton1 := dw.Bitmapbutton_new_from_file("Empty image. Should be under Top button", 0, "junk")
 	dw.Box_pack_start(filetoolbarbox, abutton1, 25, 25, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&change_color_red_callback_func), nil)
+	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(change_color_red_callback_func), nil)
 	dw.Box_pack_start(filetoolbarbox, dw.NOHWND, 25, 5, FALSE, FALSE, 0)
 
 	abutton1 = dw.Bitmapbutton_new_from_file("A borderless bitmapbitton", 0, fmt.Sprintf("%s/%s", SRCROOT, FOLDER_ICON_NAME))
 	dw.Box_pack_start(filetoolbarbox, abutton1, 25, 25, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&change_color_yellow_callback_func), nil)
+	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(change_color_yellow_callback_func), nil)
 	dw.Box_pack_start(filetoolbarbox, dw.NOHWND, 25, 5, FALSE, FALSE, 0)
 	dw.Window_set_style(abutton1, dw.BS_NOBORDER, dw.BS_NOBORDER)
 
 	//abutton1 = dw.Bitmapbutton_new_from_data("A button from data", 0, folder_ico, 1718 );
 	abutton1 = dw.Bitmapbutton_new_from_file("A button from data", 0, "junk")
 	dw.Box_pack_start(filetoolbarbox, abutton1, 25, 25, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&percent_button_box_callback_func), nil)
+	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(percent_button_box_callback_func), nil)
 	dw.Box_pack_start(filetoolbarbox, dw.NOHWND, 25, 5, FALSE, FALSE, 0)
 	if redraw == true {
 		dw.Window_redraw(filetoolbarbox)
@@ -1487,7 +1487,7 @@
 
 	abutton1 := dw.Button_new("Show Adjustments", 0)
 	dw.Box_pack_start(scrollbox, abutton1, -1, 30, FALSE, FALSE, 0)
-	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&scrollbox_button_callback_func), nil)
+	dw.Signal_connect(abutton1, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(scrollbox_button_callback_func), nil)
 
 	for i = 0; i < MAX_WIDGETS; i++ {
 		tmpbox := dw.Box_new(dw.HORZ, 0)
@@ -1519,7 +1519,7 @@
 
 	startbutton = dw.Button_new("Start Threads", 0)
 	dw.Box_pack_start(tmpbox, startbutton, -1, 30, dw.FALSE, dw.FALSE, 0)
-	dw.Signal_connect(startbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(&start_threads_button_callback_func), nil)
+	dw.Signal_connect(startbutton, dw.SIGNAL_CLICKED, dw.SIGNAL_FUNC(start_threads_button_callback_func), nil)
 
 	/* Create the base threading components */
 	threadmle = dw.Mle_new(0)
@@ -1563,7 +1563,7 @@
 	}
 	notebook := dw.Notebook_new(1, dw.TRUE)
 	dw.Box_pack_start(notebookbox, notebook, 100, 100, dw.TRUE, dw.TRUE, 0)
-	dw.Signal_connect(notebook, dw.SIGNAL_SWITCH_PAGE, dw.SIGNAL_FUNC(&switch_page_callback_func), nil)
+	dw.Signal_connect(notebook, dw.SIGNAL_SWITCH_PAGE, dw.SIGNAL_FUNC(switch_page_callback_func), nil)
 
 	notebookbox1 = dw.Box_new(dw.VERT, 5)
 	notebookpage1 := dw.Notebook_page_new(notebook, 0, dw.TRUE)
@@ -1635,7 +1635,7 @@
 	/* Set the default field */
 	dw.Window_default(mainwindow, copypastefield)
 
-	dw.Signal_connect(mainwindow, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	dw.Signal_connect(mainwindow, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
 	/*
 	 * The following is a special case handler for the Mac and other platforms which contain
 	 * an application object which can be closed.  It function identically to a window delete/close
@@ -1643,8 +1643,8 @@
 	 * handled or you allow the default handler to take place the entire application will close.
 	 * On platforms which do not have an application object this line will be ignored.
 	 */
-	dw.Signal_connect(dw.DESKTOP, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(&exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
-	timerid = dw.Timer_connect(2000, dw.SIGNAL_FUNC(&timer_callback_func), nil)
+	dw.Signal_connect(dw.DESKTOP, dw.SIGNAL_DELETE, dw.SIGNAL_FUNC(exit_callback_func), dw.HANDLE_TO_POINTER(mainwindow))
+	timerid = dw.Timer_connect(2000, dw.SIGNAL_FUNC(timer_callback_func), nil)
 	dw.Window_set_size(mainwindow, 640, 550)
 	dw.Window_show(mainwindow)