Changed the way drawRect: was being added to our Mac OS X Area such that we no longer need a separate function to add it to the class.

This commit is contained in:
Pietro Gagliardi 2014-04-04 22:21:53 -04:00
parent 8c109a0ae9
commit 8eee2a92b7
5 changed files with 32 additions and 28 deletions

View File

@ -3,7 +3,6 @@
package ui
import (
"fmt"
"unsafe"
"image"
)
@ -12,7 +11,6 @@ import (
// #include <stdlib.h>
//// #include <HIToolbox/Events.h>
// #include "objc_darwin.h"
// extern void areaView_drawRect(id, struct xrect);
// extern BOOL areaView_isFlipped_acceptsFirstResponder(id, SEL);
// extern void areaView_mouseMoved(id, SEL, id);
// extern void areaView_mouseDown_mouseDragged(id, SEL, id);
@ -29,11 +27,11 @@ const (
var (
_goArea C.id
_NSView = objc_getClass("NSView")
_drawRect = sel_getUid("drawRect:")
)
var goAreaSels = []selector{
selector{"drawRect:", uintptr(C._areaView_drawRect), sel_void_rect,
"actually drawing Areas"},
selector{"isFlipped", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
"ensuring that an Area's coordinate system has (0,0) at the top-left corner"},
selector{"acceptsFirstResponder", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
@ -67,16 +65,11 @@ var goAreaSels = []selector{
}
func mkAreaClass() error {
id, class, err := makeClass(__goArea, _NSView, goAreaSels,
id, err := makeClass(__goArea, _NSView, goAreaSels,
"the implementation of Area on Mac OS X")
if err != nil {
return err
}
// addAreaViewDrawMethod() is in bleh_darwin.m
ok := C.addAreaViewDrawMethod(class)
if ok != C.BOOL(C.YES) {
return fmt.Errorf("unable to add selector drawRect: to class %s (needed for actually drawing Areas; reason unknown)", __goArea)
}
_goArea = id
return nil
}

View File

@ -210,7 +210,7 @@ id makeDummyEvent()
extern void areaView_drawRect(id, struct xrect);
static void _areaView_drawRect(id self, SEL sel, NSRect r)
static void __areaView_drawRect(id self, SEL sel, NSRect r)
{
struct xrect t;
@ -221,21 +221,15 @@ static void _areaView_drawRect(id self, SEL sel, NSRect r)
areaView_drawRect(self, t);
}
/* the only objective-c feature you'll see here */
/* TODO correct? "v@:" @encode(NSRect) complained about missing ; */
static char *avdrType = @encode(void(id, SEL, NSRect));
void *_areaView_drawRect = (void *) __areaView_drawRect;
static SEL drawRect;
static BOOL drawRect_init = NO;
/* the only objective-c feature you'll see here
BOOL addAreaViewDrawMethod(Class what)
{
if (drawRect_init == NO) {
drawRect = sel_getUid("drawRect:");
drawRect_init = YES;
}
return class_addMethod(what, drawRect, (IMP) _areaView_drawRect, avdrType);
}
unfortunately NSRect both varies across architectures and is passed as just a structure, so its encoding has to be computed at compile time
because @encode() is NOT A LITERAL, we're going to just stick it all the way back in objc_darwin.go
see also: http://stackoverflow.com/questions/6812035/adding-methods-dynamically
*/
char *encodedNSRect = @encode(NSRect);
/*
the NSBitmapImageRep constructor is complex; put it here

View File

@ -48,7 +48,7 @@ var appDelegateSels = []selector{
}
func mkAppDelegate() error {
id, _, err := makeClass(_goAppDelegate, _NSObject, appDelegateSels,
id, err := makeClass(_goAppDelegate, _NSObject, appDelegateSels,
"application delegate (handles events)")
if err != nil {
return err

View File

@ -68,6 +68,7 @@ const (
sel_void_id itype = iota
sel_bool_id
sel_bool
sel_void_rect
nitypes
)
@ -75,9 +76,22 @@ var itypes = [nitypes][]C.char{
sel_void_id: []C.char{'v', '@', ':', '@', 0},
sel_bool_id: []C.char{'c', '@', ':', '@', 0},
sel_bool: []C.char{'c', '@', ':', 0},
sel_void_rect: nil, // see init() below
}
func makeClass(name string, super C.id, sels []selector, desc string) (id C.id, class C.Class, err error) {
func init() {
// see encodedNSRect in bleh_darwin.m
x := make([]C.char, 0, 256) // more than enough
x = append(x, 'v', '@', ':')
y := C.GoString(C.encodedNSRect)
for _, b := range y {
x = append(x, C.char(b))
}
x = append(x, 0)
itypes[sel_void_rect] = x
}
func makeClass(name string, super C.id, sels []selector, desc string) (id C.id, err error) {
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
@ -97,5 +111,5 @@ func makeClass(name string, super C.id, sels []selector, desc string) (id C.id,
return
}
}
return objc_getClass(name), c, nil
return objc_getClass(name), nil
}

View File

@ -113,10 +113,13 @@ extern uintptr_t *NSIndexSetEntries(id, uintptr_t);
extern id makeDummyEvent();
/* for area_darwin.go */
extern BOOL addAreaViewDrawMethod(Class);
extern void *_areaView_drawRect;
extern void drawImage(void *, int64_t, int64_t, int64_t, int64_t, int64_t);
extern struct xpoint getTranslatedEventPoint(id, id);
/* for objc_darwin.go */
extern char *encodedNSRect;
/* for sysdata_darwin.go */
extern void objc_setFont(id, unsigned int);