diff options
| author | Pietro Gagliardi <[email protected]> | 2014-02-16 16:43:48 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-02-16 16:43:48 -0500 |
| commit | 7a99d42d656b74e523fb89ef38b1402615c67570 (patch) | |
| tree | a60d048001d4c5422b4b94d999b7bac6b9fce999 /gtkcalls_unix.go | |
| parent | c40b7b5599236a8e85f7bf610bfaebd4a609da0a (diff) | |
Added cgo-safe callback code for GTK+ signals. GTK+ signals work!
Diffstat (limited to 'gtkcalls_unix.go')
| -rw-r--r-- | gtkcalls_unix.go | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/gtkcalls_unix.go b/gtkcalls_unix.go index f56e6fc..84e027f 100644 --- a/gtkcalls_unix.go +++ b/gtkcalls_unix.go @@ -5,9 +5,7 @@ package main import ( - "fmt" "unsafe" - "reflect" ) // #cgo pkg-config: gtk+-3.0 @@ -21,10 +19,6 @@ import "C" type ( gtkWidget C.GtkWidget - - // these are needed for signals - gdkEvent C.GdkEvent - gpointer C.gpointer ) func fromgbool(b C.gboolean) bool { @@ -64,22 +58,16 @@ func gtk_window_new() *gtkWidget { return (*gtkWidget)(unsafe.Pointer(C.gtk_window_new(0))) } -// because *gtkWidget and *C.GtkWidget are not compatible -func gtkwidget(g *gtkWidget) (*C.GtkWidget) { - return (*C.GtkWidget)(unsafe.Pointer(g)) +// shorthand +func gtkwidget(what *gtkWidget) *C.GtkWidget { + return (*C.GtkWidget)(unsafe.Pointer(what)) } -// TODO do we need the argument? -// TODO fine-tune the function type -func g_signal_connect(obj *gtkWidget, sig string, callback interface{}) { - v := reflect.ValueOf(callback) - if v.Kind() != reflect.Func { - panic(fmt.Sprintf("UI library internal error: callback %v given to g_signal_connect not a function", v)) - } - ccallback := C.GCallback(unsafe.Pointer(v.Pointer())) +func g_signal_connect(obj *gtkWidget, sig string, callback func() bool) { + ccallback := callbacks[sig] csig := C.CString(sig) defer C.free(unsafe.Pointer(csig)) - C.gSignalConnect(gtkwidget(obj), csig, ccallback, unsafe.Pointer(nil)) + C.gSignalConnect(gtkwidget(obj), csig, ccallback, unsafe.Pointer(&callback)) } // TODO ensure this works if called on an individual control |
