and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
+#ifdef __VMS
+#include <GL/vms_x_fix.h>
+#endif
+
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
# ifdef __sgi
# include <bstring.h> /* prototype for bzero used by FD_ZERO */
# endif
-# if (defined(SVR4) || defined(CRAY) || defined(AIXV3)) && !defined(FD_SETSIZE)
+# if (defined(__FreeBSD__) || defined(SVR4) || defined(CRAY) || defined(AIXV3)) && !defined(FD_SETSIZE)
# include <sys/select.h> /* select system call interface */
# ifdef luna
# include <sysent.h>
# endif
#endif /* !_WIN32 */
+#include "glutint.h"
+
#if defined(__vms) && ( __VMS_VER < 70000000 )
#include <ssdef.h>
#include <psldef.h>
extern int SYS$CLREF(int efn);
-extern int SYS$SETIMR(unsigned int efn, struct timeval *timeout, void *ast,
+extern int SYS$SETIMR(unsigned int efn, struct timeval6 *timeout, void *ast,
unsigned int request_id, unsigned int flags);
extern int SYS$WFLOR(unsigned int efn, unsigned int mask);
extern int SYS$CANTIM(unsigned int request_id, unsigned int mode);
#endif /* __vms, VMs 6.2 or earlier */
-#include "glutint.h"
-
static GLUTtimer *freeTimerList = NULL;
GLUTidleCB __glutIdleFunc = NULL;
unsigned int __glutModifierMask = (unsigned int) ~0;
int __glutWindowDamaged = 0;
-void APIENTRY
+void GLUTAPIENTRY
glutIdleFunc(GLUTidleCB idleFunc)
{
__glutIdleFunc = idleFunc;
}
-void APIENTRY
+void GLUTAPIENTRY
glutTimerFunc(unsigned int interval, GLUTtimerCB timerFunc, int value)
{
GLUTtimer *timer, *other;
GLUTtimer **prevptr;
- struct timeval now;
-
+#ifdef OLD_VMS
+ struct timeval6 now;
+#else
+ struct timeval now;
+#endif
+
if (!timerFunc)
return;
void
handleTimeouts(void)
{
- struct timeval now;
- GLUTtimer *timer;
+#ifdef OLD_VMS
+ struct timeval6 now;
+#else
+ struct timeval now;
+#endif
+ GLUTtimer *timer;
/* Assumption is that __glutTimerList is already determined
to be non-NULL. */
GETTIMEOFDAY(&now);
while (IS_AT_OR_AFTER(__glutTimerList->timeout, now)) {
timer = __glutTimerList;
+ /* call the timer function */
timer->func(timer->value);
+ /* remove from the linked list */
__glutTimerList = timer->next;
+ /* put this timer on the "free" list */
timer->next = freeTimerList;
freeTimerList = timer;
+
if (!__glutTimerList)
break;
}
}
/* CENTRY */
-void APIENTRY
+void GLUTAPIENTRY
glutPostRedisplay(void)
{
__glutPostRedisplay(__glutCurrentWindow, GLUT_REDISPLAY_WORK);
glutSetWindow call (entailing an expensive OpenGL context switch),
particularly useful when multiple windows need redisplays posted at
the same times. See also glutPostWindowOverlayRedisplay. */
-void APIENTRY
+void GLUTAPIENTRY
glutPostWindowRedisplay(int win)
{
__glutPostRedisplay(__glutWindowList[win - 1], GLUT_REDISPLAY_WORK);
__glutFinishMenu(event.xbutton.window, event.xbutton.x, event.xbutton.y);
} else {
window = __glutGetWindow(event.xbutton.window);
+ /* added button check for mice with > 3 buttons */
if (window) {
GLUTmenu *menu;
int menuNum;
- menuNum = window->menu[event.xbutton.button - 1];
+ if (event.xbutton.button <= GLUT_MAX_MENUS)
+ menuNum = window->menu[event.xbutton.button - 1];
+ else
+ menuNum = 0;
+
/* Make sure that __glutGetMenuByNum is only called if there
really is a menu present. */
if ((menuNum > 0) && (menu = __glutGetMenuByNum(menuNum))) {
waitForSomething(void)
{
#if defined(__vms) && ( __VMS_VER < 70000000 )
- static struct timeval zerotime =
+ static struct timeval6 zerotime =
{0};
unsigned int timer_efn;
#define timer_id 'glut' /* random :-) number */
fd_set fds;
#endif
#endif
- struct timeval now, timeout, waittime;
+#ifdef OLD_VMS
+ struct timeval6 now, timeout, waittime;
+#else
+ struct timeval now, timeout, waittime;
+#endif
#if !defined(_WIN32)
int rc;
#endif
is where the finish works gets queued for indirect
contexts. */
__glutSetWindow(window);
- glFinish();
+#if !defined(_WIN32)
+ if (!window->isDirect)
+#endif
+ {
+ glFinish();
+ }
}
if (workMask & GLUT_DEBUG_WORK) {
__glutSetWindow(window);
}
/* CENTRY */
-void APIENTRY
+void GLUTAPIENTRY
glutMainLoop(void)
{
#if !defined(_WIN32)