Browse Source

Continue updating pugl, OSX context fixes

gh-pages
falkTX 10 years ago
parent
commit
4dbfbb043e
3 changed files with 121 additions and 42 deletions
  1. +42
    -12
      dgl/src/pugl/pugl_osx.m
  2. +76
    -23
      dgl/src/pugl/pugl_win.cpp
  3. +3
    -7
      dgl/src/pugl/pugl_x11.c

+ 42
- 12
dgl/src/pugl/pugl_osx.m View File

@@ -187,12 +187,9 @@ puglDisplay(PuglView* view)
printf("Is doubleBuffered? FALSE\n"); printf("Is doubleBuffered? FALSE\n");
} }


if (self) {
NSOpenGLContext* context = [self openGLContext];
[context makeCurrentContext];

if (self) {
GLint swapInterval = 1; GLint swapInterval = 1;
[context setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
[[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];


[self reshape]; [self reshape];
} }
@@ -216,26 +213,25 @@ puglDisplay(PuglView* view)
int width = bounds.size.width; int width = bounds.size.width;
int height = bounds.size.height; int height = bounds.size.height;


puglEnterContext(puglview);

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


puglLeaveContext(puglview, false);

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


- (void) drawRect:(NSRect)r - (void) drawRect:(NSRect)r
{ {
puglEnterContext(puglview);
puglDisplay(puglview); puglDisplay(puglview);

if (doubleBuffered) {
[[self openGLContext] flushBuffer];
} else {
glFlush();
//glSwapAPPLE();
}
puglLeaveContext(puglview, true);


// unused // unused
return; (void)r; return; (void)r;
@@ -428,6 +424,34 @@ puglInitInternals()
return (PuglInternals*)calloc(1, sizeof(PuglInternals)); return (PuglInternals*)calloc(1, sizeof(PuglInternals));
} }


void
puglEnterContext(PuglView* view)
{
#ifdef PUGL_HAVE_GL
if (view->ctx_type == PUGL_GL) {
[[view->impl->glview openGLContext] makeCurrentContext];
}
#endif
}

void
puglLeaveContext(PuglView* view, bool flush)
{
#ifdef PUGL_HAVE_GL
if (view->ctx_type == PUGL_GL) {
if (flush) {
if (view->impl->glview->doubleBuffered) {
[[view->impl->glview openGLContext] flushBuffer];
} else {
glFlush();
}
}

[NSOpenGLContext clearCurrentContext];
}
#endif
}

int int
puglCreateWindow(PuglView* view, const char* title) puglCreateWindow(PuglView* view, const char* title)
{ {
@@ -544,3 +568,9 @@ puglGetNativeWindow(PuglView* view)
{ {
return (PuglNativeWindow)view->impl->glview; return (PuglNativeWindow)view->impl->glview;
} }

void*
puglGetContext(PuglView* view)
{
return NULL;
}

+ 76
- 23
dgl/src/pugl/pugl_win.cpp View File

@@ -1,5 +1,5 @@
/* /*
Copyright 2012 David Robillard <http://drobilla.net>
Copyright 2012-2014 David Robillard <http://drobilla.net>


Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above
@@ -26,7 +26,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>


#include "pugl_internal.h"
#include "pugl/pugl_internal.h"


#ifndef WM_MOUSEWHEEL #ifndef WM_MOUSEWHEEL
# define WM_MOUSEWHEEL 0x020A # define WM_MOUSEWHEEL 0x020A
@@ -37,8 +37,11 @@
#ifndef WHEEL_DELTA #ifndef WHEEL_DELTA
# define WHEEL_DELTA 120 # define WHEEL_DELTA 120
#endif #endif
#ifndef GWLP_USERDATA
# define GWLP_USERDATA (-21)
#endif


const int LOCAL_CLOSE_MSG = WM_USER + 50;
#define PUGL_LOCAL_CLOSE_MSG (WM_USER + 50)


HINSTANCE hInstance = NULL; HINSTANCE hInstance = NULL;


@@ -69,6 +72,27 @@ puglInitInternals()
return (PuglInternals*)calloc(1, sizeof(PuglInternals)); return (PuglInternals*)calloc(1, sizeof(PuglInternals));
} }


void
puglEnterContext(PuglView* view)
{
#ifdef PUGL_HAVE_GL
if (view->ctx_type == PUGL_GL) {
wglMakeCurrent(view->impl->hdc, view->impl->hglrc);
}
#endif
}

void
puglLeaveContext(PuglView* view, bool flush)
{
#ifdef PUGL_HAVE_GL
if (view->ctx_type == PUGL_GL && flush) {
glFlush();
SwapBuffers(view->impl->hdc);
}
#endif
}

int int
puglCreateWindow(PuglView* view, const char* title) puglCreateWindow(PuglView* view, const char* title)
{ {
@@ -104,8 +128,19 @@ puglCreateWindow(PuglView* view, const char* title)
return 1; return 1;
} }


// Adjust the overall window size to accomodate our requested client size
const int winFlags = WS_POPUPWINDOW | WS_CAPTION | (view->resizable ? WS_SIZEBOX : 0x0);
int winFlags = WS_POPUPWINDOW | WS_CAPTION;
if (view->resizable) {
winFlags |= WS_SIZEBOX;
if (view->min_width > 0 && view->min_height > 0) {
// Adjust the minimum window size to accomodate requested view size
RECT mr = { 0, 0, view->min_width, view->min_height };
AdjustWindowRectEx(&mr, view->parent ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST);
view->min_width = mr.right - mr.left;
view->min_height = wr.bottom - mr.top;
}
}

// Adjust the window size to accomodate requested view size
RECT wr = { 0, 0, view->width, view->height }; RECT wr = { 0, 0, view->width, view->height };
AdjustWindowRectEx(&wr, view->parent ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); AdjustWindowRectEx(&wr, view->parent ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST);


@@ -152,25 +187,19 @@ puglCreateWindow(PuglView* view, const char* title)
return 1; return 1;
} }


wglMakeCurrent(impl->hdc, impl->hglrc);

return 0;
return PUGL_SUCCESS;
} }


void void
puglShowWindow(PuglView* view) puglShowWindow(PuglView* view)
{ {
PuglInternals* impl = view->impl;

ShowWindow(impl->hwnd, SW_SHOWNORMAL);
ShowWindow(view->impl->hwnd, SW_SHOWNORMAL);
} }


void void
puglHideWindow(PuglView* view) puglHideWindow(PuglView* view)
{ {
PuglInternals* impl = view->impl;

ShowWindow(impl->hwnd, SW_HIDE);
ShowWindow(view->impl->hwnd, SW_HIDE);
} }


void void
@@ -189,7 +218,7 @@ puglDestroy(PuglView* view)
static void static void
puglReshape(PuglView* view, int width, int height) puglReshape(PuglView* view, int width, int height)
{ {
wglMakeCurrent(view->impl->hdc, view->impl->hglrc);
puglEnterContext(view);


if (view->reshapeFunc) { if (view->reshapeFunc) {
view->reshapeFunc(view, width, height); view->reshapeFunc(view, width, height);
@@ -204,15 +233,14 @@ puglReshape(PuglView* view, int width, int height)
static void static void
puglDisplay(PuglView* view) puglDisplay(PuglView* view)
{ {
wglMakeCurrent(view->impl->hdc, view->impl->hglrc);
puglEnterContext(view);


view->redisplay = false; view->redisplay = false;
if (view->displayFunc) { if (view->displayFunc) {
view->displayFunc(view); view->displayFunc(view);
} }


glFlush();
SwapBuffers(view->impl->hdc);
puglLeaveContext(view, true);
} }


static PuglKey static PuglKey
@@ -282,18 +310,24 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
PuglKey key; PuglKey key;
RECT rect;
MINMAXINFO* mmi;


setModifiers(view); setModifiers(view);
switch (message) { switch (message) {
case WM_CREATE: case WM_CREATE:
case WM_SHOWWINDOW: case WM_SHOWWINDOW:
case WM_SIZE: case WM_SIZE:
RECT rect;
GetClientRect(view->impl->hwnd, &rect); GetClientRect(view->impl->hwnd, &rect);
puglReshape(view, rect.right, rect.bottom); puglReshape(view, rect.right, rect.bottom);
view->width = rect.right; view->width = rect.right;
view->height = rect.bottom; view->height = rect.bottom;
break; break;
case WM_GETMINMAXINFO:
mmi = (MINMAXINFO*)lParam;
mmi->ptMinTrackSize.x = view->min_width;
mmi->ptMinTrackSize.y = view->min_height;
break;
case WM_PAINT: case WM_PAINT:
BeginPaint(view->impl->hwnd, &ps); BeginPaint(view->impl->hwnd, &ps);
puglDisplay(view); puglDisplay(view);
@@ -301,6 +335,7 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
break; break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
if (view->motionFunc) { if (view->motionFunc) {
view->event_timestamp_ms = GetMessageTime();
view->motionFunc(view, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); view->motionFunc(view, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
} }
break; break;
@@ -329,7 +364,7 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
ScreenToClient(view->impl->hwnd, &pt); ScreenToClient(view->impl->hwnd, &pt);
view->scrollFunc( view->scrollFunc(
view, pt.x, pt.y, view, pt.x, pt.y,
0, GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA);
0.0f, GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA);
} }
break; break;
case WM_MOUSEHWHEEL: case WM_MOUSEHWHEEL:
@@ -339,7 +374,7 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
ScreenToClient(view->impl->hwnd, &pt); ScreenToClient(view->impl->hwnd, &pt);
view->scrollFunc( view->scrollFunc(
view, pt.x, pt.y, view, pt.x, pt.y,
GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0);
GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f);
} }
break; break;
case WM_KEYDOWN: case WM_KEYDOWN:
@@ -364,9 +399,10 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_QUIT: case WM_QUIT:
case LOCAL_CLOSE_MSG:
case PUGL_LOCAL_CLOSE_MSG:
if (view->closeFunc) { if (view->closeFunc) {
view->closeFunc(view); view->closeFunc(view);
view->redisplay = false;
} }
break; break;
default: default:
@@ -377,6 +413,12 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam)
return 0; return 0;
} }


void
puglGrabFocus(PuglView* view)
{
// TODO
}

PuglStatus PuglStatus
puglProcessEvents(PuglView* view) puglProcessEvents(PuglView* view)
{ {
@@ -402,7 +444,7 @@ wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
PostMessage(hwnd, WM_SHOWWINDOW, TRUE, 0); PostMessage(hwnd, WM_SHOWWINDOW, TRUE, 0);
return 0; return 0;
case WM_CLOSE: case WM_CLOSE:
PostMessage(hwnd, LOCAL_CLOSE_MSG, wParam, lParam);
PostMessage(hwnd, PUGL_LOCAL_CLOSE_MSG, wParam, lParam);
return 0; return 0;
case WM_DESTROY: case WM_DESTROY:
return 0; return 0;
@@ -426,3 +468,14 @@ puglGetNativeWindow(PuglView* view)
{ {
return (PuglNativeWindow)view->impl->hwnd; return (PuglNativeWindow)view->impl->hwnd;
} }

void*
puglGetContext(PuglView* view)
{
#ifdef PUGL_HAVE_CAIRO
if (view->ctx_type == PUGL_CAIRO) {
// TODO
}
#endif
return NULL;
}

+ 3
- 7
dgl/src/pugl/pugl_x11.c View File

@@ -348,7 +348,7 @@ puglDestroy(PuglView* view)
static void static void
puglReshape(PuglView* view, int width, int height) puglReshape(PuglView* view, int width, int height)
{ {
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx);
puglEnterContext(view);


if (view->reshapeFunc) { if (view->reshapeFunc) {
view->reshapeFunc(view, width, height); view->reshapeFunc(view, width, height);
@@ -363,7 +363,7 @@ puglReshape(PuglView* view, int width, int height)
static void static void
puglDisplay(PuglView* view) puglDisplay(PuglView* view)
{ {
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx);
puglEnterContext(view);


view->redisplay = false; view->redisplay = false;


@@ -371,11 +371,7 @@ puglDisplay(PuglView* view)
view->displayFunc(view); view->displayFunc(view);
} }


glFlush();

if (view->impl->doubleBuffered) {
glXSwapBuffers(view->impl->display, view->impl->win);
}
puglLeaveContext(view);
} }


static PuglKey static PuglKey


Loading…
Cancel
Save