Browse Source

Rework OSX code, things should work a bit better now

gh-pages
falkTX 11 years ago
parent
commit
6f460bced4
2 changed files with 134 additions and 91 deletions
  1. +133
    -90
      dgl/src/pugl/pugl_osx.m
  2. +1
    -1
      distrho/src/DistrhoUILV2.cpp

+ 133
- 90
dgl/src/pugl/pugl_osx.m View File

@@ -24,6 +24,8 @@


#include "pugl_internal.h" #include "pugl_internal.h"


#include <assert.h>

@interface PuglWindow : NSWindow @interface PuglWindow : NSWindow
{ {
@public @public
@@ -54,7 +56,7 @@
[result setAcceptsMouseMovedEvents:YES]; [result setAcceptsMouseMovedEvents:YES];
[result setLevel: CGShieldingWindowLevel() + 1]; [result setLevel: CGShieldingWindowLevel() + 1];


return result;
return (PuglWindow*)result;


// unused // unused
(void)aStyle; (void)bufferingType; (void)flag; (void)aStyle; (void)bufferingType; (void)flag;
@@ -88,28 +90,30 @@ puglDisplay(PuglView* view)


@interface PuglOpenGLView : NSOpenGLView @interface PuglOpenGLView : NSOpenGLView
{ {
int colorBits;
int depthBits;
@public @public
PuglView* puglview; PuglView* puglview;

NSTrackingArea* trackingArea; NSTrackingArea* trackingArea;
} }


- (id) initWithFrame:(NSRect)frame
colorBits:(int)numColorBits
depthBits:(int)numDepthBits;
- (BOOL) acceptsFirstMouse:(NSEvent*)e;
- (BOOL) isFlipped;
- (BOOL) preservesContentInLiveResize;
- (id) initWithFrame:(NSRect)frame;
- (void) reshape; - (void) reshape;
- (void) drawRect:(NSRect)rect;
- (void) mouseEntered:(NSEvent*)event;
- (void) mouseExited:(NSEvent*)event;
- (void) drawRect:(NSRect)r;
- (void) cursorUpdate:(NSEvent*)e;
- (void) updateTrackingAreas;
- (void) viewWillMoveToWindow:(NSWindow*)newWindow;
- (void) mouseMoved:(NSEvent*)event; - (void) mouseMoved:(NSEvent*)event;
- (void) mouseDragged:(NSEvent*)event; - (void) mouseDragged:(NSEvent*)event;
- (void) rightMouseDragged:(NSEvent*)event; - (void) rightMouseDragged:(NSEvent*)event;
- (void) otherMouseDragged:(NSEvent*)event;
- (void) mouseDown:(NSEvent*)event; - (void) mouseDown:(NSEvent*)event;
- (void) mouseUp:(NSEvent*)event;
- (void) rightMouseDown:(NSEvent*)event; - (void) rightMouseDown:(NSEvent*)event;
- (void) otherMouseDown:(NSEvent*)event;
- (void) mouseUp:(NSEvent*)event;
- (void) rightMouseUp:(NSEvent*)event; - (void) rightMouseUp:(NSEvent*)event;
- (void) otherMouseUp:(NSEvent*)event;
- (void) scrollWheel:(NSEvent*)event; - (void) scrollWheel:(NSEvent*)event;
- (void) keyDown:(NSEvent*)event; - (void) keyDown:(NSEvent*)event;
- (void) keyUp:(NSEvent*)event; - (void) keyUp:(NSEvent*)event;
@@ -119,12 +123,26 @@ puglDisplay(PuglView* view)


@implementation PuglOpenGLView @implementation PuglOpenGLView


- (BOOL) acceptsFirstMouse:(NSEvent*)e
{
return YES;

// unused
(void)e;
}

- (BOOL) isFlipped
{
return YES;
}

- (BOOL) preservesContentInLiveResize
{
return NO;
}

- (id) initWithFrame:(NSRect)frame - (id) initWithFrame:(NSRect)frame
colorBits:(int)numColorBits
depthBits:(int)numDepthBits
{ {
colorBits = numColorBits;
depthBits = numDepthBits;
puglview = nil; puglview = nil;
trackingArea = nil; trackingArea = nil;


@@ -132,9 +150,9 @@ puglDisplay(PuglView* view)
NSOpenGLPFADoubleBuffer, NSOpenGLPFADoubleBuffer,
NSOpenGLPFAAccelerated, NSOpenGLPFAAccelerated,
NSOpenGLPFAColorSize, NSOpenGLPFAColorSize,
colorBits,
8,
NSOpenGLPFADepthSize, NSOpenGLPFADepthSize,
depthBits,
8,
0 0
}; };


@@ -144,12 +162,13 @@ puglDisplay(PuglView* view)
if (pixelFormat) { if (pixelFormat) {
self = [super initWithFrame:frame pixelFormat:pixelFormat]; self = [super initWithFrame:frame pixelFormat:pixelFormat];
[pixelFormat release]; [pixelFormat release];
if (self) {
[[self openGLContext] makeCurrentContext];
[self reshape];
}
} else { } else {
self = nil;
self = [super initWithFrame:frame];
}

if (self) {
[[self openGLContext] makeCurrentContext];
[self reshape];
} }


return self; return self;
@@ -159,80 +178,102 @@ puglDisplay(PuglView* view)
{ {
[[self openGLContext] update]; [[self openGLContext] update];


NSRect bounds = [self bounds];
int width = bounds.size.width;
int height = bounds.size.height;

if (puglview) {
if (!puglview) {
/* NOTE: Apparently reshape gets called when the GC gets around to /* NOTE: Apparently reshape gets called when the GC gets around to
deleting the view (?), so we must have reset puglview to NULL when deleting the view (?), so we must have reset puglview to NULL when
this comes around. this comes around.
*/ */
if (puglview->reshapeFunc) {
puglview->reshapeFunc(puglview, width, height);
} else {
puglDefaultReshape(puglview, width, height);
}
return;
}

NSRect bounds = [self bounds];
int width = bounds.size.width;
int height = bounds.size.height;


puglview->width = width;
puglview->height = height;
if (puglview->reshapeFunc) {
puglview->reshapeFunc(puglview, width, height);
} else {
puglDefaultReshape(puglview, width, height);
} }

puglview->width = width;
puglview->height = height;
} }


- (void) drawRect:(NSRect)rect
- (void) drawRect:(NSRect)r
{ {
puglDisplay(puglview); puglDisplay(puglview);
glFlush(); glFlush();
glSwapAPPLE(); glSwapAPPLE();


// unused // unused
return; (void)rect;
return; (void)r;
} }


static unsigned
getModifiers(PuglView* view, NSEvent* ev)
- (void) cursorUpdate:(NSEvent*)e
{ {
const unsigned modifierFlags = [ev modifierFlags];
[[NSCursor arrowCursor] set];


view->event_timestamp_ms = fmod([ev timestamp] * 1000.0, UINT32_MAX);

unsigned mods = 0;
mods |= (modifierFlags & NSShiftKeyMask) ? PUGL_MOD_SHIFT : 0;
mods |= (modifierFlags & NSControlKeyMask) ? PUGL_MOD_CTRL : 0;
mods |= (modifierFlags & NSAlternateKeyMask) ? PUGL_MOD_ALT : 0;
mods |= (modifierFlags & NSCommandKeyMask) ? PUGL_MOD_SUPER : 0;
return mods;
// unused
return; (void)e;
} }


-(void)updateTrackingAreas
- (void) updateTrackingAreas
{ {
static const int opts = NSTrackingMouseEnteredAndExited
| NSTrackingMouseMoved
| NSTrackingEnabledDuringMouseDrag
| NSTrackingInVisibleRect
| NSTrackingActiveAlways
| NSTrackingCursorUpdate;

if (trackingArea != nil) { if (trackingArea != nil) {
[self removeTrackingArea:trackingArea]; [self removeTrackingArea:trackingArea];
[trackingArea release]; [trackingArea release];
} }


const int opts = (NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved |
NSTrackingActiveAlways);
trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds]
options:opts
owner:self
userInfo:nil];
trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:opts
owner:self
userInfo:nil];
[self addTrackingArea:trackingArea]; [self addTrackingArea:trackingArea];
[super updateTrackingAreas];
} }


- (void)mouseEntered:(NSEvent*)theEvent
- (void) viewWillMoveToWindow:(NSWindow*)newWindow
{ {
[self updateTrackingAreas];
if (newWindow != nil) {
[newWindow setAcceptsMouseMovedEvents:YES];
[newWindow makeFirstResponder:self];
}


// unused
return; (void)theEvent;
[super viewWillMoveToWindow:newWindow];
} }


- (void)mouseExited:(NSEvent*)theEvent
static unsigned
getModifiers(PuglView* view, NSEvent* ev)
{ {
// unused
return; (void)theEvent;
const unsigned modifierFlags = [ev modifierFlags];

view->event_timestamp_ms = fmod([ev timestamp] * 1000.0, UINT32_MAX);

unsigned mods = 0;
mods |= (modifierFlags & NSShiftKeyMask) ? PUGL_MOD_SHIFT : 0;
mods |= (modifierFlags & NSControlKeyMask) ? PUGL_MOD_CTRL : 0;
mods |= (modifierFlags & NSAlternateKeyMask) ? PUGL_MOD_ALT : 0;
mods |= (modifierFlags & NSCommandKeyMask) ? PUGL_MOD_SUPER : 0;
return mods;
}

static int
getFixedAppKitButton(NSInteger button)
{
switch (button) {
case 0: return 1;
case 1: return 3;
case 2: return 2;
default: return button;
}
} }


- (void) mouseMoved:(NSEvent*)event - (void) mouseMoved:(NSEvent*)event
@@ -240,63 +281,61 @@ getModifiers(PuglView* view, NSEvent* ev)
if (puglview->motionFunc) { if (puglview->motionFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event); puglview->mods = getModifiers(puglview, event);
puglview->motionFunc(puglview, loc.x, puglview->height - loc.y);
puglview->motionFunc(puglview, loc.x, loc.y);
} }
} }


- (void) mouseDragged:(NSEvent*)event - (void) mouseDragged:(NSEvent*)event
{ {
if (puglview->motionFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event);
puglview->motionFunc(puglview, loc.x, puglview->height - loc.y);
}
[self mouseMoved:event];
} }


- (void) rightMouseDragged:(NSEvent*)event - (void) rightMouseDragged:(NSEvent*)event
{ {
if (puglview->motionFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event);
puglview->motionFunc(puglview, loc.x, puglview->height - loc.y);
}
[self mouseDragged:event];
} }


- (void) mouseDown:(NSEvent*)event
- (void) otherMouseDragged:(NSEvent*)event
{ {
if (puglview->mouseFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event);
puglview->mouseFunc(puglview, 1, true, loc.x, puglview->height - loc.y);
}
[self mouseDragged:event];
} }


- (void) mouseUp:(NSEvent*)event
- (void) mouseDown:(NSEvent*)event
{ {
if (puglview->mouseFunc) { if (puglview->mouseFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event); puglview->mods = getModifiers(puglview, event);
puglview->mouseFunc(puglview, 1, false, loc.x, puglview->height - loc.y);
puglview->mouseFunc(puglview, getFixedAppKitButton([event buttonNumber]), true, loc.x, loc.y);
} }
[self updateTrackingAreas];
} }


- (void) rightMouseDown:(NSEvent*)event - (void) rightMouseDown:(NSEvent*)event
{
[self mouseDown:event];
}

- (void) otherMouseDown:(NSEvent*)event
{
[self mouseDown:event];
}

- (void) mouseUp:(NSEvent*)event
{ {
if (puglview->mouseFunc) { if (puglview->mouseFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event); puglview->mods = getModifiers(puglview, event);
puglview->mouseFunc(puglview, 3, true, loc.x, puglview->height - loc.y);
puglview->mouseFunc(puglview, getFixedAppKitButton([event buttonNumber]), false, loc.x, loc.y);
} }
} }


- (void) rightMouseUp:(NSEvent*)event - (void) rightMouseUp:(NSEvent*)event
{ {
if (puglview->mouseFunc) {
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event);
puglview->mouseFunc(puglview, 3, false, loc.x, puglview->height - loc.y);
}
[self mouseUp:event];
}

- (void) otherMouseUp:(NSEvent*)event
{
[self mouseUp:event];
} }


- (void) scrollWheel:(NSEvent*)event - (void) scrollWheel:(NSEvent*)event
@@ -305,10 +344,9 @@ getModifiers(PuglView* view, NSEvent* ev)
NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil];
puglview->mods = getModifiers(puglview, event); puglview->mods = getModifiers(puglview, event);
puglview->scrollFunc(puglview, puglview->scrollFunc(puglview,
loc.x, puglview->height - loc.y,
loc.x, loc.y,
[event deltaX], [event deltaY]); [event deltaX], [event deltaY]);
} }
[self updateTrackingAreas];
} }


- (void) keyDown:(NSEvent*)event - (void) keyDown:(NSEvent*)event
@@ -368,6 +406,11 @@ puglCreateWindow(PuglView* view, const char* title)
[NSApplication sharedApplication]; [NSApplication sharedApplication];


impl->glview = [PuglOpenGLView new]; impl->glview = [PuglOpenGLView new];

if (!impl->glview) {
return 1;
}
impl->glview->puglview = view; impl->glview->puglview = view;


if (view->resizable) { if (view->resizable) {


+ 1
- 1
distrho/src/DistrhoUILV2.cpp View File

@@ -59,7 +59,7 @@ public:
if (winId != 0) if (winId != 0)
return; return;


// if winId != 0 then options must not be null
// if winId == 0 then options must not be null
DISTRHO_SAFE_ASSERT_RETURN(options != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(options != nullptr,);


const LV2_URID uridWindowTitle(uridMap->map(uridMap->handle, LV2_UI__windowTitle)); const LV2_URID uridWindowTitle(uridMap->map(uridMap->handle, LV2_UI__windowTitle));


Loading…
Cancel
Save