+ st->delay = get_integer_resource(st->dpy, "delay", "Integer");
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ st->radius = get_integer_resource(st->dpy, "radius", "Integer");
+ st->speed = get_integer_resource(st->dpy, "speed", "Integer");
+ st->number = get_integer_resource(st->dpy, "number", "Integer");
+
+ st->blackhole = get_boolean_resource(st->dpy, "blackhole", "Boolean");
+ st->vortex = get_boolean_resource(st->dpy, "vortex", "Boolean");
+ st->magnify = get_boolean_resource(st->dpy, "magnify", "Boolean");
+ st->reflect = get_boolean_resource(st->dpy, "reflect", "Boolean");
+ st->slow = get_boolean_resource(st->dpy, "slow", "Boolean");
+
+ if (st->delay < 0) st->delay = 0;
+ if (st->duration < 1) st->duration = 1;
+
+ st->effect = NULL;
+ s = get_string_resource(st->dpy, "effect", "String");
+ if (s && !strcasecmp(s,"swamp"))
+ st->effect = &swamp_thing;
+ else if (s && !strcasecmp(s,"bounce"))
+ st->effect = &move_lense;
+ else if (s && !strcasecmp(s,"none"))
+ ;
+ else if (s && *s)
+ fprintf(stderr,"%s: bogus effect: %s\n", progname, s);
+
+ if (st->effect == NULL && st->radius == 0 && st->speed == 0 && st->number == 0
+ && !st->blackhole && !st->vortex && !st->magnify && !st->reflect) {
+/* if no cmdline options are given, randomly choose one of:
+ * -radius 125 -number 4 -speed 1 -bounce
+ * -radius 125 -number 4 -speed 1 -blackhole
+ * -radius 125 -number 4 -speed 1 -vortex
+ * -radius 125 -number 4 -speed 1 -vortex -magnify
+ * -radius 125 -number 4 -speed 1 -vortex -magnify -blackhole
+ * -radius 250 -number 1 -speed 2 -bounce
+ * -radius 250 -number 1 -speed 2 -blackhole
+ * -radius 250 -number 1 -speed 2 -vortex
+ * -radius 250 -number 1 -speed 2 -vortex -magnify
+ * -radius 250 -number 1 -speed 2 -vortex -magnify -blackhole
+ * -radius 80 -number 1 -speed 2 -reflect
+ * -radius 125 -number 3 -speed 2 -reflect
+ * jwz: not these
+ * -radius 125 -number 4 -speed 2 -swamp
+ * -radius 125 -number 4 -speed 2 -swamp -blackhole
+ * -radius 125 -number 4 -speed 2 -swamp -vortex
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify
+ * -radius 125 -number 4 -speed 2 -swamp -vortex -magnify -blackhole
+ */
+
+ i = (random() % 12 /* 17 */);
+
+ st->draw = &plain_draw;
+
+ switch (i) {
+ case 0:
+ st->radius=125;st->number=4;st->speed=1;
+ st->effect=&move_lense;break;
+ case 1:
+ st->radius=125;st->number=4;st->speed=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 2:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 3:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 4:
+ st->radius=125;st->number=4;st->speed=1;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 5:
+ st->radius=250;st->number=1;st->speed=2;
+ st->effect=&move_lense;break;
+ case 6:
+ st->radius=250;st->number=1;st->speed=2;st->blackhole=1;
+ st->effect=&move_lense;break;
+ case 7:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;
+ st->effect=&move_lense;break;
+ case 8:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;
+ st->effect=&move_lense;break;
+ case 9:
+ st->radius=250;st->number=1;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ st->effect=&move_lense;break;
+
+ case 10:
+ st->radius=80;st->number=1;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+ case 11:
+ st->radius=125;st->number=4;st->speed=2;st->reflect=1;
+ st->draw = &reflect_draw;st->effect = &move_lense;break;
+
+#if 0 /* jwz: not these */
+ case 12:
+ st->radius=125;st->number=4;st->speed=2;
+ effect=&swamp_thing;break;
+ case 13:
+ st->radius=125;st->number=4;st->speed=2;st->blackhole=1;
+ effect=&swamp_thing;break;
+ case 14:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;
+ effect=&swamp_thing;break;
+ case 15:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;
+ effect=&swamp_thing;break;
+ case 16:
+ st->radius=125;st->number=4;st->speed=2;st->vortex=1;st->magnify=1;st->blackhole=1;
+ effect=&swamp_thing;break;
+#endif
+
+ default:
+ abort(); break;
+ }
+ }
+
+ /* never allow the radius to be too close to the min window dimension
+ */
+ if (st->radius > st->xgwa.width * 0.3) st->radius = st->xgwa.width * 0.3;
+ if (st->radius > st->xgwa.height * 0.3) st->radius = st->xgwa.height * 0.3;
+
+
+ /* -swamp mode consumes vast amounts of memory, proportional to radius --
+ so throttle radius to a small-ish value (60 => ~30MB.)
+ */
+ if (st->effect == &swamp_thing && st->radius > 60)
+ st->radius = 60;
+
+ if (st->delay < 0)
+ st->delay = 0;
+ if (st->radius <= 0)
+ st->radius = 60;
+ if (st->speed <= 0)
+ st->speed = 2;
+ if (st->number <= 0)
+ st->number=1;
+ if (st->number >= 10)
+ st->number=1;
+ if (st->effect == NULL)
+ st->effect = &move_lense;
+ if (st->reflect) {
+ st->draw = &reflect_draw;
+ st->effect = &move_lense;
+ }
+ if (st->draw == NULL)
+ st->draw = &plain_draw;
+}
+
+static void *
+distort_init (Display *dpy, Window window)
+{
+ struct state *st = (struct state *) calloc (1, sizeof(*st));