summaryrefslogtreecommitdiff
path: root/area_darwin.m
diff options
context:
space:
mode:
Diffstat (limited to 'area_darwin.m')
-rw-r--r--area_darwin.m123
1 files changed, 123 insertions, 0 deletions
diff --git a/area_darwin.m b/area_darwin.m
new file mode 100644
index 0000000..a0105a3
--- /dev/null
+++ b/area_darwin.m
@@ -0,0 +1,123 @@
+// 13 may 2014
+
+#include "objc_darwin.h"
+#include "area_darwin.h"
+#include "_cgo_export.h"
+#include <AppKit/NSView.h>
+#include <AppKit/NSTrackingArea.h>
+#include <Foundation/NSGeometry.h>
+#include <AppKit/NSEvent.h>
+
+#define to(T, x) ((T *) (x))
+#define toNSEvent(x) to(NSEvent, (x))
+
+#define toNSInteger(x) ((NSInteger) (x))
+#define fromNSInteger(x) ((intptr_t) (x))
+#define toNSUInteger(x) ((NSUInteger) (x))
+#define fromNSUInteger(x) ((uintptr_t) (x))
+
+@interface areaView : NSView {
+ NSTrackingArea *trackingArea;
+}
+@end
+
+@implementation areaView
+
+- (id)initWithFrame:(NSRect)r
+{
+ self = [super initWithFrame:r];
+ if (self)
+ [self retrack];
+ // TODO other properties?
+ return self;
+}
+
+- (void)drawRect:(NSRect)cliprect
+{
+ struct xrect rect;
+
+ rect.x = (intptr_t) cliprect.origin.x;
+ rect.y = (intptr_t) cliprect.origin.y;
+ rect.width = (intptr_t) cliprect.size.width;
+ rect.height = (intptr_t) cliprect.size.height;
+ areaView_drawRect(self, rect);
+}
+
+- (BOOL)isFlipped
+{
+ return YES;
+}
+
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- (void)retrack
+{
+ trackingArea = makeTrackingArea(self); // TODO make inline
+ [self addTrackingArea:trackingArea];
+}
+
+- (void)updateTrackingAreas
+{
+ [self removeTrackingArea:trackingArea];
+ [trackingArea release];
+ [self retrack];
+}
+
+#define mouseEvent(m, f) \
+ - (void)m:(NSEvent *)e \
+ { \
+ f(self, e); \
+ }
+mouseEvent(mouseMoved, areaView_mouseMoved_mouseDragged)
+mouseEvent(mouseDragged, areaView_mouseMoved_mouseDragged)
+mouseEvent(rightMouseDragged, areaView_mouseMoved_mouseDragged)
+mouseEvent(otherMouseDragged, areaView_mouseMoved_mouseDragged)
+mouseEvent(mouseDown, areaView_mouseDown)
+mouseEvent(rightMouseDown, areaView_mouseDown)
+mouseEvent(otherMouseDown, areaView_mouseDown)
+mouseEvent(mouseUp, areaView_mouseUp)
+mouseEvent(rightMouseUp, areaView_mouseUp)
+mouseEvent(otherMouseUp, areaView_mouseUp)
+
+#define keyEvent(m, f) \
+ - (void)m:(NSEvent *)e \
+ { \
+ if (f(self, e) == NO) \
+ [super m:e]; \
+ }
+keyEvent(keyDown, areaView_keyDown)
+keyEvent(keyUp, areaView_keyUp)
+keyEvent(flagsChanged, areaView_flagsChanged)
+
+@end
+
+id makeArea(void)
+{
+ return [[areaView alloc]
+ initWithFrame:NSMakeRect(0, 0, 100, 100)];
+}
+
+uintptr_t modifierFlags(id e)
+{
+ return fromNSUInteger([toNSEvent(e) modifierFlags]);
+}
+
+// TODO move getTranslatedEventPoint() here
+
+intptr_t buttonNumber(id e)
+{
+ return fromNSInteger([toNSEvent(e) buttonNumber]);
+}
+
+uintptr_t pressedMouseButtons(void)
+{
+ return fromNSUInteger([NSEvent pressedMouseButtons]);
+}
+
+uintptr_t keyCode(id e)
+{
+ return (uintptr_t) ([toNSEvent(e) keyCode]);
+}