Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
pogl_glut.xs view on Meta::CPAN
if (!handler || !SvOK(handler)) { \
croak fail; \
} else { \
AV * handler_data = newAV(); \
\
PackCallbackST(handler_data, 0); \
\
set_glut_win_handler(win, HANDLE_GLUT_ ## type, (SV*)handler_data);\
\
glut ## type ## Func(generic_glut_ ## type ## _handler);\
} \
ENSURE_callback_thread;}
/* Activate a global state callback handler */
#define decl_ggh_xs(type) \
{ \
if (glut_ ## type ## _handler_data) \
SvREFCNT_dec(glut_ ## type ## _handler_data); \
\
if (!handler || !SvOK(handler)) { \
glut_ ## type ## _handler_data = 0; \
glut ## type ## Func(NULL); \
} else { \
AV * handler_data = newAV(); \
\
PackCallbackST(handler_data, 0); \
\
glut_ ## type ## _handler_data = handler_data; \
\
glut ## type ## Func(generic_glut_ ## type ## _handler);\
} \
ENSURE_callback_thread;}
/* Begin a global state callback definition */
#define begin_decl_ggh(type, params, nparam) \
\
static AV * glut_ ## type ## _handler_data = 0; \
\
static void generic_glut_ ## type ## _handler params \
{ \
AV * handler_data = glut_ ## type ## _handler_data; \
SV * handler; \
int i; \
dSP; \
\
handler = *av_fetch(handler_data, 0, 0); \
\
GLUT_PUSHMARK(sp); \
GLUT_EXTEND_STACK(sp,av_len(handler_data)+nparam); \
for (i=1;i<=av_len(handler_data);i++) \
GLUT_PUSH_NEW_SV(*av_fetch(handler_data, i, 0));
/* End a global state callback definition */
#define end_decl_ggh() \
PUTBACK; \
DO_perl_call_sv(handler, G_DISCARD); \
}
/* Define callbacks */
enum {
HANDLE_GLUT_Display,
HANDLE_GLUT_OverlayDisplay,
HANDLE_GLUT_Reshape,
HANDLE_GLUT_Keyboard,
HANDLE_GLUT_KeyboardUp,
HANDLE_GLUT_Mouse,
HANDLE_GLUT_MouseWheel, /* Open/FreeGLUT -chm */
HANDLE_GLUT_Motion,
HANDLE_GLUT_PassiveMotion,
HANDLE_GLUT_Entry,
HANDLE_GLUT_Visibility,
HANDLE_GLUT_WindowStatus,
HANDLE_GLUT_Special,
HANDLE_GLUT_SpecialUp,
HANDLE_GLUT_Joystick, /* Open/FreeGLUT -chm */
HANDLE_GLUT_SpaceballMotion,
HANDLE_GLUT_SpaceballRotate,
HANDLE_GLUT_SpaceballButton,
HANDLE_GLUT_ButtonBox,
HANDLE_GLUT_Dials,
HANDLE_GLUT_TabletMotion,
HANDLE_GLUT_TabletButton,
HANDLE_GLUT_MenuDestroy, /* Open/FreeGLUT -chm */
HANDLE_GLUT_Close, /* Open/FreeGLUT -chm */
HANDLE_GLUT_WMClose, /* AGL GLUT -chm */
};
/* Callback for glutDisplayFunc */
begin_decl_gwh(Display, (void), 0)
end_decl_gwh()
/* Callback for glutOverlayDisplayFunc */
begin_decl_gwh(OverlayDisplay, (void), 0)
end_decl_gwh()
/* Callback for glutReshapeFunc */
begin_decl_gwh(Reshape, (int width, int height), 2)
GLUT_PUSH_NEW_IV(width);
GLUT_PUSH_NEW_IV(height);
end_decl_gwh()
/* Callback for glutKeyboardFunc */
begin_decl_gwh(Keyboard, (unsigned char key, int width, int height), 3)
GLUT_PUSH_NEW_U8(key);
GLUT_PUSH_NEW_IV(width);
GLUT_PUSH_NEW_IV(height);
end_decl_gwh()
/* Callback for glutKeyboardUpFunc */
begin_decl_gwh(KeyboardUp, (unsigned char key, int width, int height), 3)
GLUT_PUSH_NEW_U8(key);
GLUT_PUSH_NEW_IV(width);
GLUT_PUSH_NEW_IV(height);
end_decl_gwh()
/* Callback for glutMouseFunc */
begin_decl_gwh(Mouse, (int button, int state, int x, int y), 4)
GLUT_PUSH_NEW_IV(button);
GLUT_PUSH_NEW_IV(state);
( run in 1.249 second using v1.01-cache-2.11-cpan-f56aa216473 )