summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--delegate_darwin.go38
-rw-r--r--delegate_darwin.m53
-rw-r--r--uitask_darwin.go3
3 files changed, 62 insertions, 32 deletions
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 <stdlib.h>
// #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 <Foundation/NSObject.h>
+#include <Foundation/NSValue.h>
+#include <Foundation/NSNotification.h>
+#include <AppKit/NSApplication.h>
+#include <AppKit/NSWindow.h>
+
+@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)()
}