From 1b058a06c2e17e44930ed99a32f46f8e5c484fba Mon Sep 17 00:00:00 2001
From: Brian Paul <brian.paul@tungstengraphics.com>
Date: Sun, 9 Jan 2005 16:48:52 +0000
Subject: rotate at a reasonable rate

---
 progs/xdemos/shape.c | 43 +++++++++++++++++++++++++++----------------
 1 file changed, 27 insertions(+), 16 deletions(-)

diff --git a/progs/xdemos/shape.c b/progs/xdemos/shape.c
index 9cae9eb289..dbbc0b4ff7 100644
--- a/progs/xdemos/shape.c
+++ b/progs/xdemos/shape.c
@@ -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);
       }
    }
 }
-- 
cgit v1.2.3