# 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>
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;
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))) {
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);
}
}
-#ifndef _WIN32
static /* X11 implementations do not need this global. */
-#endif
void
__glutProcessWindowWorkLists(void)
{
}
/* CENTRY */
-void APIENTRY
+void GLUTAPIENTRY
glutMainLoop(void)
{
#if !defined(_WIN32)