@@ -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) | LINK_FLAGS += $(DGL_LIBS) | ||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
@@ -15,6 +15,7 @@ | |||||
*/ | */ | ||||
// we need this for now | // we need this for now | ||||
#define PUGL_HAVE_GL 1 | |||||
#define PUGL_GRAB_FOCUS 1 | #define PUGL_GRAB_FOCUS 1 | ||||
#include "AppPrivateData.hpp" | #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> | #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 PUGL_SHARED | ||||
# ifdef _WIN32 | # 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. | 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); | 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. | Create a Pugl context. | ||||
@@ -246,6 +170,22 @@ puglInitWindowSize(PuglView* view, int width, int height); | |||||
PUGL_API void | PUGL_API void | ||||
puglInitResizable(PuglView* view, bool resizable); | 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. | Create a window with the settings given by the various puglInit functions. | ||||
@@ -266,6 +206,16 @@ puglShowWindow(PuglView* view); | |||||
PUGL_API void | PUGL_API void | ||||
puglHideWindow(PuglView* view); | puglHideWindow(PuglView* view); | ||||
/** | |||||
Return the native window handle. | |||||
*/ | |||||
PUGL_API PuglNativeWindow | |||||
puglGetNativeWindow(PuglView* view); | |||||
/** | |||||
@} | |||||
*/ | |||||
/** | /** | ||||
Set the handle to be passed to all callbacks. | Set the handle to be passed to all callbacks. | ||||
@@ -284,6 +234,15 @@ 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. | ||||
*/ | */ | ||||
@@ -304,6 +263,18 @@ puglGetModifiers(PuglView* view); | |||||
PUGL_API void | PUGL_API void | ||||
puglIgnoreKeyRepeat(PuglView* view, bool ignore); | 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. | Set the function to call when the window is closed. | ||||
*/ | */ | ||||
@@ -353,10 +324,14 @@ PUGL_API void | |||||
puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc); | 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. | 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 | 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 | ||||
@@ -24,11 +24,14 @@ | |||||
If you are copying the pugl code into your source tree, the following | If you are copying the pugl code into your source tree, the following | ||||
symbols can be defined to tweak pugl behaviour: | 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_GRAB_FOCUS: Work around reparent keyboard issues by grabbing focus. | ||||
PUGL_VERBOSE: Print GL information to console. | PUGL_VERBOSE: Print GL information to console. | ||||
*/ | */ | ||||
#include "pugl.h" | |||||
#include "pugl/pugl.h" | |||||
#include "pugl/event.h" | |||||
#ifdef PUGL_VERBOSE | #ifdef PUGL_VERBOSE | ||||
# include <stdio.h> | # include <stdio.h> | ||||
@@ -43,6 +46,7 @@ typedef struct PuglInternalsImpl PuglInternals; | |||||
struct PuglViewImpl { | struct PuglViewImpl { | ||||
PuglHandle handle; | PuglHandle handle; | ||||
PuglEventFunc eventFunc; | |||||
PuglCloseFunc closeFunc; | PuglCloseFunc closeFunc; | ||||
PuglDisplayFunc displayFunc; | PuglDisplayFunc displayFunc; | ||||
PuglKeyboardFunc keyboardFunc; | PuglKeyboardFunc keyboardFunc; | ||||
@@ -55,6 +59,7 @@ struct PuglViewImpl { | |||||
PuglInternals* impl; | PuglInternals* impl; | ||||
PuglNativeWindow parent; | PuglNativeWindow parent; | ||||
PuglContextType ctx_type; | |||||
int width; | int width; | ||||
int height; | int height; | ||||
@@ -68,8 +73,6 @@ struct PuglViewImpl { | |||||
PuglInternals* puglInitInternals(); | PuglInternals* puglInitInternals(); | ||||
void puglDefaultReshape(PuglView* view, int width, int height); | |||||
PuglView* | PuglView* | ||||
puglInit(int* pargc, char** argv) | puglInit(int* pargc, char** argv) | ||||
{ | { | ||||
@@ -80,7 +83,7 @@ puglInit(int* pargc, char** argv) | |||||
PuglInternals* impl = puglInitInternals(); | PuglInternals* impl = puglInitInternals(); | ||||
if (!impl) { | if (!impl) { | ||||
free(view); | |||||
free(view); | |||||
return NULL; | return NULL; | ||||
} | } | ||||
@@ -113,6 +116,12 @@ puglInitResizable(PuglView* view, bool resizable) | |||||
view->resizable = resizable; | view->resizable = resizable; | ||||
} | } | ||||
void | |||||
puglInitContextType(PuglView* view, PuglContextType type) | |||||
{ | |||||
view->ctx_type = type; | |||||
} | |||||
void | void | ||||
puglSetHandle(PuglView* view, PuglHandle handle) | puglSetHandle(PuglView* view, PuglHandle handle) | ||||
{ | { | ||||
@@ -138,6 +147,12 @@ puglGetModifiers(PuglView* view) | |||||
} | } | ||||
void | void | ||||
puglIgnoreKeyRepeat(PuglView* view, bool ignore) | |||||
{ | |||||
view->ignoreKeyRepeat = ignore; | |||||
} | |||||
static void | |||||
puglDefaultReshape(PuglView* view, int width, int height) | puglDefaultReshape(PuglView* view, int width, int height) | ||||
{ | { | ||||
glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
@@ -154,9 +169,9 @@ puglDefaultReshape(PuglView* view, int width, int height) | |||||
} | } | ||||
void | void | ||||
puglIgnoreKeyRepeat(PuglView* view, bool ignore) | |||||
puglSetEventFunc(PuglView* view, PuglEventFunc eventFunc) | |||||
{ | { | ||||
view->ignoreKeyRepeat = ignore; | |||||
view->eventFunc = eventFunc; | |||||
} | } | ||||
void | void | ||||
@@ -206,3 +221,81 @@ puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc) | |||||
{ | { | ||||
view->specialFunc = 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 | 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 | ||||
@@ -22,7 +22,7 @@ | |||||
#import <Cocoa/Cocoa.h> | #import <Cocoa/Cocoa.h> | ||||
#include "pugl_internal.h" | |||||
#include "pugl/pugl_internal.h" | |||||
@interface PuglWindow : NSWindow | @interface PuglWindow : NSWindow | ||||
{ | { | ||||
@@ -26,7 +26,7 @@ | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <time.h> | #include <time.h> | ||||
#include "pugl_internal.h" | |||||
#include "pugl/pugl_internal.h" | |||||
#ifndef WM_MOUSEWHEEL | #ifndef WM_MOUSEWHEEL | ||||
# define WM_MOUSEWHEEL 0x020A | # define WM_MOUSEWHEEL 0x020A | ||||
@@ -1,5 +1,6 @@ | |||||
/* | /* | ||||
Copyright 2012-2014 David Robillard <http://drobilla.net> | Copyright 2012-2014 David Robillard <http://drobilla.net> | ||||
Copyright 2013 Robin Gareus <robin@gareus.org> | |||||
Copyright 2011-2012 Ben Loftis, Harrison Consoles | Copyright 2011-2012 Ben Loftis, Harrison Consoles | ||||
Permission to use, copy, modify, and/or distribute this software for any | Permission to use, copy, modify, and/or distribute this software for any | ||||
@@ -23,20 +24,35 @@ | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <GL/gl.h> | |||||
#include <GL/glx.h> | |||||
#include <X11/Xatom.h> | #include <X11/Xatom.h> | ||||
#include <X11/Xlib.h> | #include <X11/Xlib.h> | ||||
#include <X11/Xutil.h> | |||||
#include <X11/keysym.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 { | struct PuglInternalsImpl { | ||||
Display* display; | Display* display; | ||||
int screen; | int screen; | ||||
Window win; | Window win; | ||||
#ifdef PUGL_HAVE_CAIRO | |||||
cairo_t* cr; | |||||
#endif | |||||
#ifdef PUGL_HAVE_GL | |||||
GLXContext ctx; | GLXContext ctx; | ||||
Bool doubleBuffered; | Bool doubleBuffered; | ||||
#endif | |||||
}; | }; | ||||
/** | /** | ||||