From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / hacks / celtic.c
index 0bf241c2285599b3b6591c7eb45fdd7c43a4c344..890b3982a96d6a2b98c5c0d6bf3665e64b425802 100644 (file)
  */
 
 #include <math.h>
-#include <assert.h>
 #include "screenhack.h"
 #include "erase.h"
 
 #define SQRT_3 1.73205080756887729352
+#undef assert
+#define assert(EXP) do { if (!((EXP))) abort(); } while(0)
 
 /*-----------------------------------------*/
 
@@ -85,7 +86,7 @@ struct state {
   Graph graph;
   XWindowAttributes xgwa;
   int delay2;
-  int reset;
+  int reset, force_reset;
   double t;
 
   struct params params;
@@ -838,7 +839,7 @@ static const char *celtic_defaults[] = {
     "*delay: 10000",
     "*delay2: 5",
     "*showGraph: False",
-#ifdef USE_IPHONE
+#ifdef HAVE_MOBILE
     "*ignoreRotation: True",
 #endif
     0
@@ -972,10 +973,15 @@ celtic_draw (Display *dpy, Window window, void *closure)
     return 10000;
   }
 
-  if (st->reset) {
+  if (st->reset || st->force_reset) {
+    int delay = (st->force_reset ? 0 : st->delay2);
     st->reset = 0;
+    st->force_reset = 0;
+    st->t = 1;
 
-    pattern_del(st->pattern);
+    if (st->pattern != NULL) {
+      pattern_del(st->pattern);
+    }
     st->pattern = NULL;
     graph_del(st->graph);
 
@@ -986,7 +992,7 @@ celtic_draw (Display *dpy, Window window, void *closure)
                             st->colors, &st->ncolors, True, 0, True);
 
     st->eraser = erase_window (st->dpy, st->window, st->eraser);
-    return st->delay2;
+    return (delay);
   }
 
   if (st->pattern == NULL) {
@@ -1105,6 +1111,12 @@ celtic_reshape (Display *dpy, Window window, void *closure,
 static Bool
 celtic_event (Display *dpy, Window window, void *closure, XEvent *event)
 {
+  struct state *st = (struct state *) closure;
+  if (screenhack_event_helper (dpy, window, event))
+    {
+      st->force_reset = 1;
+      return True;
+    }
   return False;
 }