From 9d8976ababebfd7ce670cdb05e3bc303ac466bf6 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Thu, 15 May 2014 19:55:16 -0400 Subject: [PATCH] Migrated everything else to Objective-C native; fixed a few things I missed along the way. --- area_darwin.go | 10 +++++----- area_darwin.h | 1 + area_darwin.m | 5 +++++ delegate_darwin.go | 4 ++-- listbox_darwin.go | 2 +- objc_darwin.go | 17 ++++------------- objc_darwin.h | 12 ++++++++++++ sysdata_darwin.go | 1 - sysdata_darwin.m | 1 + 9 files changed, 31 insertions(+), 22 deletions(-) diff --git a/area_darwin.go b/area_darwin.go index d7167a5..68669bf 100644 --- a/area_darwin.go +++ b/area_darwin.go @@ -40,7 +40,7 @@ func areaView_drawRect(self C.id, rect C.struct_xrect) { // rectangles in Cocoa are origin/size, not point0/point1; if we don't watch for this, weird things will happen when scrolling // TODO change names EVERYWHERE ELSE to match cliprect := image.Rect(int(rect.x), int(rect.y), int(rect.x + rect.width), int(rect.y + rect.height)) - max := C.objc_msgSend_stret_rect_noargs(self, _frame) + max := C.frame(self) cliprect = image.Rect(0, 0, int(max.width), int(max.height)).Intersect(cliprect) if cliprect.Empty() { // no intersection; nothing to paint return @@ -97,7 +97,7 @@ func areaMouseEvent(self C.id, e C.id, click bool, up bool) { xp := C.getTranslatedEventPoint(self, e) me.Pos = image.Pt(int(xp.x), int(xp.y)) // for the most part, Cocoa won't geenerate an event outside the Area... except when dragging outside the Area, so check for this - max := C.objc_msgSend_stret_rect_noargs(self, _frame) + max := C.frame(self) if !me.Pos.In(image.Rect(0, 0, int(max.width), int(max.height))) { return } @@ -112,7 +112,7 @@ func areaMouseEvent(self C.id, e C.id, click bool, up bool) { me.Up = which } else if click { me.Down = which - me.Count = uint(C.objc_msgSend_intret_noargs(e, _clickCount)) + me.Count = uint(C.clickCount(e)) } else { which = 0 // reset for Held processing below } @@ -136,7 +136,7 @@ func areaMouseEvent(self C.id, e C.id, click bool, up bool) { } repaint := s.handler.Mouse(me) if repaint { - C.objc_msgSend_noargs(self, _display) + C.display(self) } } @@ -165,7 +165,7 @@ func sendKeyEvent(self C.id, e C.id, ke KeyEvent) bool { s := getSysData(self) handled, repaint := s.handler.Key(ke) if repaint { - C.objc_msgSend_noargs(self, _display) + C.display(self) } return handled } diff --git a/area_darwin.h b/area_darwin.h index 0d34a35..d330c3b 100644 --- a/area_darwin.h +++ b/area_darwin.h @@ -4,5 +4,6 @@ extern id makeArea(void); extern uintptr_t modifierFlags(id); extern struct xpoint getTranslatedEventPoint(id, id); extern intptr_t buttonNumber(id); +extern intptr_t clickCount(id); extern uintptr_t pressedMouseButtons(void); extern uintptr_t keyCode(id); diff --git a/area_darwin.m b/area_darwin.m index a0105a3..041841d 100644 --- a/area_darwin.m +++ b/area_darwin.m @@ -112,6 +112,11 @@ intptr_t buttonNumber(id e) return fromNSInteger([toNSEvent(e) buttonNumber]); } +intptr_t clickCount(id e) +{ + return fromNSInteger([toNSEvent(e) clickCount]); +} + uintptr_t pressedMouseButtons(void) { return fromNSUInteger([NSEvent pressedMouseButtons]); diff --git a/delegate_darwin.go b/delegate_darwin.go index 34dfec7..045df70 100644 --- a/delegate_darwin.go +++ b/delegate_darwin.go @@ -49,10 +49,10 @@ var ( func appDelegate_windowDidResize(win C.id) { s := getSysData(win) wincv := C.windowGetContentView(win) // we want the content view's size, not the window's - r := C.objc_msgSend_stret_rect_noargs(wincv, _frame) + r := C.frame(wincv) // 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)) - C.objc_msgSend_noargs(win, _display) // redraw everything; TODO only if resize() was called? + C.display(win) // redraw everything; TODO only if resize() was called? } //export appDelegate_buttonClicked diff --git a/listbox_darwin.go b/listbox_darwin.go index 2c4db08..7f54a8d 100644 --- a/listbox_darwin.go +++ b/listbox_darwin.go @@ -182,7 +182,7 @@ func newListboxScrollView(listbox C.id) C.id { ) scrollview := newScrollView(listbox) - C.objc_msgSend_uint(scrollview, _setBorderType, _NSBezelBorder) // this is what Interface Builder gives the scroll view + C.giveScrollViewBezelBorder(scrollview) // this is what Interface Builder gives the scroll view return scrollview } diff --git a/objc_darwin.go b/objc_darwin.go index 2429779..0b8fd9d 100644 --- a/objc_darwin.go +++ b/objc_darwin.go @@ -43,14 +43,11 @@ func toNSString(str string) C.id { cstr := C.CString(str) defer C.free(unsafe.Pointer(cstr)) - return C.objc_msgSend_str(_NSString, - _stringWithUTF8String, - cstr) + return C.toNSString(cstr) } func fromNSString(str C.id) string { - cstr := C.objc_msgSend_noargs(str, _UTF8String) - return C.GoString((*C.char)(unsafe.Pointer(cstr))) + return C.GoString(C.fromNSString(str)) } // These consolidate the NSScrollView code (used by listbox_darwin.go and area_darwin.go) into a single place. @@ -66,15 +63,9 @@ var ( ) func newScrollView(content C.id) C.id { - scrollview := C.objc_msgSend_noargs(_NSScrollView, _alloc) - scrollview = initWithDummyFrame(scrollview) - C.objc_msgSend_bool(scrollview, _setHasHorizontalScroller, C.BOOL(C.YES)) - C.objc_msgSend_bool(scrollview, _setHasVerticalScroller, C.BOOL(C.YES)) - C.objc_msgSend_bool(scrollview, _setAutohidesScrollers, C.BOOL(C.YES)) - C.objc_msgSend_id(scrollview, _setDocumentView, content) - return scrollview + return C.makeScrollView(content) } func getScrollViewContent(scrollview C.id) C.id { - return C.objc_msgSend_noargs(scrollview, _documentView) + return C.scrollViewContent(scrollview) } diff --git a/objc_darwin.h b/objc_darwin.h index c1f0873..a616242 100644 --- a/objc_darwin.h +++ b/objc_darwin.h @@ -20,6 +20,18 @@ The format should be self-explanatory. #include +struct xrect; // TODO move that up here when finally getting rid of bleh_darwin.m + +extern id toNSString(char *); +extern char *fromNSString(id); +extern void display(id); +extern struct xrect frame(id); +extern id makeScrollView(id); +extern void giveScrollViewBezelBorder(id); +extern id scrollViewContent(id); + +// BEGIN OLD CODE + static inline id objc_msgSend_noargs(id obj, SEL sel) { return objc_msgSend(obj, sel); diff --git a/sysdata_darwin.go b/sysdata_darwin.go index 3b2bc38..a69f868 100644 --- a/sysdata_darwin.go +++ b/sysdata_darwin.go @@ -91,7 +91,6 @@ var ( _deselectItemAtIndex = sel_getUid("deselectItemAtIndex:") ) -// because the only way to make a new NSControl/NSView is with a frame (it gets overridden later) func initWithDummyFrame(self C.id) C.id { return C.objc_msgSend_rect(self, _initWithFrame, C.int64_t(0), C.int64_t(0), C.int64_t(100), C.int64_t(100)) diff --git a/sysdata_darwin.m b/sysdata_darwin.m index bfefe4e..e2684cb 100644 --- a/sysdata_darwin.m +++ b/sysdata_darwin.m @@ -14,6 +14,7 @@ #include #include +// because the only way to make a new NSControl/NSView is with a frame (it gets overridden later) static NSRect dummyRect;// = NSMakeRect(0, 0, 100, 100); #define to(T, x) ((T *) (x))