From e4b379f84a8cb3699c8580f30af88d56be180a4d Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Thu, 17 Jul 2014 12:02:39 -0400 Subject: [PATCH] Added button click events to the Mac OS X backend. --- redo/controls_darwin.go | 23 ++++++++++++++++++++--- redo/controls_darwin.m | 25 +++++++++++++++++++++++++ redo/objc_darwin.h | 1 + redo/zz_test.go | 3 +++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/redo/controls_darwin.go b/redo/controls_darwin.go index 91dcb65..376c430 100644 --- a/redo/controls_darwin.go +++ b/redo/controls_darwin.go @@ -47,6 +47,7 @@ func (w *widgetbase) parent(win *window) { type button struct { *widgetbase + clicked *event } func newButton(text string) *Request { @@ -55,17 +56,33 @@ func newButton(text string) *Request { op: func() { ctext := C.CString(text) defer C.free(unsafe.Pointer(ctext)) - c <- &button{ + b := &button{ widgetbase: newWidget(C.newButton(ctext)), + clicked: newEvent(), } + C.buttonSetDelegate(b.id, unsafe.Pointer(b)) + c <- b }, resp: c, } } func (b *button) OnClicked(e func(c Doer)) *Request { - // TODO - return nil + c := make(chan interface{}) + return &Request{ + op: func() { + b.clicked.set(e) + c <- struct{}{} + }, + resp: c, + } +} + +//export buttonClicked +func buttonClicked(xb unsafe.Pointer) { + b := (*button)(unsafe.Pointer(xb)) + b.clicked.fire() + println("button clicked") } func (b *button) Text() *Request { diff --git a/redo/controls_darwin.m b/redo/controls_darwin.m index a21ac0f..d8e0e51 100644 --- a/redo/controls_darwin.m +++ b/redo/controls_darwin.m @@ -22,6 +22,21 @@ void parent(id control, id parentid, BOOL floating) [toNSView(control) release]; } +@interface goControlDelegate : NSObject { +@public + void *gocontrol; +} +@end + +@implementation goControlDelegate + +- (IBAction)buttonClicked:(id)sender +{ + buttonClicked(self->gocontrol); +} + +@end + id newButton(char *text) { NSButton *b; @@ -36,6 +51,16 @@ id newButton(char *text) return b; } +void buttonSetDelegate(id button, void *b) +{ + goControlDelegate *d; + + d = [goControlDelegate new]; + d->gocontrol = b; + [toNSButton(button) setTarget:d]; + [toNSButton(button) setAction:@selector(buttonClicked:)]; +} + const char *buttonText(id button) { return [[toNSButton(button) title] UTF8String]; diff --git a/redo/objc_darwin.h b/redo/objc_darwin.h index b44461a..b1942de 100644 --- a/redo/objc_darwin.h +++ b/redo/objc_darwin.h @@ -30,6 +30,7 @@ extern void windowClose(id); extern void unparent(id); extern void parent(id, id, BOOL); extern id newButton(char *); +extern void buttonSetDelegate(id, void *); extern const char *buttonText(id); extern void buttonSetText(id, char *); diff --git a/redo/zz_test.go b/redo/zz_test.go index fb17ef7..c916252 100644 --- a/redo/zz_test.go +++ b/redo/zz_test.go @@ -20,6 +20,9 @@ func init() { done <- struct{}{} return true })) + Wait(Do, b.OnClicked(func(c Doer) { + println("in OnClicked()") + })) Wait(Do, w.Show()) <-done }()