rotate at a reasonable rate
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 9 Jan 2005 16:48:52 +0000 (16:48 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 9 Jan 2005 16:48:52 +0000 (16:48 +0000)
progs/xdemos/shape.c

index 9cae9eb2895143bb9bc6f9ed836cdd23aa02adb2..dbbc0b4ff72720a585e04845650a4e5c84e2b7b2 100644 (file)
@@ -17,6 +17,9 @@
 #include <math.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/keysym.h>
@@ -37,6 +40,21 @@ static int MinSides = 3;
 static int MaxSides = 20;
 
 
+/* return current time (in seconds) */
+static double
+current_time(void)
+{
+   struct timeval tv;
+#ifdef __VMS
+   (void) gettimeofday(&tv, NULL );
+#else
+   struct timezone tz;
+   (void) gettimeofday(&tv, &tz);
+#endif
+   return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
+}
+
+
 /*
  * Draw the OpenGL stuff and do a SwapBuffers.
  */
@@ -139,17 +157,6 @@ static void display(Display *dpy, Window win)
 }
 
 
-/*
- * Called when no events are pending.
- */
-static void idle(void)
-{
-   Xangle += 2.0;
-   Yangle += 3.3;
-   Redraw = 1;
-}
-
-
 /*
  * This is called when we have to recompute the window shape bitmask.
  * We just generate an n-sided regular polygon here but any other shape
@@ -262,11 +269,15 @@ static void event_loop(Display *dpy, Window win)
          }
       }
       else {
-         idle();
-         if (Redraw) {
-            display(dpy, win);
-            Redraw = 0;
-         }
+         static double t0 = -1.0;
+         double dt, t = current_time();
+         if (t0 < 0.0)
+            t0 = t;
+         dt = t - t0;
+         Xangle += 90.0 * dt;  /* 90 degrees per second */
+         Yangle += 70.0 * dt;
+         t0 = t;
+         display(dpy, win);
       }
    }
 }