@@ -8,8 +8,8 @@ include Makefile.mk | |||
# -------------------------------------------------------------- | |||
BUILD_C_FLAGS += $(DGL_FLAGS) -I. | |||
BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. | |||
BUILD_C_FLAGS += $(DGL_FLAGS) -I. -Isrc | |||
BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc | |||
LINK_FLAGS += $(DGL_LIBS) | |||
# -------------------------------------------------------------- | |||
@@ -15,6 +15,7 @@ | |||
*/ | |||
// we need this for now | |||
#define PUGL_HAVE_GL 1 | |||
#define PUGL_GRAB_FOCUS 1 | |||
#include "AppPrivateData.hpp" | |||
@@ -0,0 +1,121 @@ | |||
/* | |||
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, /**< 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 */ |
@@ -0,0 +1,217 @@ | |||
/* | |||
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_EVENT_H_INCLUDED | |||
#define PUGL_EVENT_H_INCLUDED | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#else | |||
# include <stdbool.h> | |||
#endif | |||
#include "pugl/common.h" | |||
/** | |||
@addtogroup pugl | |||
@{ | |||
*/ | |||
/** | |||
The type of a PuglEvent. | |||
*/ | |||
typedef enum { | |||
PUGL_BUTTON_PRESS, | |||
PUGL_BUTTON_RELEASE, | |||
PUGL_CONFIGURE, | |||
PUGL_EXPOSE, | |||
PUGL_KEY_PRESS, | |||
PUGL_KEY_RELEASE, | |||
PUGL_ENTER_NOTIFY, | |||
PUGL_LEAVE_NOTIFY, | |||
PUGL_MOTION_NOTIFY, | |||
PUGL_NOTHING, | |||
PUGL_SCROLL | |||
} PuglEventType; | |||
/** | |||
Reason for a PuglEventCrossing. | |||
*/ | |||
typedef enum { | |||
PUGL_CROSSING_NORMAL, /**< Crossing due to pointer motion. */ | |||
PUGL_CROSSING_GRAB, /**< Crossing due to a grab. */ | |||
PUGL_CROSSING_UNGRAB /**< Crossing due to a grab release. */ | |||
} PuglCrossingMode; | |||
/** | |||
Common header for all event structs. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< Event type. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
} PuglEventAny; | |||
/** | |||
Button press or release event. | |||
For event types PUGL_BUTTON_PRESS and PUGL_BUTTON_RELEASE. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_BUTTON_PRESS or PUGL_BUTTON_RELEASE. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
uint32_t time; /**< Time in milliseconds. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double x_root; /**< Root-relative X coordinate. */ | |||
double y_root; /**< Root-relative Y coordinate. */ | |||
unsigned state; /**< Bitwise OR of PuglMod flags. */ | |||
unsigned button; /**< 1-relative button number. */ | |||
} PuglEventButton; | |||
/** | |||
Configure event for when window size or position has changed. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_CONFIGURE. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
double x; /**< New parent-relative X coordinate. */ | |||
double y; /**< New parent-relative Y coordinate. */ | |||
double width; /**< New width. */ | |||
double height; /**< New height. */ | |||
} PuglEventConfigure; | |||
/** | |||
Expose event for when a region must be redrawn. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_EXPOSE. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double width; /**< Width of exposed region. */ | |||
double height; /**< Height of exposed region. */ | |||
int count; /**< Number of expose events to follow. */ | |||
} PuglEventExpose; | |||
/** | |||
Key press event. | |||
Keys that correspond to a Unicode character are expressed as a character | |||
code. For other keys, `character` will be 0 and `special` indicates the key | |||
pressed. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_KEY_PRESS or PUGL_KEY_RELEASE. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
uint32_t time; /**< Time in milliseconds. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double x_root; /**< Root-relative X coordinate. */ | |||
double y_root; /**< Root-relative Y coordinate. */ | |||
unsigned state; /**< Bitwise OR of PuglMod flags. */ | |||
uint32_t character; /**< Unicode character code, or 0. */ | |||
PuglKey special; /**< Special key, if character is 0. */ | |||
} PuglEventKey; | |||
/** | |||
Pointer crossing event (enter and leave). | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_ENTER_NOTIFY or PUGL_LEAVE_NOTIFY. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
uint32_t time; /**< Time in milliseconds. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double x_root; /**< Root-relative X coordinate. */ | |||
double y_root; /**< Root-relative Y coordinate. */ | |||
unsigned state; /**< Bitwise OR of PuglMod flags. */ | |||
PuglCrossingMode mode; /**< Reason for crossing. */ | |||
} PuglEventCrossing; | |||
/** | |||
Pointer motion event. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_MOTION_NOTIFY. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
uint32_t time; /**< Time in milliseconds. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double x_root; /**< Root-relative X coordinate. */ | |||
double y_root; /**< Root-relative Y coordinate. */ | |||
unsigned state; /**< Bitwise OR of PuglMod flags. */ | |||
bool is_hint; /**< True iff this event is a motion hint. */ | |||
bool focus; /**< True iff this is the focused window. */ | |||
} PuglEventMotion; | |||
/** | |||
Scroll event. | |||
The scroll distance is expressed in "lines", an arbitrary unit that | |||
corresponds to a single tick of a detented mouse wheel. For example, `dy` = | |||
1.0 scrolls 1 line up. Some systems and devices support finer resolution | |||
and/or higher values for fast scrolls, so programs should handle any value | |||
gracefully. | |||
*/ | |||
typedef struct { | |||
PuglEventType type; /**< PUGL_SCROLL. */ | |||
PuglView* view; /**< View that received this event. */ | |||
bool send_event; /**< True iff event was sent explicitly. */ | |||
uint32_t time; /**< Time in milliseconds. */ | |||
double x; /**< View-relative X coordinate. */ | |||
double y; /**< View-relative Y coordinate. */ | |||
double x_root; /**< Root-relative X coordinate. */ | |||
double y_root; /**< Root-relative Y coordinate. */ | |||
unsigned state; /**< Bitwise OR of PuglMod flags. */ | |||
double dx; /**< Scroll X distance in lines. */ | |||
double dy; /**< Scroll Y distance in lines. */ | |||
} PuglEventScroll; | |||
/** | |||
Interface event. | |||
This is a union of all event structs. The `type` must be checked to | |||
determine which fields are safe to access. A pointer to PuglEvent can | |||
either be cast to the appropriate type, or the union members used. | |||
*/ | |||
typedef union { | |||
PuglEventType type; /**< Event type. */ | |||
PuglEventAny any; /**< Valid for all event types. */ | |||
PuglEventButton button; /**< PUGL_BUTTON_PRESS, PUGL_BUTTON_RELEASE. */ | |||
PuglEventConfigure configure; /**< PUGL_CONFIGURE. */ | |||
PuglEventCrossing crossing; /**< PUGL_ENTER_NOTIFY, PUGL_LEAVE_NOTIFY. */ | |||
PuglEventExpose expose; /**< PUGL_EXPOSE. */ | |||
PuglEventKey key; /**< PUGL_KEY_PRESS, PUGL_KEY_RELEASE. */ | |||
PuglEventMotion motion; /**< PUGL_MOTION_NOTIFY. */ | |||
PuglEventScroll scroll; /**< PUGL_SCROLL. */ | |||
} PuglEvent; | |||
/** | |||
@} | |||
*/ | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif /* PUGL_EVENT_H_INCLUDED */ |
@@ -0,0 +1,32 @@ | |||
/* | |||
Copyright 2012-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. | |||
*/ | |||
/** | |||
@file gl.h Portable header wrapper for gl.h. | |||
Unfortunately, GL includes vary across platforms so this header allows for | |||
pure portable programs. | |||
*/ | |||
#ifdef __APPLE__ | |||
# include "OpenGL/gl.h" | |||
#else | |||
# ifdef _WIN32 | |||
# include <windows.h> /* Broken Windows GL headers require this */ | |||
# endif | |||
# include "GL/gl.h" | |||
#endif | |||
@@ -0,0 +1,32 @@ | |||
/* | |||
Copyright 2012-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. | |||
*/ | |||
/** | |||
@file gl.h Portable header wrapper for glu.h. | |||
Unfortunately, GL includes vary across platforms so this header allows for | |||
pure portable programs. | |||
*/ | |||
#ifdef __APPLE__ | |||
# include "OpenGL/glu.h" | |||
#else | |||
# ifdef _WIN32 | |||
# include <windows.h> /* Broken Windows GL headers require this */ | |||
# endif | |||
# include "GL/glu.h" | |||
#endif | |||
@@ -23,19 +23,8 @@ | |||
#include <stdint.h> | |||
/* | |||
This API is pure portable C and contains no platform specific elements, or | |||
even a GL dependency. However, unfortunately GL includes vary across | |||
platforms so they are included here to allow for pure portable programs. | |||
*/ | |||
#ifdef __APPLE__ | |||
# include "OpenGL/gl.h" | |||
#else | |||
# ifdef _WIN32 | |||
# include <windows.h> /* Broken Windows GL headers require this */ | |||
# endif | |||
# include "GL/gl.h" | |||
#endif | |||
#include "pugl/common.h" | |||
#include "pugl/event.h" | |||
#ifdef PUGL_SHARED | |||
# ifdef _WIN32 | |||
@@ -67,80 +56,9 @@ extern "C" { | |||
*/ | |||
/** | |||
An OpenGL 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. | |||
A function called when an event occurs. | |||
*/ | |||
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, /**< 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; | |||
typedef void (*PuglEventFunc)(PuglView* view, const PuglEvent* event); | |||
/** | |||
A function called when the window is closed. | |||
@@ -216,6 +134,12 @@ typedef void (*PuglScrollFunc)(PuglView* view, | |||
*/ | |||
typedef void (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); | |||
/** | |||
@name Initialization | |||
Configuration functions which must be called before creating a window. | |||
@{ | |||
*/ | |||
/** | |||
Create a Pugl context. | |||
@@ -246,6 +170,22 @@ puglInitWindowSize(PuglView* view, int width, int height); | |||
PUGL_API void | |||
puglInitResizable(PuglView* view, bool resizable); | |||
/** | |||
Set the context type before creating a window. | |||
*/ | |||
PUGL_API void | |||
puglInitContextType(PuglView* view, PuglContextType type); | |||
/** | |||
@} | |||
*/ | |||
/** | |||
@name Windows | |||
Window management functions. | |||
@{ | |||
*/ | |||
/** | |||
Create a window with the settings given by the various puglInit functions. | |||
@@ -266,6 +206,16 @@ puglShowWindow(PuglView* view); | |||
PUGL_API void | |||
puglHideWindow(PuglView* view); | |||
/** | |||
Return the native window handle. | |||
*/ | |||
PUGL_API PuglNativeWindow | |||
puglGetNativeWindow(PuglView* view); | |||
/** | |||
@} | |||
*/ | |||
/** | |||
Set the handle to be passed to all callbacks. | |||
@@ -284,6 +234,15 @@ puglSetHandle(PuglView* view, PuglHandle handle); | |||
PUGL_API PuglHandle | |||
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. | |||
*/ | |||
@@ -304,6 +263,18 @@ puglGetModifiers(PuglView* view); | |||
PUGL_API void | |||
puglIgnoreKeyRepeat(PuglView* view, bool ignore); | |||
/** | |||
@name Event Callbacks | |||
Functions to set event callbacks for handling user input. | |||
@{ | |||
*/ | |||
/** | |||
Set the function to call when an event occurs. | |||
*/ | |||
PUGL_API void | |||
puglSetEventFunc(PuglView* view, PuglEventFunc eventFunc); | |||
/** | |||
Set the function to call when the window is closed. | |||
*/ | |||
@@ -353,10 +324,14 @@ PUGL_API void | |||
puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc); | |||
/** | |||
Return the native window handle. | |||
@} | |||
*/ | |||
PUGL_API PuglNativeWindow | |||
puglGetNativeWindow(PuglView* view); | |||
/** | |||
Grab the input focus. | |||
*/ | |||
PUGL_API void | |||
puglGrabFocus(PuglView* view); | |||
/** | |||
Process all pending window events. | |||
@@ -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 | |||
purpose with or without fee is hereby granted, provided that the above | |||
@@ -24,11 +24,14 @@ | |||
If you are copying the pugl code into your source tree, the following | |||
symbols can be defined to tweak pugl behaviour: | |||
PUGL_HAVE_CAIRO: Include Cairo support code. | |||
PUGL_HAVE_GL: Include OpenGL support code. | |||
PUGL_GRAB_FOCUS: Work around reparent keyboard issues by grabbing focus. | |||
PUGL_VERBOSE: Print GL information to console. | |||
*/ | |||
#include "pugl.h" | |||
#include "pugl/pugl.h" | |||
#include "pugl/event.h" | |||
#ifdef PUGL_VERBOSE | |||
# include <stdio.h> | |||
@@ -43,6 +46,7 @@ typedef struct PuglInternalsImpl PuglInternals; | |||
struct PuglViewImpl { | |||
PuglHandle handle; | |||
PuglEventFunc eventFunc; | |||
PuglCloseFunc closeFunc; | |||
PuglDisplayFunc displayFunc; | |||
PuglKeyboardFunc keyboardFunc; | |||
@@ -55,6 +59,7 @@ struct PuglViewImpl { | |||
PuglInternals* impl; | |||
PuglNativeWindow parent; | |||
PuglContextType ctx_type; | |||
int width; | |||
int height; | |||
@@ -68,8 +73,6 @@ struct PuglViewImpl { | |||
PuglInternals* puglInitInternals(); | |||
void puglDefaultReshape(PuglView* view, int width, int height); | |||
PuglView* | |||
puglInit(int* pargc, char** argv) | |||
{ | |||
@@ -80,7 +83,7 @@ puglInit(int* pargc, char** argv) | |||
PuglInternals* impl = puglInitInternals(); | |||
if (!impl) { | |||
free(view); | |||
free(view); | |||
return NULL; | |||
} | |||
@@ -113,6 +116,12 @@ puglInitResizable(PuglView* view, bool resizable) | |||
view->resizable = resizable; | |||
} | |||
void | |||
puglInitContextType(PuglView* view, PuglContextType type) | |||
{ | |||
view->ctx_type = type; | |||
} | |||
void | |||
puglSetHandle(PuglView* view, PuglHandle handle) | |||
{ | |||
@@ -138,6 +147,12 @@ puglGetModifiers(PuglView* view) | |||
} | |||
void | |||
puglIgnoreKeyRepeat(PuglView* view, bool ignore) | |||
{ | |||
view->ignoreKeyRepeat = ignore; | |||
} | |||
static void | |||
puglDefaultReshape(PuglView* view, int width, int height) | |||
{ | |||
glMatrixMode(GL_PROJECTION); | |||
@@ -154,9 +169,9 @@ puglDefaultReshape(PuglView* view, int width, int height) | |||
} | |||
void | |||
puglIgnoreKeyRepeat(PuglView* view, bool ignore) | |||
puglSetEventFunc(PuglView* view, PuglEventFunc eventFunc) | |||
{ | |||
view->ignoreKeyRepeat = ignore; | |||
view->eventFunc = eventFunc; | |||
} | |||
void | |||
@@ -206,3 +221,81 @@ puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc) | |||
{ | |||
view->specialFunc = specialFunc; | |||
} | |||
void | |||
puglEnterContext(PuglView* view); | |||
void | |||
puglLeaveContext(PuglView* view, bool flush); | |||
static void | |||
puglDispatchEvent(PuglView* view, const PuglEvent* event) | |||
{ | |||
if (view->eventFunc) { | |||
view->eventFunc(view, event); | |||
} | |||
switch (event->type) { | |||
case PUGL_CONFIGURE: | |||
puglEnterContext(view); | |||
view->width = event->configure.width; | |||
view->height = event->configure.height; | |||
if (view->reshapeFunc) { | |||
view->reshapeFunc(view, view->width, view->height); | |||
} | |||
puglLeaveContext(view, false); | |||
break; | |||
case PUGL_EXPOSE: | |||
if (event->expose.count == 0) { | |||
puglEnterContext(view); | |||
if (view->displayFunc) { | |||
view->displayFunc(view); | |||
} | |||
view->redisplay = false; | |||
puglLeaveContext(view, true); | |||
} | |||
break; | |||
case PUGL_MOTION_NOTIFY: | |||
view->event_timestamp_ms = event->motion.time; | |||
view->mods = event->motion.state; | |||
if (view->motionFunc) { | |||
view->motionFunc(view, event->motion.x, event->motion.y); | |||
} | |||
break; | |||
case PUGL_SCROLL: | |||
if (view->scrollFunc) { | |||
view->scrollFunc(view, | |||
event->scroll.x, event->scroll.y, | |||
event->scroll.dx, event->scroll.dy); | |||
} | |||
break; | |||
case PUGL_BUTTON_PRESS: | |||
case PUGL_BUTTON_RELEASE: | |||
view->event_timestamp_ms = event->button.time; | |||
view->mods = event->button.state; | |||
if (view->mouseFunc) { | |||
view->mouseFunc(view, | |||
event->button.button, | |||
event->type == PUGL_BUTTON_PRESS, | |||
event->button.x, | |||
event->button.y); | |||
} | |||
break; | |||
case PUGL_KEY_PRESS: | |||
case PUGL_KEY_RELEASE: | |||
view->event_timestamp_ms = event->key.time; | |||
view->mods = event->key.state; | |||
if (event->key.special && view->specialFunc) { | |||
view->specialFunc(view, | |||
event->type == PUGL_KEY_PRESS, | |||
event->key.special); | |||
} else if (event->key.character && view->keyboardFunc) { | |||
view->keyboardFunc(view, | |||
event->type == PUGL_KEY_PRESS, | |||
event->key.character); | |||
} | |||
break; | |||
default: | |||
break; | |||
} | |||
} |
@@ -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 | |||
purpose with or without fee is hereby granted, provided that the above | |||
@@ -22,7 +22,7 @@ | |||
#import <Cocoa/Cocoa.h> | |||
#include "pugl_internal.h" | |||
#include "pugl/pugl_internal.h" | |||
@interface PuglWindow : NSWindow | |||
{ | |||
@@ -26,7 +26,7 @@ | |||
#include <stdlib.h> | |||
#include <time.h> | |||
#include "pugl_internal.h" | |||
#include "pugl/pugl_internal.h" | |||
#ifndef WM_MOUSEWHEEL | |||
# define WM_MOUSEWHEEL 0x020A | |||
@@ -1,5 +1,6 @@ | |||
/* | |||
Copyright 2012-2014 David Robillard <http://drobilla.net> | |||
Copyright 2013 Robin Gareus <robin@gareus.org> | |||
Copyright 2011-2012 Ben Loftis, Harrison Consoles | |||
Permission to use, copy, modify, and/or distribute this software for any | |||
@@ -23,20 +24,35 @@ | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <GL/gl.h> | |||
#include <GL/glx.h> | |||
#include <X11/Xatom.h> | |||
#include <X11/Xlib.h> | |||
#include <X11/Xutil.h> | |||
#include <X11/keysym.h> | |||
#include "pugl_internal.h" | |||
#ifdef PUGL_HAVE_GL | |||
#include <GL/gl.h> | |||
#include <GL/glx.h> | |||
#endif | |||
#ifdef PUGL_HAVE_CAIRO | |||
#include <cairo/cairo.h> | |||
#include <cairo/cairo-xlib.h> | |||
#endif | |||
#include "pugl/event.h" | |||
#include "pugl/pugl_internal.h" | |||
struct PuglInternalsImpl { | |||
Display* display; | |||
int screen; | |||
Window win; | |||
#ifdef PUGL_HAVE_CAIRO | |||
cairo_t* cr; | |||
#endif | |||
#ifdef PUGL_HAVE_GL | |||
GLXContext ctx; | |||
Bool doubleBuffered; | |||
#endif | |||
}; | |||
/** | |||