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:
parent
8c109a0ae9
commit
8eee2a92b7
|
@ -3,7 +3,6 @@
|
||||||
package ui
|
package ui
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
"image"
|
"image"
|
||||||
)
|
)
|
||||||
|
@ -12,7 +11,6 @@ import (
|
||||||
// #include <stdlib.h>
|
// #include <stdlib.h>
|
||||||
//// #include <HIToolbox/Events.h>
|
//// #include <HIToolbox/Events.h>
|
||||||
// #include "objc_darwin.h"
|
// #include "objc_darwin.h"
|
||||||
// extern void areaView_drawRect(id, struct xrect);
|
|
||||||
// extern BOOL areaView_isFlipped_acceptsFirstResponder(id, SEL);
|
// extern BOOL areaView_isFlipped_acceptsFirstResponder(id, SEL);
|
||||||
// extern void areaView_mouseMoved(id, SEL, id);
|
// extern void areaView_mouseMoved(id, SEL, id);
|
||||||
// extern void areaView_mouseDown_mouseDragged(id, SEL, id);
|
// extern void areaView_mouseDown_mouseDragged(id, SEL, id);
|
||||||
|
@ -29,11 +27,11 @@ const (
|
||||||
var (
|
var (
|
||||||
_goArea C.id
|
_goArea C.id
|
||||||
_NSView = objc_getClass("NSView")
|
_NSView = objc_getClass("NSView")
|
||||||
|
|
||||||
_drawRect = sel_getUid("drawRect:")
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var goAreaSels = []selector{
|
var goAreaSels = []selector{
|
||||||
|
selector{"drawRect:", uintptr(C._areaView_drawRect), sel_void_rect,
|
||||||
|
"actually drawing Areas"},
|
||||||
selector{"isFlipped", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
|
selector{"isFlipped", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
|
||||||
"ensuring that an Area's coordinate system has (0,0) at the top-left corner"},
|
"ensuring that an Area's coordinate system has (0,0) at the top-left corner"},
|
||||||
selector{"acceptsFirstResponder", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
|
selector{"acceptsFirstResponder", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
|
||||||
|
@ -67,16 +65,11 @@ var goAreaSels = []selector{
|
||||||
}
|
}
|
||||||
|
|
||||||
func mkAreaClass() error {
|
func mkAreaClass() error {
|
||||||
id, class, err := makeClass(__goArea, _NSView, goAreaSels,
|
id, err := makeClass(__goArea, _NSView, goAreaSels,
|
||||||
"the implementation of Area on Mac OS X")
|
"the implementation of Area on Mac OS X")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
_goArea = id
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,7 +210,7 @@ id makeDummyEvent()
|
||||||
|
|
||||||
extern void areaView_drawRect(id, struct xrect);
|
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;
|
struct xrect t;
|
||||||
|
|
||||||
|
@ -221,21 +221,15 @@ static void _areaView_drawRect(id self, SEL sel, NSRect r)
|
||||||
areaView_drawRect(self, t);
|
areaView_drawRect(self, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the only objective-c feature you'll see here */
|
void *_areaView_drawRect = (void *) __areaView_drawRect;
|
||||||
/* TODO correct? "v@:" @encode(NSRect) complained about missing ; */
|
|
||||||
static char *avdrType = @encode(void(id, SEL, NSRect));
|
|
||||||
|
|
||||||
static SEL drawRect;
|
/* the only objective-c feature you'll see here
|
||||||
static BOOL drawRect_init = NO;
|
|
||||||
|
|
||||||
BOOL addAreaViewDrawMethod(Class what)
|
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
|
||||||
if (drawRect_init == NO) {
|
see also: http://stackoverflow.com/questions/6812035/adding-methods-dynamically
|
||||||
drawRect = sel_getUid("drawRect:");
|
*/
|
||||||
drawRect_init = YES;
|
char *encodedNSRect = @encode(NSRect);
|
||||||
}
|
|
||||||
return class_addMethod(what, drawRect, (IMP) _areaView_drawRect, avdrType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
the NSBitmapImageRep constructor is complex; put it here
|
the NSBitmapImageRep constructor is complex; put it here
|
||||||
|
|
|
@ -48,7 +48,7 @@ var appDelegateSels = []selector{
|
||||||
}
|
}
|
||||||
|
|
||||||
func mkAppDelegate() error {
|
func mkAppDelegate() error {
|
||||||
id, _, err := makeClass(_goAppDelegate, _NSObject, appDelegateSels,
|
id, err := makeClass(_goAppDelegate, _NSObject, appDelegateSels,
|
||||||
"application delegate (handles events)")
|
"application delegate (handles events)")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -68,6 +68,7 @@ const (
|
||||||
sel_void_id itype = iota
|
sel_void_id itype = iota
|
||||||
sel_bool_id
|
sel_bool_id
|
||||||
sel_bool
|
sel_bool
|
||||||
|
sel_void_rect
|
||||||
nitypes
|
nitypes
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -75,9 +76,22 @@ var itypes = [nitypes][]C.char{
|
||||||
sel_void_id: []C.char{'v', '@', ':', '@', 0},
|
sel_void_id: []C.char{'v', '@', ':', '@', 0},
|
||||||
sel_bool_id: []C.char{'c', '@', ':', '@', 0},
|
sel_bool_id: []C.char{'c', '@', ':', '@', 0},
|
||||||
sel_bool: []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)
|
cname := C.CString(name)
|
||||||
defer C.free(unsafe.Pointer(cname))
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return objc_getClass(name), c, nil
|
return objc_getClass(name), nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,10 +113,13 @@ extern uintptr_t *NSIndexSetEntries(id, uintptr_t);
|
||||||
extern id makeDummyEvent();
|
extern id makeDummyEvent();
|
||||||
|
|
||||||
/* for area_darwin.go */
|
/* 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 void drawImage(void *, int64_t, int64_t, int64_t, int64_t, int64_t);
|
||||||
extern struct xpoint getTranslatedEventPoint(id, id);
|
extern struct xpoint getTranslatedEventPoint(id, id);
|
||||||
|
|
||||||
|
/* for objc_darwin.go */
|
||||||
|
extern char *encodedNSRect;
|
||||||
|
|
||||||
/* for sysdata_darwin.go */
|
/* for sysdata_darwin.go */
|
||||||
extern void objc_setFont(id, unsigned int);
|
extern void objc_setFont(id, unsigned int);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue