@@ -204,7 +204,6 @@ struct Window::PrivateData { | |||||
return; | return; | ||||
} | } | ||||
puglInitContextType(fView, PUGL_GL); | |||||
puglInitUserResizable(fView, fResizable); | puglInitUserResizable(fView, fResizable); | ||||
puglInitWindowSize(fView, static_cast<int>(fWidth), static_cast<int>(fHeight)); | puglInitWindowSize(fView, static_cast<int>(fWidth), static_cast<int>(fHeight)); | ||||
@@ -1,121 +0,0 @@ | |||||
/* | |||||
Copyright 2014 David Robillard <http://drobilla.net> | |||||
Permission to use, copy, modify, and/or distribute this software for any | |||||
purpose with or without fee is hereby granted, provided that the above | |||||
copyright notice and this permission notice appear in all copies. | |||||
THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||||
*/ | |||||
#ifndef PUGL_COMMON_H_INCLUDED | |||||
#define PUGL_COMMON_H_INCLUDED | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
/** | |||||
@addtogroup pugl | |||||
@{ | |||||
*/ | |||||
/** | |||||
A Pugl view. | |||||
*/ | |||||
typedef struct PuglViewImpl PuglView; | |||||
/** | |||||
A native window handle. | |||||
On X11, this is a Window. | |||||
On OSX, this is an NSView*. | |||||
On Windows, this is a HWND. | |||||
*/ | |||||
typedef intptr_t PuglNativeWindow; | |||||
/** | |||||
Handle for opaque user data. | |||||
*/ | |||||
typedef void* PuglHandle; | |||||
/** | |||||
Return status code. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_SUCCESS = 0 | |||||
} PuglStatus; | |||||
/** | |||||
Drawing context type. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_GL, | |||||
PUGL_CAIRO | |||||
} PuglContextType; | |||||
/** | |||||
Convenience symbols for ASCII control characters. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_CHAR_BACKSPACE = 0x08, | |||||
PUGL_CHAR_ESCAPE = 0x1B, | |||||
PUGL_CHAR_DELETE = 0x7F | |||||
} PuglChar; | |||||
/** | |||||
Keyboard modifier flags. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_MOD_SHIFT = 1 << 0, /**< Shift key */ | |||||
PUGL_MOD_CTRL = 1 << 1, /**< Control key */ | |||||
PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ | |||||
PUGL_MOD_SUPER = 1 << 3 /**< Mod4/Command/Windows key */ | |||||
} PuglMod; | |||||
/** | |||||
Special (non-Unicode) keyboard keys. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_KEY_F1 = 1, | |||||
PUGL_KEY_F2, | |||||
PUGL_KEY_F3, | |||||
PUGL_KEY_F4, | |||||
PUGL_KEY_F5, | |||||
PUGL_KEY_F6, | |||||
PUGL_KEY_F7, | |||||
PUGL_KEY_F8, | |||||
PUGL_KEY_F9, | |||||
PUGL_KEY_F10, | |||||
PUGL_KEY_F11, | |||||
PUGL_KEY_F12, | |||||
PUGL_KEY_LEFT, | |||||
PUGL_KEY_UP, | |||||
PUGL_KEY_RIGHT, | |||||
PUGL_KEY_DOWN, | |||||
PUGL_KEY_PAGE_UP, | |||||
PUGL_KEY_PAGE_DOWN, | |||||
PUGL_KEY_HOME, | |||||
PUGL_KEY_END, | |||||
PUGL_KEY_INSERT, | |||||
PUGL_KEY_SHIFT, | |||||
PUGL_KEY_CTRL, | |||||
PUGL_KEY_ALT, | |||||
PUGL_KEY_SUPER | |||||
} PuglKey; | |||||
/** | |||||
@} | |||||
*/ | |||||
#ifdef __cplusplus | |||||
} /* extern "C" */ | |||||
#endif | |||||
#endif /* PUGL_COMMON_H_INCLUDED */ |
@@ -23,8 +23,6 @@ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include "pugl/common.h" | |||||
/* | /* | ||||
This API is pure portable C and contains no platform specific elements, or | This API is pure portable C and contains no platform specific elements, or | ||||
even a GL dependency. However, unfortunately GL includes vary across | even a GL dependency. However, unfortunately GL includes vary across | ||||
@@ -57,6 +55,82 @@ extern "C" { | |||||
@{ | @{ | ||||
*/ | */ | ||||
/** | |||||
A Pugl view. | |||||
*/ | |||||
typedef struct PuglViewImpl PuglView; | |||||
/** | |||||
A native window handle. | |||||
On X11, this is a Window. | |||||
On OSX, this is an NSView*. | |||||
On Windows, this is a HWND. | |||||
*/ | |||||
typedef intptr_t PuglNativeWindow; | |||||
/** | |||||
Return status code. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_SUCCESS = 0 | |||||
} PuglStatus; | |||||
/** | |||||
Convenience symbols for ASCII control characters. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_CHAR_BACKSPACE = 0x08, | |||||
PUGL_CHAR_ESCAPE = 0x1B, | |||||
PUGL_CHAR_DELETE = 0x7F | |||||
} PuglChar; | |||||
/** | |||||
Special (non-Unicode) keyboard keys. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_KEY_F1 = 1, | |||||
PUGL_KEY_F2, | |||||
PUGL_KEY_F3, | |||||
PUGL_KEY_F4, | |||||
PUGL_KEY_F5, | |||||
PUGL_KEY_F6, | |||||
PUGL_KEY_F7, | |||||
PUGL_KEY_F8, | |||||
PUGL_KEY_F9, | |||||
PUGL_KEY_F10, | |||||
PUGL_KEY_F11, | |||||
PUGL_KEY_F12, | |||||
PUGL_KEY_LEFT, | |||||
PUGL_KEY_UP, | |||||
PUGL_KEY_RIGHT, | |||||
PUGL_KEY_DOWN, | |||||
PUGL_KEY_PAGE_UP, | |||||
PUGL_KEY_PAGE_DOWN, | |||||
PUGL_KEY_HOME, | |||||
PUGL_KEY_END, | |||||
PUGL_KEY_INSERT, | |||||
PUGL_KEY_SHIFT, | |||||
PUGL_KEY_CTRL, | |||||
PUGL_KEY_ALT, | |||||
PUGL_KEY_SUPER | |||||
} PuglKey; | |||||
/** | |||||
Keyboard modifier flags. | |||||
*/ | |||||
typedef enum { | |||||
PUGL_MOD_SHIFT = 1 << 0, /**< Shift key */ | |||||
PUGL_MOD_CTRL = 1 << 1, /**< Control key */ | |||||
PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ | |||||
PUGL_MOD_SUPER = 1 << 3 /**< Mod4/Command/Windows key */ | |||||
} PuglMod; | |||||
/** | |||||
Handle for opaque user data. | |||||
*/ | |||||
typedef void* PuglHandle; | |||||
/** | /** | ||||
A function called when the window is closed. | A function called when the window is closed. | ||||
*/ | */ | ||||
@@ -188,12 +262,6 @@ puglInitUserResizable(PuglView* view, bool resizable); | |||||
PUGL_API void | PUGL_API void | ||||
puglInitTransientFor(PuglView* view, uintptr_t parent); | puglInitTransientFor(PuglView* view, uintptr_t parent); | ||||
/** | |||||
Set the context type before creating a window. | |||||
*/ | |||||
PUGL_API void | |||||
puglInitContextType(PuglView* view, PuglContextType type); | |||||
/** | /** | ||||
@} | @} | ||||
*/ | */ | ||||
@@ -252,15 +320,6 @@ puglSetHandle(PuglView* view, PuglHandle handle); | |||||
PUGL_API PuglHandle | PUGL_API PuglHandle | ||||
puglGetHandle(PuglView* view); | puglGetHandle(PuglView* view); | ||||
/** | |||||
Get the drawing context. | |||||
For PUGL_GL contexts, this is unused and returns NULL. | |||||
For PUGL_CAIRO contexts, this returns a pointer to a cairo_t. | |||||
*/ | |||||
PUGL_API void* | |||||
puglGetContext(PuglView* view); | |||||
/** | /** | ||||
Return the timestamp (if any) of the currently-processing event. | Return the timestamp (if any) of the currently-processing event. | ||||
*/ | */ | ||||
@@ -58,7 +58,6 @@ struct PuglViewImpl { | |||||
PuglInternals* impl; | PuglInternals* impl; | ||||
PuglNativeWindow parent; | PuglNativeWindow parent; | ||||
PuglContextType ctx_type; | |||||
uintptr_t transient_parent; | uintptr_t transient_parent; | ||||
int width; | int width; | ||||
@@ -128,12 +127,6 @@ puglInitTransientFor(PuglView* view, uintptr_t parent) | |||||
view->transient_parent = parent; | view->transient_parent = parent; | ||||
} | } | ||||
void | |||||
puglInitContextType(PuglView* view, PuglContextType type) | |||||
{ | |||||
view->ctx_type = type; | |||||
} | |||||
void | void | ||||
puglSetHandle(PuglView* view, PuglHandle handle) | puglSetHandle(PuglView* view, PuglHandle handle) | ||||
{ | { | ||||
@@ -427,18 +427,13 @@ puglInitInternals() | |||||
void | void | ||||
puglEnterContext(PuglView* view) | puglEnterContext(PuglView* view) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
[[view->impl->glview openGLContext] makeCurrentContext]; | |||||
} | |||||
#endif | |||||
[[view->impl->glview openGLContext] makeCurrentContext]; | |||||
} | } | ||||
void | void | ||||
puglLeaveContext(PuglView* view, bool flush) | puglLeaveContext(PuglView* view, bool flush) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL && flush) { | |||||
if (flush) { | |||||
if (view->impl->glview->doubleBuffered) { | if (view->impl->glview->doubleBuffered) { | ||||
[[view->impl->glview openGLContext] flushBuffer]; | [[view->impl->glview openGLContext] flushBuffer]; | ||||
} else { | } else { | ||||
@@ -446,7 +441,6 @@ puglLeaveContext(PuglView* view, bool flush) | |||||
} | } | ||||
//[NSOpenGLContext clearCurrentContext]; | //[NSOpenGLContext clearCurrentContext]; | ||||
} | } | ||||
#endif | |||||
} | } | ||||
int | int | ||||
@@ -565,12 +559,3 @@ puglGetNativeWindow(PuglView* view) | |||||
{ | { | ||||
return (PuglNativeWindow)view->impl->glview; | return (PuglNativeWindow)view->impl->glview; | ||||
} | } | ||||
void* | |||||
puglGetContext(PuglView* view) | |||||
{ | |||||
return NULL; | |||||
// unused | |||||
(void)view; | |||||
} |
@@ -76,25 +76,17 @@ puglInitInternals() | |||||
void | void | ||||
puglEnterContext(PuglView* view) | puglEnterContext(PuglView* view) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
wglMakeCurrent(view->impl->hdc, view->impl->hglrc); | wglMakeCurrent(view->impl->hdc, view->impl->hglrc); | ||||
} | |||||
#endif | |||||
} | } | ||||
void | void | ||||
puglLeaveContext(PuglView* view, bool flush) | puglLeaveContext(PuglView* view, bool flush) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
if (flush) { | if (flush) { | ||||
glFlush(); | glFlush(); | ||||
SwapBuffers(view->impl->hdc); | SwapBuffers(view->impl->hdc); | ||||
} | } | ||||
wglMakeCurrent(NULL, NULL); | wglMakeCurrent(NULL, NULL); | ||||
} | |||||
#endif | |||||
} | } | ||||
int | int | ||||
@@ -476,14 +468,3 @@ 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; | |||||
} |
@@ -29,15 +29,8 @@ | |||||
#include <X11/Xutil.h> | #include <X11/Xutil.h> | ||||
#include <X11/keysym.h> | #include <X11/keysym.h> | ||||
#ifdef PUGL_HAVE_GL | |||||
#include <GL/gl.h> | #include <GL/gl.h> | ||||
#include <GL/glx.h> | #include <GL/glx.h> | ||||
#endif | |||||
#ifdef PUGL_HAVE_CAIRO | |||||
#include <cairo/cairo.h> | |||||
#include <cairo/cairo-xlib.h> | |||||
#endif | |||||
#include "pugl/pugl_internal.h" | #include "pugl/pugl_internal.h" | ||||
@@ -53,14 +46,8 @@ struct PuglInternalsImpl { | |||||
Window win; | Window win; | ||||
XIM xim; | XIM xim; | ||||
XIC xic; | XIC xic; | ||||
#ifdef PUGL_HAVE_CAIRO | |||||
cairo_t* cr; | |||||
cairo_surface_t* surface; | |||||
#endif | |||||
#ifdef PUGL_HAVE_GL | |||||
GLXContext ctx; | GLXContext ctx; | ||||
Bool doubleBuffered; | Bool doubleBuffered; | ||||
#endif | |||||
}; | }; | ||||
PuglInternals* | PuglInternals* | ||||
@@ -75,8 +62,6 @@ getVisual(PuglView* view) | |||||
PuglInternals* const impl = view->impl; | PuglInternals* const impl = view->impl; | ||||
XVisualInfo* vi = NULL; | XVisualInfo* vi = NULL; | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
/** | /** | ||||
Attributes for single-buffered RGBA with at least | Attributes for single-buffered RGBA with at least | ||||
4 bits per color and a 16 bit depth buffer. | 4 bits per color and a 16 bit depth buffer. | ||||
@@ -137,16 +122,6 @@ getVisual(PuglView* view) | |||||
impl->doubleBuffered = False; | impl->doubleBuffered = False; | ||||
PUGL_LOG("singlebuffered rendering will be used, no doublebuffering available\n"); | PUGL_LOG("singlebuffered rendering will be used, no doublebuffering available\n"); | ||||
} | } | ||||
} | |||||
#endif | |||||
#ifdef PUGL_HAVE_CAIRO | |||||
if (view->ctx_type == PUGL_CAIRO) { | |||||
XVisualInfo pat; | |||||
int n; | |||||
pat.screen = impl->screen; | |||||
vi = XGetVisualInfo(impl->display, VisualScreenMask, &pat, &n); | |||||
} | |||||
#endif | |||||
return vi; | return vi; | ||||
} | } | ||||
@@ -156,32 +131,8 @@ createContext(PuglView* view, XVisualInfo* vi) | |||||
{ | { | ||||
PuglInternals* const impl = view->impl; | PuglInternals* const impl = view->impl; | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE); | impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE); | ||||
return (impl->ctx != NULL); | return (impl->ctx != NULL); | ||||
} | |||||
#endif | |||||
#ifdef PUGL_HAVE_CAIRO | |||||
if (view->ctx_type == PUGL_CAIRO) { | |||||
impl->surface = cairo_xlib_surface_create( | |||||
impl->display, impl->win, vi->visual, view->width, view->height); | |||||
if (impl->surface == NULL) { | |||||
PUGL_LOG("failed to create cairo surface\n"); | |||||
return false; | |||||
} | |||||
impl->cr = cairo_create(impl->surface); | |||||
if (impl->cr == NULL) { | |||||
cairo_surface_destroy(impl->surface); | |||||
impl->surface = NULL; | |||||
PUGL_LOG("failed to create cairo context\n"); | |||||
return false; | |||||
} | |||||
return true; | |||||
} | |||||
#endif | |||||
return false; | |||||
} | } | ||||
static void | static void | ||||
@@ -189,38 +140,19 @@ destroyContext(PuglView* view) | |||||
{ | { | ||||
PuglInternals* const impl = view->impl; | PuglInternals* const impl = view->impl; | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
glXDestroyContext(impl->display, impl->ctx); | glXDestroyContext(impl->display, impl->ctx); | ||||
impl->ctx = NULL; | impl->ctx = NULL; | ||||
} | |||||
#endif | |||||
#ifdef PUGL_HAVE_CAIRO | |||||
if (view->ctx_type == PUGL_CAIRO) { | |||||
cairo_destroy(impl->cr); | |||||
impl->cr = NULL; | |||||
cairo_surface_destroy(impl->surface); | |||||
impl->surface = NULL; | |||||
} | |||||
#endif | |||||
} | } | ||||
void | void | ||||
puglEnterContext(PuglView* view) | puglEnterContext(PuglView* view) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx); | glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx); | ||||
} | |||||
#endif | |||||
} | } | ||||
void | void | ||||
puglLeaveContext(PuglView* view, bool flush) | puglLeaveContext(PuglView* view, bool flush) | ||||
{ | { | ||||
#ifdef PUGL_HAVE_GL | |||||
if (view->ctx_type == PUGL_GL) { | |||||
if (flush) { | if (flush) { | ||||
glFlush(); | glFlush(); | ||||
if (view->impl->doubleBuffered) { | if (view->impl->doubleBuffered) { | ||||
@@ -228,8 +160,6 @@ puglLeaveContext(PuglView* view, bool flush) | |||||
} | } | ||||
} | } | ||||
glXMakeCurrent(view->impl->display, None, NULL); | glXMakeCurrent(view->impl->display, None, NULL); | ||||
} | |||||
#endif | |||||
} | } | ||||
int | int | ||||
@@ -247,11 +177,9 @@ puglCreateWindow(PuglView* view, const char* title) | |||||
return 1; | return 1; | ||||
} | } | ||||
#ifdef PUGL_HAVE_GL | |||||
int glxMajor, glxMinor; | int glxMajor, glxMinor; | ||||
glXQueryVersion(impl->display, &glxMajor, &glxMinor); | glXQueryVersion(impl->display, &glxMajor, &glxMinor); | ||||
PUGL_LOGF("GLX Version %d.%d\n", glxMajor, glxMinor); | PUGL_LOGF("GLX Version %d.%d\n", glxMajor, glxMinor); | ||||
#endif | |||||
Window xParent = view->parent | Window xParent = view->parent | ||||
? (Window)view->parent | ? (Window)view->parent | ||||
@@ -620,17 +548,3 @@ puglGetNativeWindow(PuglView* view) | |||||
{ | { | ||||
return view->impl->win; | return view->impl->win; | ||||
} | } | ||||
void* | |||||
puglGetContext(PuglView* view) | |||||
{ | |||||
#ifdef PUGL_HAVE_CAIRO | |||||
if (view->ctx_type == PUGL_CAIRO) { | |||||
return view->impl->cr; | |||||
} | |||||
#endif | |||||
return NULL; | |||||
// may be unused | |||||
(void)view; | |||||
} |