http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.14.tar.gz
[xscreensaver] / hacks / helix.c
index cb6bd38b3e91b96848748b04a9283c9df03dfb86..7ca03da7760377aed93d87006bac39bb71ae977d 100644 (file)
@@ -1,5 +1,5 @@
 /* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997
- *  Jamie Zawinski <jwz@netscape.com>
+ *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -19,6 +19,9 @@
  * 1992:      jwz created.
  */
 
+/* 25 April 2002: Matthew Strait <straitm@mathcs.carleton.edu> added
+-subdelay option so the drawing process can be watched */
+
 #include <math.h>
 #include "screenhack.h"
 #include "erase.h"
 static double sins [360];
 static double coss [360];
 
-static GC draw_gc, erase_gc;
+static GC draw_gc;
 static unsigned int default_fg_pixel;
-static int erase_speed, sleep_time, erase_mode;
-
-void erase_window (Display *dpy, Window win, GC gc, int width, int height,
-                  int mode, int delay);
+static int sleep_time;
+static int subdelay;
 
 static void
 init_helix (Display *dpy, Window window)
@@ -46,7 +47,6 @@ init_helix (Display *dpy, Window window)
     get_pixel_resource ("foreground", "Foreground", dpy, cmap);
   draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
   gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
-  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
 
   for (i = 0; i < 360; i++)
     {
@@ -103,9 +103,12 @@ helix (Display *dpy, Window window,
       XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2);
       x2 = xmid + (((double) radius2) * sins [pmod ((angle * factor3), 360)]);
       y2 = ymid + (((double) radius1) * coss [pmod ((angle * factor4), 360)]);
-
       XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2);
       angle += d_angle;
+
+      /* if we sleep every time, it's too slow */
+      if(subdelay && i%16 == 0) usleep(subdelay);
+
       XFlush (dpy);
     }
 }
@@ -143,6 +146,12 @@ trig (Display *dpy, Window window,
       if (tmp == 0)    /* Do not want it getting stuck... */
        tmp = 1;        /* Would not need if floating point */
       d_angle += dir * tmp;
+
+      /* this draws faster, so we sleep somewhat more often */
+      if(subdelay && d_angle%4 == 0) usleep(subdelay);
+      
+      /* without this, the subdelay effect is lost */
+      XFlush (dpy);
     }
 }
 
@@ -257,7 +266,6 @@ random_trig (Display *dpy, Window window, XColor *color, Bool *got_color)
 static void
 random_helix_or_trig (Display *dpy, Window window)
 {
-  int i;
   Bool free_color = False;
   XColor color;
   int width, height;
@@ -273,13 +281,16 @@ random_helix_or_trig (Display *dpy, Window window)
   else
     random_trig(dpy, window, &color, &free_color);
 
-  XSync (dpy, True);
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
   sleep ( sleep_time );
 
-  erase_window(dpy, window, erase_gc, width, height, erase_mode, erase_speed);
+  screenhack_handle_events (dpy);
+  erase_full_window(dpy, window);
 
   if (free_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0);
-  XSync (dpy, True);
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
   sleep (1);
 }
 
@@ -287,27 +298,24 @@ random_helix_or_trig (Display *dpy, Window window)
 char *progclass = "Helix";
 
 char *defaults [] = {
-  "Helix.background: black",           /* to placate SGI */
-  "Helix.eraseSpeed: 400",
-  "Helix.delay: 5",
-  "Helix.eraseMode: -1",
+  ".background: black",
+  "*delay:      5",
+  "*subdelay:  0",
   0
 };
 
 XrmOptionDescRec options [] = {   
-  { "-erase-speed",    ".eraseSpeed",          XrmoptionSepArg, 0 },
   { "-delay",           ".delay",               XrmoptionSepArg, 0 },
-  { "-erase-mode",      ".eraseMode",           XrmoptionSepArg, 0 },
-  { 0 },
+  { "-subdelay",        ".subdelay",            XrmoptionSepArg, 0 },
+  { 0,                 0,                      0,               0 },
 };
 int options_size = (sizeof (options) / sizeof (options[0]));
 
 void
 screenhack (Display *dpy, Window window)
 {
-  erase_speed = get_integer_resource("eraseSpeed", "Integer");
   sleep_time = get_integer_resource("delay", "Integer");
-  erase_mode = get_integer_resource("eraseMode", "Integer");
+  subdelay = get_integer_resource("subdelay", "Integer");
   init_helix (dpy, window);
   while (1)
     random_helix_or_trig (dpy, window);