Browse Source

Update DPT pugl, makefiles

tags/v0.9.0
falkTX 13 years ago
parent
commit
c91462773e
9 changed files with 392 additions and 367 deletions
  1. +5
    -1
      c++/carla-native/Makefile
  2. +7
    -8
      c++/carla-rtmempool/Makefile
  3. +39
    -38
      c++/distrho-plugin-toolkit/src/pugl/pugl.h
  4. +40
    -37
      c++/distrho-plugin-toolkit/src/pugl/pugl_internal.h
  5. +7
    -1
      c++/distrho-plugin-toolkit/src/pugl/pugl_osx.m
  6. +7
    -1
      c++/distrho-plugin-toolkit/src/pugl/pugl_win.cpp
  7. +283
    -281
      c++/distrho-plugin-toolkit/src/pugl/pugl_x11.c
  8. +2
    -0
      c++/jackmeter/Makefile
  9. +2
    -0
      c++/xycontroller/Makefile

+ 5
- 1
c++/carla-native/Makefile View File

@@ -18,6 +18,8 @@ ZYN_CXX_FLAGS = $(BUILD_CXX_FLAGS)
ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml) ZYN_CXX_FLAGS += $(shell pkg-config --cflags fftw3 mxml)
endif endif


# --------------------------------------------------------------

# Simple plugins # Simple plugins
OBJS = \ OBJS = \
bypass.o \ bypass.o \
@@ -31,7 +33,9 @@ OBJS += \


# ZynAddSubFX # ZynAddSubFX
ifeq ($(HAVE_ZYN_DEPS),true) ifeq ($(HAVE_ZYN_DEPS),true)
OBJS += zynaddsubfx.o zynaddsubfx-src.o
OBJS += \
zynaddsubfx.o \
zynaddsubfx-src.o
endif endif


# -------------------------------------------------------------- # --------------------------------------------------------------


+ 7
- 8
c++/carla-rtmempool/Makefile View File

@@ -21,6 +21,13 @@ OBJS_win64 = rtmempool_win64.o


all: carla_rtmempool.a all: carla_rtmempool.a


posix32: carla_rtmempool_posix32.a
posix64: carla_rtmempool_posix64.a
win32: carla_rtmempool_win32.a
win64: carla_rtmempool_win64.a

# --------------------------------------------------------------

carla_rtmempool.a: $(OBJS) carla_rtmempool.a: $(OBJS)
$(AR) rs $@ $^ $(AR) rs $@ $^


@@ -29,8 +36,6 @@ rtmempool.o: rtmempool.c


# -------------------------------------------------------------- # --------------------------------------------------------------


posix32: carla_rtmempool_posix32.a

carla_rtmempool_posix32.a: $(OBJS_posix32) carla_rtmempool_posix32.a: $(OBJS_posix32)
$(AR) rs $@ $^ $(AR) rs $@ $^


@@ -39,8 +44,6 @@ rtmempool_posix32.o: rtmempool.c


# -------------------------------------------------------------- # --------------------------------------------------------------


posix64: carla_rtmempool_posix64.a

carla_rtmempool_posix64.a: $(OBJS_posix64) carla_rtmempool_posix64.a: $(OBJS_posix64)
$(AR) rs $@ $^ $(AR) rs $@ $^


@@ -49,8 +52,6 @@ rtmempool_posix64.o: rtmempool.c


# -------------------------------------------------------------- # --------------------------------------------------------------


win32: carla_rtmempool_win32.a

carla_rtmempool_win32.a: $(OBJS_win32) carla_rtmempool_win32.a: $(OBJS_win32)
$(AR) rs $@ $^ $(AR) rs $@ $^


@@ -59,8 +60,6 @@ rtmempool_win32.o: rtmempool.c


# -------------------------------------------------------------- # --------------------------------------------------------------


win64: carla_rtmempool_win64.a

carla_rtmempool_win64.a: $(OBJS_win64) carla_rtmempool_win64.a: $(OBJS_win64)
$(AR) rs $@ $^ $(AR) rs $@ $^




+ 39
- 38
c++/distrho-plugin-toolkit/src/pugl/pugl.h View File

@@ -84,59 +84,59 @@ typedef intptr_t PuglNativeWindow;
Return status code. Return status code.
*/ */
typedef enum { typedef enum {
PUGL_SUCCESS = 0
PUGL_SUCCESS = 0
} PuglStatus; } PuglStatus;


/** /**
Convenience symbols for ASCII control characters. Convenience symbols for ASCII control characters.
*/ */
typedef enum { typedef enum {
PUGL_CHAR_BACKSPACE = 0x08,
PUGL_CHAR_ESCAPE = 0x1B,
PUGL_CHAR_DELETE = 0x7F
PUGL_CHAR_BACKSPACE = 0x08,
PUGL_CHAR_ESCAPE = 0x1B,
PUGL_CHAR_DELETE = 0x7F
} PuglChar; } PuglChar;
/** /**
Special (non-Unicode) keyboard keys. Special (non-Unicode) keyboard keys.
*/ */
typedef enum { 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,
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; } PuglKey;


/** /**
Keyboard modifier flags. Keyboard modifier flags.
*/ */
typedef enum { 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 */
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; } PuglMod;
/** /**
Handle for opaque user data. Handle for opaque user data.
*/ */
@@ -177,7 +177,7 @@ typedef void (*PuglMotionFunc)(PuglView* view, int x, int y);
@param y The window-relative y coordinate of the pointer. @param y The window-relative y coordinate of the pointer.
*/ */
typedef void (*PuglMouseFunc)( typedef void (*PuglMouseFunc)(
PuglView* view, int button, bool press, int x, int y);
PuglView* view, int button, bool press, int x, int y);


/** /**
A function called when the view is resized. A function called when the view is resized.
@@ -205,7 +205,7 @@ typedef void (*PuglScrollFunc)(PuglView* view, float dx, float dy);
A function called when a special key is pressed or released. A function called when a special key is pressed or released.


This callback allows the use of keys that do not have unicode points. Note This callback allows the use of keys that do not have unicode points. Note
that some non-printable keys
that some non-printable keys
@param view The view the event occured in. @param view The view the event occured in.
@param press True if the key was pressed, false if released. @param press True if the key was pressed, false if released.
@param key The key pressed. @param key The key pressed.
@@ -226,7 +226,8 @@ puglCreate(PuglNativeWindow parent,
int width, int width,
int height, int height,
bool resizable, bool resizable,
bool addToDesktop = true);
bool addToDesktop = true,
long x11Display = 0);


/** /**
Set the handle to be passed to all callbacks. Set the handle to be passed to all callbacks.


+ 40
- 37
c++/distrho-plugin-toolkit/src/pugl/pugl_internal.h View File

@@ -27,106 +27,109 @@
typedef struct PuglInternalsImpl PuglInternals; typedef struct PuglInternalsImpl PuglInternals;


struct PuglViewImpl { struct PuglViewImpl {
PuglHandle handle;
PuglCloseFunc closeFunc;
PuglDisplayFunc displayFunc;
PuglKeyboardFunc keyboardFunc;
PuglMotionFunc motionFunc;
PuglMouseFunc mouseFunc;
PuglReshapeFunc reshapeFunc;
PuglScrollFunc scrollFunc;
PuglSpecialFunc specialFunc;
PuglInternals* impl;
int width;
int height;
int mods;
bool ignoreKeyRepeat;
bool redisplay;
PuglHandle handle;
PuglCloseFunc closeFunc;
PuglDisplayFunc displayFunc;
PuglKeyboardFunc keyboardFunc;
PuglMotionFunc motionFunc;
PuglMouseFunc mouseFunc;
PuglReshapeFunc reshapeFunc;
PuglScrollFunc scrollFunc;
PuglSpecialFunc specialFunc;
PuglInternals* impl;
int width;
int height;
int mods;
bool ignoreKeyRepeat;
bool redisplay;
}; };


void void
puglSetHandle(PuglView* view, PuglHandle handle) puglSetHandle(PuglView* view, PuglHandle handle)
{ {
view->handle = handle;
view->handle = handle;
} }


PuglHandle PuglHandle
puglGetHandle(PuglView* view) puglGetHandle(PuglView* view)
{ {
return view->handle;
return view->handle;
} }


int int
puglGetModifiers(PuglView* view) puglGetModifiers(PuglView* view)
{ {
return view->mods;
return view->mods;
} }


static inline void static inline void
puglDefaultReshape(PuglView* view, int width, int height) puglDefaultReshape(PuglView* view, int width, int height)
{ {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
glViewport(0, 0, width, height);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
(void)view;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
glViewport(0, 0, width, height);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
return;

// unused
(void)view;
} }


void void
puglIgnoreKeyRepeat(PuglView* view, bool ignore) puglIgnoreKeyRepeat(PuglView* view, bool ignore)
{ {
view->ignoreKeyRepeat = ignore;
view->ignoreKeyRepeat = ignore;
} }


void void
puglSetCloseFunc(PuglView* view, PuglCloseFunc closeFunc) puglSetCloseFunc(PuglView* view, PuglCloseFunc closeFunc)
{ {
view->closeFunc = closeFunc;
view->closeFunc = closeFunc;
} }


void void
puglSetDisplayFunc(PuglView* view, PuglDisplayFunc displayFunc) puglSetDisplayFunc(PuglView* view, PuglDisplayFunc displayFunc)
{ {
view->displayFunc = displayFunc;
view->displayFunc = displayFunc;
} }


void void
puglSetKeyboardFunc(PuglView* view, PuglKeyboardFunc keyboardFunc) puglSetKeyboardFunc(PuglView* view, PuglKeyboardFunc keyboardFunc)
{ {
view->keyboardFunc = keyboardFunc;
view->keyboardFunc = keyboardFunc;
} }


void void
puglSetMotionFunc(PuglView* view, PuglMotionFunc motionFunc) puglSetMotionFunc(PuglView* view, PuglMotionFunc motionFunc)
{ {
view->motionFunc = motionFunc;
view->motionFunc = motionFunc;
} }


void void
puglSetMouseFunc(PuglView* view, PuglMouseFunc mouseFunc) puglSetMouseFunc(PuglView* view, PuglMouseFunc mouseFunc)
{ {
view->mouseFunc = mouseFunc;
view->mouseFunc = mouseFunc;
} }


void void
puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc) puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc)
{ {
view->reshapeFunc = reshapeFunc;
view->reshapeFunc = reshapeFunc;
} }


void void
puglSetScrollFunc(PuglView* view, PuglScrollFunc scrollFunc) puglSetScrollFunc(PuglView* view, PuglScrollFunc scrollFunc)
{ {
view->scrollFunc = scrollFunc;
view->scrollFunc = scrollFunc;
} }


void void
puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc) puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc)
{ {
view->specialFunc = specialFunc;
view->specialFunc = specialFunc;
} }

+ 7
- 1
c++/distrho-plugin-toolkit/src/pugl/pugl_osx.m View File

@@ -227,7 +227,9 @@ puglCreate(PuglNativeWindow parent,
const char* title, const char* title,
int width, int width,
int height, int height,
bool resizable)
bool resizable,
bool addToDesktop,
long x11Display)
{ {
PuglView* view = (PuglView*)calloc(1, sizeof(PuglView)); PuglView* view = (PuglView*)calloc(1, sizeof(PuglView));
PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals)); PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals));
@@ -270,6 +272,10 @@ puglCreate(PuglNativeWindow parent,
impl->session = [NSApp beginModalSessionForWindow:view->impl->window]; impl->session = [NSApp beginModalSessionForWindow:view->impl->window];


return view; return view;

// unused
(void)addToDesktop;
(void)x11Display;
} }


void void


+ 7
- 1
c++/distrho-plugin-toolkit/src/pugl/pugl_win.cpp View File

@@ -45,7 +45,9 @@ puglCreate(PuglNativeWindow parent,
const char* title, const char* title,
int width, int width,
int height, int height,
bool resizable)
bool resizable,
bool addToDesktop,
long x11Display)
{ {
PuglView* view = (PuglView*)calloc(1, sizeof(PuglView)); PuglView* view = (PuglView*)calloc(1, sizeof(PuglView));
PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals)); PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals));
@@ -105,6 +107,10 @@ puglCreate(PuglNativeWindow parent,
view->height = height; view->height = height;


return view; return view;

// unused
(void)addToDesktop;
(void)x11Display;
} }


void void


+ 283
- 281
c++/distrho-plugin-toolkit/src/pugl/pugl_x11.c View File

@@ -32,11 +32,11 @@
#include "pugl_internal.h" #include "pugl_internal.h"


struct PuglInternalsImpl { struct PuglInternalsImpl {
Display* display;
int screen;
Window win;
GLXContext ctx;
Bool doubleBuffered;
Display* display;
int screen;
Window win;
GLXContext ctx;
Bool doubleBuffered;
}; };


/** /**
@@ -44,12 +44,12 @@ struct PuglInternalsImpl {
4 bits per color and a 16 bit depth buffer. 4 bits per color and a 16 bit depth buffer.
*/ */
static int attrListSgl[] = { static int attrListSgl[] = {
GLX_RGBA,
GLX_RED_SIZE, 4,
GLX_GREEN_SIZE, 4,
GLX_BLUE_SIZE, 4,
GLX_DEPTH_SIZE, 16,
None
GLX_RGBA,
GLX_RED_SIZE, 4,
GLX_GREEN_SIZE, 4,
GLX_BLUE_SIZE, 4,
GLX_DEPTH_SIZE, 16,
None
}; };


/** /**
@@ -57,12 +57,12 @@ static int attrListSgl[] = {
4 bits per color and a 16 bit depth buffer. 4 bits per color and a 16 bit depth buffer.
*/ */
static int attrListDbl[] = { static int attrListDbl[] = {
GLX_RGBA, GLX_DOUBLEBUFFER,
GLX_RED_SIZE, 4,
GLX_GREEN_SIZE, 4,
GLX_BLUE_SIZE, 4,
GLX_DEPTH_SIZE, 16,
None
GLX_RGBA, GLX_DOUBLEBUFFER,
GLX_RED_SIZE, 4,
GLX_GREEN_SIZE, 4,
GLX_BLUE_SIZE, 4,
GLX_DEPTH_SIZE, 16,
None
}; };


PuglView* PuglView*
@@ -71,314 +71,316 @@ puglCreate(PuglNativeWindow parent,
int width, int width,
int height, int height,
bool resizable, bool resizable,
bool addToDesktop)
bool addToDesktop,
long x11Display)
{ {
PuglView* view = (PuglView*)calloc(1, sizeof(PuglView));
PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals));
if (!view || !impl) {
return NULL;
}

view->impl = impl;
view->width = width;
view->height = height;

impl->display = XOpenDisplay(0);
impl->screen = DefaultScreen(impl->display);

XVisualInfo* vi = glXChooseVisual(impl->display, impl->screen, attrListDbl);
if (!vi) {
vi = glXChooseVisual(impl->display, impl->screen, attrListSgl);
impl->doubleBuffered = False;
printf("singlebuffered rendering will be used, no doublebuffering available\n");
} else {
impl->doubleBuffered = True;
printf("doublebuffered rendering available\n");
}

int glxMajor, glxMinor;
glXQueryVersion(impl->display, &glxMajor, &glxMinor);
printf("GLX-Version %d.%d\n", glxMajor, glxMinor);

impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE);

Window xParent = parent
? (Window)parent
: RootWindow(impl->display, impl->screen);

Colormap cmap = XCreateColormap(
impl->display, xParent, vi->visual, AllocNone);

XSetWindowAttributes attr;
memset(&attr, 0, sizeof(XSetWindowAttributes));
attr.colormap = cmap;
attr.border_pixel = 0;

attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask
| ButtonPressMask | ButtonReleaseMask
| PointerMotionMask | StructureNotifyMask;

impl->win = XCreateWindow(
impl->display, xParent,
0, 0, view->width, view->height, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &attr);

XSizeHints sizeHints;
memset(&sizeHints, 0, sizeof(sizeHints));
if (!resizable) {
sizeHints.flags = PMinSize|PMaxSize;
sizeHints.min_width = width;
sizeHints.min_height = height;
sizeHints.max_width = width;
sizeHints.max_height = height;
XSetNormalHints(impl->display, impl->win, &sizeHints);
}

if (title) {
XStoreName(impl->display, impl->win, title);
}

if (!parent) {
Atom wmDelete = XInternAtom(impl->display, "WM_DELETE_WINDOW", True);
XSetWMProtocols(impl->display, impl->win, &wmDelete, 1);
}

if (addToDesktop)
XMapRaised(impl->display, impl->win);

if (glXIsDirect(impl->display, impl->ctx)) {
printf("DRI enabled\n");
} else {
printf("no DRI available\n");
}

XFree(vi);

return view;
PuglView* view = (PuglView*)calloc(1, sizeof(PuglView));
PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals));
if (!view || !impl) {
return NULL;
}

view->impl = impl;
view->width = width;
view->height = height;

impl->display = XOpenDisplay(x11Display);
impl->screen = DefaultScreen(impl->display);

XVisualInfo* vi = glXChooseVisual(impl->display, impl->screen, attrListDbl);
if (!vi) {
vi = glXChooseVisual(impl->display, impl->screen, attrListSgl);
impl->doubleBuffered = False;
printf("singlebuffered rendering will be used, no doublebuffering available\n");
} else {
impl->doubleBuffered = True;
printf("doublebuffered rendering available\n");
}

int glxMajor, glxMinor;
glXQueryVersion(impl->display, &glxMajor, &glxMinor);
printf("GLX-Version %d.%d\n", glxMajor, glxMinor);

impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE);

Window xParent = parent
? (Window)parent
: RootWindow(impl->display, impl->screen);

Colormap cmap = XCreateColormap(
impl->display, xParent, vi->visual, AllocNone);

XSetWindowAttributes attr;
memset(&attr, 0, sizeof(XSetWindowAttributes));
attr.colormap = cmap;
attr.border_pixel = 0;

attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask
| ButtonPressMask | ButtonReleaseMask
| PointerMotionMask | StructureNotifyMask;

impl->win = XCreateWindow(
impl->display, xParent,
0, 0, view->width, view->height, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &attr);

XSizeHints sizeHints;
memset(&sizeHints, 0, sizeof(sizeHints));
if (!resizable) {
sizeHints.flags = PMinSize|PMaxSize;
sizeHints.min_width = width;
sizeHints.min_height = height;
sizeHints.max_width = width;
sizeHints.max_height = height;
XSetNormalHints(impl->display, impl->win, &sizeHints);
}

if (title) {
XStoreName(impl->display, impl->win, title);
}

if (!parent) {
Atom wmDelete = XInternAtom(impl->display, "WM_DELETE_WINDOW", True);
XSetWMProtocols(impl->display, impl->win, &wmDelete, 1);
}

if (addToDesktop) {
XMapRaised(impl->display, impl->win);
}

if (glXIsDirect(impl->display, impl->ctx)) {
printf("DRI enabled\n");
} else {
printf("no DRI available\n");
}

XFree(vi);

return view;
} }


void void
puglDestroy(PuglView* view) puglDestroy(PuglView* view)
{ {
if (!view) {
return;
}
glXDestroyContext(view->impl->display, view->impl->ctx);
XDestroyWindow(view->impl->display, view->impl->win);
XCloseDisplay(view->impl->display);
free(view->impl);
free(view);
if (!view) {
return;
}
glXDestroyContext(view->impl->display, view->impl->ctx);
XDestroyWindow(view->impl->display, view->impl->win);
XCloseDisplay(view->impl->display);
free(view->impl);
free(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);
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx);


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


view->width = width;
view->height = height;
view->width = width;
view->height = height;
} }


static void static void
puglDisplay(PuglView* view) puglDisplay(PuglView* view)
{ {
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();


if (view->displayFunc) {
view->displayFunc(view);
}
if (view->displayFunc) {
view->displayFunc(view);
}


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


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


static PuglKey static PuglKey
keySymToSpecial(KeySym sym) keySymToSpecial(KeySym sym)
{ {
switch (sym) {
case XK_F1: return PUGL_KEY_F1;
case XK_F2: return PUGL_KEY_F2;
case XK_F3: return PUGL_KEY_F3;
case XK_F4: return PUGL_KEY_F4;
case XK_F5: return PUGL_KEY_F5;
case XK_F6: return PUGL_KEY_F6;
case XK_F7: return PUGL_KEY_F7;
case XK_F8: return PUGL_KEY_F8;
case XK_F9: return PUGL_KEY_F9;
case XK_F10: return PUGL_KEY_F10;
case XK_F11: return PUGL_KEY_F11;
case XK_F12: return PUGL_KEY_F12;
case XK_Left: return PUGL_KEY_LEFT;
case XK_Up: return PUGL_KEY_UP;
case XK_Right: return PUGL_KEY_RIGHT;
case XK_Down: return PUGL_KEY_DOWN;
case XK_Page_Up: return PUGL_KEY_PAGE_UP;
case XK_Page_Down: return PUGL_KEY_PAGE_DOWN;
case XK_Home: return PUGL_KEY_HOME;
case XK_End: return PUGL_KEY_END;
case XK_Insert: return PUGL_KEY_INSERT;
case XK_Shift_L: return PUGL_KEY_SHIFT;
case XK_Shift_R: return PUGL_KEY_SHIFT;
case XK_Control_L: return PUGL_KEY_CTRL;
case XK_Control_R: return PUGL_KEY_CTRL;
case XK_Alt_L: return PUGL_KEY_ALT;
case XK_Alt_R: return PUGL_KEY_ALT;
case XK_Super_L: return PUGL_KEY_SUPER;
case XK_Super_R: return PUGL_KEY_SUPER;
}
return (PuglKey)0;
switch (sym) {
case XK_F1: return PUGL_KEY_F1;
case XK_F2: return PUGL_KEY_F2;
case XK_F3: return PUGL_KEY_F3;
case XK_F4: return PUGL_KEY_F4;
case XK_F5: return PUGL_KEY_F5;
case XK_F6: return PUGL_KEY_F6;
case XK_F7: return PUGL_KEY_F7;
case XK_F8: return PUGL_KEY_F8;
case XK_F9: return PUGL_KEY_F9;
case XK_F10: return PUGL_KEY_F10;
case XK_F11: return PUGL_KEY_F11;
case XK_F12: return PUGL_KEY_F12;
case XK_Left: return PUGL_KEY_LEFT;
case XK_Up: return PUGL_KEY_UP;
case XK_Right: return PUGL_KEY_RIGHT;
case XK_Down: return PUGL_KEY_DOWN;
case XK_Page_Up: return PUGL_KEY_PAGE_UP;
case XK_Page_Down: return PUGL_KEY_PAGE_DOWN;
case XK_Home: return PUGL_KEY_HOME;
case XK_End: return PUGL_KEY_END;
case XK_Insert: return PUGL_KEY_INSERT;
case XK_Shift_L: return PUGL_KEY_SHIFT;
case XK_Shift_R: return PUGL_KEY_SHIFT;
case XK_Control_L: return PUGL_KEY_CTRL;
case XK_Control_R: return PUGL_KEY_CTRL;
case XK_Alt_L: return PUGL_KEY_ALT;
case XK_Alt_R: return PUGL_KEY_ALT;
case XK_Super_L: return PUGL_KEY_SUPER;
case XK_Super_R: return PUGL_KEY_SUPER;
}
return (PuglKey)0;
} }


static void static void
setModifiers(PuglView* view, int xstate) setModifiers(PuglView* view, int xstate)
{ {
view->mods = 0;
view->mods |= (xstate & ShiftMask) ? PUGL_MOD_SHIFT : 0;
view->mods |= (xstate & ControlMask) ? PUGL_MOD_CTRL : 0;
view->mods |= (xstate & Mod1Mask) ? PUGL_MOD_ALT : 0;
view->mods |= (xstate & Mod4Mask) ? PUGL_MOD_SUPER : 0;
view->mods = 0;
view->mods |= (xstate & ShiftMask) ? PUGL_MOD_SHIFT : 0;
view->mods |= (xstate & ControlMask) ? PUGL_MOD_CTRL : 0;
view->mods |= (xstate & Mod1Mask) ? PUGL_MOD_ALT : 0;
view->mods |= (xstate & Mod4Mask) ? PUGL_MOD_SUPER : 0;
} }


PuglStatus PuglStatus
puglProcessEvents(PuglView* view) puglProcessEvents(PuglView* view)
{ {
XEvent event;
while (XPending(view->impl->display) > 0) {
XNextEvent(view->impl->display, &event);
switch (event.type) {
case MapNotify:
puglReshape(view, view->width, view->height);
break;
case ConfigureNotify:
if ((event.xconfigure.width != view->width) ||
(event.xconfigure.height != view->height)) {
puglReshape(view,
event.xconfigure.width,
event.xconfigure.height);
}
break;
case Expose:
if (event.xexpose.count != 0) {
break;
}
puglDisplay(view);
view->redisplay = false;
break;
case MotionNotify:
setModifiers(view, event.xmotion.state);
if (view->motionFunc) {
view->motionFunc(view, event.xmotion.x, event.xmotion.y);
}
break;
case ButtonPress:
setModifiers(view, event.xbutton.state);
if (event.xbutton.button >= 4 && event.xbutton.button <= 7) {
if (view->scrollFunc) {
float dx = 0, dy = 0;
switch (event.xbutton.button) {
case 4: dy = 1.0f; break;
case 5: dy = -1.0f; break;
case 6: dx = -1.0f; break;
case 7: dx = 1.0f; break;
}
view->scrollFunc(view, dx, dy);
}
break;
}
// nobreak
case ButtonRelease:
setModifiers(view, event.xbutton.state);
if (view->mouseFunc &&
(event.xbutton.button < 4 || event.xbutton.button > 7)) {
view->mouseFunc(view,
event.xbutton.button, event.type == ButtonPress,
event.xbutton.x, event.xbutton.y);
}
break;
case KeyPress: {
setModifiers(view, event.xkey.state);
KeySym sym;
char str[5];
int n = XLookupString(&event.xkey, str, 4, &sym, NULL);
PuglKey key = keySymToSpecial(sym);
if (!key && view->keyboardFunc) {
if (n == 1) {
view->keyboardFunc(view, true, str[0]);
} else {
fprintf(stderr, "warning: Unknown key %X\n", (int)sym);
}
} else if (view->specialFunc) {
view->specialFunc(view, true, key);
}
} break;
case KeyRelease: {
setModifiers(view, event.xkey.state);
bool repeated = false;
if (view->ignoreKeyRepeat &&
XEventsQueued(view->impl->display, QueuedAfterReading)) {
XEvent next;
XPeekEvent(view->impl->display, &next);
if (next.type == KeyPress &&
next.xkey.time == event.xkey.time &&
next.xkey.keycode == event.xkey.keycode) {
XNextEvent(view->impl->display, &event);
repeated = true;
}
}
if (!repeated && view->keyboardFunc) {
KeySym sym = XKeycodeToKeysym(
view->impl->display, event.xkey.keycode, 0);
PuglKey special = keySymToSpecial(sym);
if (!special) {
view->keyboardFunc(view, false, sym);
} else if (view->specialFunc) {
view->specialFunc(view, false, special);
}
}
} break;
case ClientMessage:
if (!strcmp(XGetAtomName(view->impl->display,
event.xclient.message_type),
"WM_PROTOCOLS")) {
if (view->closeFunc) {
view->closeFunc(view);
}
}
break;
default:
break;
}
}
if (view->redisplay) {
puglDisplay(view);
}
return PUGL_SUCCESS;
XEvent event;
while (XPending(view->impl->display) > 0) {
XNextEvent(view->impl->display, &event);
switch (event.type) {
case MapNotify:
puglReshape(view, view->width, view->height);
break;
case ConfigureNotify:
if ((event.xconfigure.width != view->width) ||
(event.xconfigure.height != view->height)) {
puglReshape(view,
event.xconfigure.width,
event.xconfigure.height);
}
break;
case Expose:
if (event.xexpose.count != 0) {
break;
}
puglDisplay(view);
view->redisplay = false;
break;
case MotionNotify:
setModifiers(view, event.xmotion.state);
if (view->motionFunc) {
view->motionFunc(view, event.xmotion.x, event.xmotion.y);
}
break;
case ButtonPress:
setModifiers(view, event.xbutton.state);
if (event.xbutton.button >= 4 && event.xbutton.button <= 7) {
if (view->scrollFunc) {
float dx = 0, dy = 0;
switch (event.xbutton.button) {
case 4: dy = 1.0f; break;
case 5: dy = -1.0f; break;
case 6: dx = -1.0f; break;
case 7: dx = 1.0f; break;
}
view->scrollFunc(view, dx, dy);
}
break;
}
// nobreak
case ButtonRelease:
setModifiers(view, event.xbutton.state);
if (view->mouseFunc &&
(event.xbutton.button < 4 || event.xbutton.button > 7)) {
view->mouseFunc(view,
event.xbutton.button, event.type == ButtonPress,
event.xbutton.x, event.xbutton.y);
}
break;
case KeyPress: {
setModifiers(view, event.xkey.state);
KeySym sym;
char str[5];
int n = XLookupString(&event.xkey, str, 4, &sym, NULL);
PuglKey key = keySymToSpecial(sym);
if (!key && view->keyboardFunc) {
if (n == 1) {
view->keyboardFunc(view, true, str[0]);
} else {
fprintf(stderr, "warning: Unknown key %X\n", (int)sym);
}
} else if (view->specialFunc) {
view->specialFunc(view, true, key);
}
} break;
case KeyRelease: {
setModifiers(view, event.xkey.state);
bool repeated = false;
if (view->ignoreKeyRepeat &&
XEventsQueued(view->impl->display, QueuedAfterReading)) {
XEvent next;
XPeekEvent(view->impl->display, &next);
if (next.type == KeyPress &&
next.xkey.time == event.xkey.time &&
next.xkey.keycode == event.xkey.keycode) {
XNextEvent(view->impl->display, &event);
repeated = true;
}
}
if (!repeated && view->keyboardFunc) {
KeySym sym = XKeycodeToKeysym(
view->impl->display, event.xkey.keycode, 0);
PuglKey special = keySymToSpecial(sym);
if (!special) {
view->keyboardFunc(view, false, sym);
} else if (view->specialFunc) {
view->specialFunc(view, false, special);
}
}
} break;
case ClientMessage:
if (!strcmp(XGetAtomName(view->impl->display,
event.xclient.message_type),
"WM_PROTOCOLS")) {
if (view->closeFunc) {
view->closeFunc(view);
}
}
break;
default:
break;
}
}
if (view->redisplay) {
puglDisplay(view);
}
return PUGL_SUCCESS;
} }


void void
puglPostRedisplay(PuglView* view) puglPostRedisplay(PuglView* view)
{ {
view->redisplay = true;
view->redisplay = true;
} }


PuglNativeWindow PuglNativeWindow
puglGetNativeWindow(PuglView* view) puglGetNativeWindow(PuglView* view)
{ {
return view->impl->win;
return view->impl->win;
} }

+ 2
- 0
c++/jackmeter/Makefile View File

@@ -16,6 +16,8 @@ ifeq ($(HAVE_JACKSESSION),true)
BUILD_CXX_FLAGS += -DHAVE_JACKSESSION BUILD_CXX_FLAGS += -DHAVE_JACKSESSION
endif endif


# --------------------------------------------------------------

FILES = \ FILES = \
qrc_resources-jackmeter.cpp qrc_resources-jackmeter.cpp




+ 2
- 0
c++/xycontroller/Makefile View File

@@ -16,6 +16,8 @@ ifeq ($(HAVE_JACKSESSION),true)
BUILD_CXX_FLAGS += -DHAVE_JACKSESSION BUILD_CXX_FLAGS += -DHAVE_JACKSESSION
endif endif


# --------------------------------------------------------------

FILES = \ FILES = \
xycontroller.moc \ xycontroller.moc \
ui_xycontroller.h \ ui_xycontroller.h \


Loading…
Cancel
Save