Merge commit 'origin/gallium-master-merge'
[mesa.git] / src / glut / glx / glut_event.c
index f997f772c70c8c8171bc5e5dc8b3785e7f93342c..d6d963896a6fff8143f914956e60f4f774eac377 100644 (file)
@@ -24,7 +24,7 @@
 # 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>
@@ -172,10 +172,14 @@ handleTimeouts(void)
   GETTIMEOFDAY(&now);
   while (IS_AT_OR_AFTER(__glutTimerList->timeout, now)) {
     timer = __glutTimerList;
-    __glutTimerList = timer->next;
+    /* 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;
   }
@@ -439,11 +443,15 @@ processEventsAndTimeouts(void)
         } else {
           window = __glutGetWindow(event.xbutton.window);
           /* added button check for mice with > 3 buttons */
-          if (window && event.xbutton.button <= GLUT_MAX_MENUS) {
+          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))) {
@@ -1313,7 +1321,12 @@ processWindowWorkList(GLUTwindow * window)
        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);
@@ -1330,9 +1343,7 @@ processWindowWorkList(GLUTwindow * window)
   }
 }
 
-#ifndef _WIN32
 static  /* X11 implementations do not need this global. */
-#endif
 void
 __glutProcessWindowWorkLists(void)
 {