From de97125c54da4a2fbbec304205868444775e4fd5 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 13 May 2014 07:56:37 -0400 Subject: [PATCH] Started conversion of delegate_darwin.go to use Objective-C directly. --- delegate_darwin.go | 38 +++++++-------------------------- delegate_darwin.m | 53 ++++++++++++++++++++++++++++++++++++++++++++++ uitask_darwin.go | 3 +-- 3 files changed, 62 insertions(+), 32 deletions(-) create mode 100644 delegate_darwin.m diff --git a/delegate_darwin.go b/delegate_darwin.go index 4c40d39..be26a1e 100644 --- a/delegate_darwin.go +++ b/delegate_darwin.go @@ -18,10 +18,9 @@ This creates a class goAppDelegate that will be used as the delegate for /everyt // #cgo LDFLAGS: -lobjc -framework Foundation -framework AppKit // #include // #include "objc_darwin.h" -// extern void appDelegate_uitask(id, SEL, id); /* from uitask_darwin.go */ -// extern BOOL appDelegate_windowShouldClose(id, SEL, id); -// extern void appDelegate_windowDidResize(id, SEL, id); -// extern void appDelegate_buttonClicked(id, SEL, id); +// /* TODO this goes in objc_darwin.h once I take care of everything else */ +// extern id makeAppDelegate(void); +// extern id windowGetContentView(id); import "C" var ( @@ -37,34 +36,15 @@ var ( _buttonClicked = sel_getUid("buttonClicked:") // used by sysdata_darwin.go ) -var appDelegateSels = []selector{ - selector{"uitask:", uintptr(C.appDelegate_uitask), sel_void_id, - "performing/dispatching UI events"}, - selector{"windowShouldClose:", uintptr(C.appDelegate_windowShouldClose), sel_bool_id, - "handling window close button events"}, - selector{"windowDidResize:", uintptr(C.appDelegate_windowDidResize), sel_void_id, - "handling window resize events"}, - selector{"buttonClicked:", uintptr(C.appDelegate_buttonClicked), sel_bool_id, - "handling button clicks"}, - selector{"applicationShouldTerminate:", uintptr(C._appDelegate_applicationShouldTerminate), sel_terminatereply_id, - "handling Quit menu items (such as from the Dock)/the AppQuit channel"}, -} - func mkAppDelegate() error { - id, err := makeClass(_goAppDelegate, _NSObject, appDelegateSels, - "application delegate (handles events)") - if err != nil { - return err - } - appDelegate = C.objc_msgSend_noargs(id, _new) + appDelegate = C.makeAppDelegate() return nil } //export appDelegate_windowShouldClose -func appDelegate_windowShouldClose(self C.id, sel C.SEL, win C.id) C.BOOL { +func appDelegate_windowShouldClose(win C.id) { sysData := getSysData(win) sysData.signal() - return C.BOOL(C.NO) // don't close } var ( @@ -73,10 +53,9 @@ var ( ) //export appDelegate_windowDidResize -func appDelegate_windowDidResize(self C.id, sel C.SEL, notification C.id) { - win := C.objc_msgSend_noargs(notification, _object) +func appDelegate_windowDidResize(win C.id) { s := getSysData(win) - wincv := C.objc_msgSend_noargs(win, _contentView) // we want the content view's size, not the window's; selector defined in sysdata_darwin.go + wincv := C.windowGetContentView(win) // we want the content view's size, not the window's r := C.objc_msgSend_stret_rect_noargs(wincv, _frame) // winheight is used here because (0,0) is the bottom-left corner, not the top-left corner s.doResize(0, 0, int(r.width), int(r.height), int(r.height)) @@ -84,7 +63,7 @@ func appDelegate_windowDidResize(self C.id, sel C.SEL, notification C.id) { } //export appDelegate_buttonClicked -func appDelegate_buttonClicked(self C.id, sel C.SEL, button C.id) { +func appDelegate_buttonClicked(button C.id) { sysData := getSysData(button) sysData.signal() } @@ -95,5 +74,4 @@ func appDelegate_applicationShouldTerminate() { go func() { AppQuit <- struct{}{} }() - // xxx in bleh_darwin.m tells Cocoa not to quit } diff --git a/delegate_darwin.m b/delegate_darwin.m new file mode 100644 index 0000000..638bfa3 --- /dev/null +++ b/delegate_darwin.m @@ -0,0 +1,53 @@ +// 13 may 2014 + +#include "objc_darwin.h" +#include "_cgo_export.h" +#include +#include +#include +#include +#include + +@interface appDelegate : NSObject +@end + +@implementation appDelegate + +- (void)uitask:(NSValue *)fp +{ + appDelegate_uitask([fp pointerValue]); +} + +- (BOOL)windowShouldClose:(id)win +{ + appDelegate_windowShouldClose(win); + return NO; // don't close +} + +- (void)windowDidResize:(NSNotification *)n +{ + appDelegate_windowDidResize([n object]); +} + +- (void)buttonClicked:(id)button +{ + appDelegate_buttonClicked(button); +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app +{ + appDelegate_applicationShouldTerminate(); + return NSTerminateCancel; +} + +@end + +id makeAppDelegate(void) +{ + return [appDelegate new]; +} + +id windowGetContentView(id window) +{ + return [((NSWindow *) window) contentView]; +} diff --git a/uitask_darwin.go b/uitask_darwin.go index e72443e..6d044f6 100644 --- a/uitask_darwin.go +++ b/uitask_darwin.go @@ -104,8 +104,7 @@ func initCocoa() (NSApp C.id, err error) { } //export appDelegate_uitask -func appDelegate_uitask(self C.id, sel C.SEL, arg C.id) { - p := C.objc_msgSend_noargs(arg, _pointerValue) +func appDelegate_uitask(p unsafe.Pointer) { f := (*func ())(unsafe.Pointer(p)) (*f)() }