summaryrefslogtreecommitdiff
path: root/prev/container_darwin.m
diff options
context:
space:
mode:
Diffstat (limited to 'prev/container_darwin.m')
-rw-r--r--prev/container_darwin.m66
1 files changed, 66 insertions, 0 deletions
diff --git a/prev/container_darwin.m b/prev/container_darwin.m
new file mode 100644
index 0000000..7e87cf9
--- /dev/null
+++ b/prev/container_darwin.m
@@ -0,0 +1,66 @@
+// 4 august 2014
+
+#include "objc_darwin.h"
+#include "_cgo_export.h"
+#include <Cocoa/Cocoa.h>
+
+#define toNSView(x) ((NSView *) (x))
+
+// calling -[className] on the content views of NSWindow, NSTabItem, and NSBox all return NSView, so I'm assuming I just need to override these
+// fornunately:
+// - NSWindow resizing calls -[setFrameSize:] (but not -[setFrame:])
+// - NSTab resizing calls both -[setFrame:] and -[setFrameSIze:] on the current tab
+// - NSTab switching tabs calls both -[setFrame:] and -[setFrameSize:] on the new tab
+// so we just override setFrameSize:
+// thanks to mikeash and JtRip in irc.freenode.net/#macdev
+@interface goContainerView : NSView {
+@public
+ void *gocontainer;
+}
+@end
+
+@implementation goContainerView
+
+- (void)setFrameSize:(NSSize)s
+{
+ [super setFrameSize:s];
+ containerResized(self->gocontainer);
+}
+
+@end
+
+id newContainerView(void *gocontainer)
+{
+ goContainerView *c;
+
+ c = [[goContainerView alloc] initWithFrame:NSZeroRect];
+ c->gocontainer = gocontainer;
+ return (id) c;
+}
+
+void moveControl(id c, intptr_t x, intptr_t y, intptr_t width, intptr_t height)
+{
+ NSView *v;
+ NSRect frame;
+
+ frame = NSMakeRect((CGFloat) x, (CGFloat) y, (CGFloat) width, (CGFloat) height);
+ // mac os x coordinate system has (0,0) in the lower-left
+ v = toNSView(c);
+ frame.origin.y = ([[v superview] bounds].size.height - frame.size.height) - frame.origin.y;
+ // here's the magic: what we specified was what we want the alignment rect to be; make it the actual frame
+ frame = [v frameForAlignmentRect:frame];
+ [v setFrame:frame];
+}
+
+struct xrect containerBounds(id view)
+{
+ NSRect b;
+ struct xrect r;
+
+ b = [toNSView(view) bounds];
+ r.x = (intptr_t) b.origin.x;
+ r.y = (intptr_t) b.origin.y;
+ r.width = (intptr_t) b.size.width;
+ r.height = (intptr_t) b.size.height;
+ return r;
+}