From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / fireworkx.c
index 11bc5e5b478c3755443ed12437dcfe22da1ef17f..faf3745e23a160240ba3f391e85c20861ee86efe 100644 (file)
@@ -100,6 +100,9 @@ struct state
        int depth;
        int bigendian;
        int ncolors;
+       Bool button_down_p;
+       int deferred;
+
 };
 
 /*
@@ -140,8 +143,8 @@ static void render_light_map(struct state *st, fireshell *fs)
        {
                for (x = 0; x < st->width; x += 2, v += SHELLCOUNT)
                {
-                       float f;
-                       f = sqrtf((fs->cx - x) * (fs->cx - x) + (fs->cy - y) * (fs->cy - y)) + 4.0;
+                       double f;
+                       f = sqrt((fs->cx - x) * (fs->cx - x) + (fs->cy - y) * (fs->cy - y)) + 4.0;
                        f = FLASH_ZOOM / f;
                        f += pow(f,0.1) * frand(0.0001); /* dither */
                        st->light_map[v] = f;
@@ -777,11 +780,19 @@ fireworkx_draw (Display *dpy, Window win, void *closure)
                {
                        if (!explode(st, fs))
                        {
-                               recycle(st, fs, rnd(st->width), rnd(st->height));
+                               if (st->button_down_p)
+                                  st->deferred++;
+                                else
+                                 recycle(st, fs, rnd(st->width), rnd(st->height));
                        }
                }
        }
 
+        while (!st->button_down_p && st->deferred) {
+          st->deferred--;
+          recycle_oldest(st, rnd(st->width), rnd(st->height));
+        }
+
        glow_blur(st);
 
        if (st->flash_on)
@@ -810,8 +821,15 @@ fireworkx_event (Display *dpy, Window window, void *closure, XEvent *event)
        if (event->type == ButtonPress)
        {
                recycle_oldest(st, event->xbutton.x, event->xbutton.y);
+               st->button_down_p = True;
+               return True;
+       }
+       else if (event->type == ButtonRelease)
+       {
+               st->button_down_p = False;
                return True;
        }
+
        return False;
 }