From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / drift.c
index 50893db90b9fa9c312a6fe2824763a6c79421024..e24a40ee04e8a69e859491c52664b9aadce96adb 100644 (file)
@@ -31,20 +31,20 @@ static const char sccsid[] = "@(#)drift.c   5.00 2000/11/01 xlockmore";
  */
 
 #ifdef STANDALONE
-#define MODE_drift
-#define PROGCLASS "Drift"
-#define HACK_INIT init_drift
-#define HACK_DRAW draw_drift
-#define drift_opts xlockmore_opts
-#define DEFAULTS "*delay: 10000 \n" \
- "*count: 30 \n" \
- "*ncolors: 200 \n"
-#define SMOOTH_COLORS
-#include "xlockmore.h"         /* in xscreensaver distribution */
-#include "erase.h"
+# define MODE_drift
+# define DEFAULTS "*delay: 10000 \n" \
+                                 "*count: 30 \n" \
+                                 "*ncolors: 200 \n" \
+                                 "*fpsSolid: true \n" \
+                                 "*ignoreRotation: True \n" \
+
+# define SMOOTH_COLORS
+# define release_drift 0
+# include "xlockmore.h"                /* in xscreensaver distribution */
+# include "erase.h"
 #else /* STANDALONE */
-#include "xlock.h"             /* in xlockmore distribution */
-
+# define ENTRYPOINT /**/
+# include "xlock.h"            /* in xlockmore distribution */
 #endif /* STANDALONE */
 
 #ifdef MODE_drift
@@ -61,28 +61,28 @@ static Bool liss;
 
 static XrmOptionDescRec opts[] =
 {
-       {(char *) "-grow", (char *) ".drift.grow", XrmoptionNoArg, (caddr_t) "on"},
-       {(char *) "+grow", (char *) ".drift.grow", XrmoptionNoArg, (caddr_t) "off"},
-       {(char *) "-liss", (char *) ".drift.trail", XrmoptionNoArg, (caddr_t) "on"},
-       {(char *) "+liss", (char *) ".drift.trail", XrmoptionNoArg, (caddr_t) "off"}
+       {"-grow", ".drift.grow", XrmoptionNoArg, "on"},
+       {"+grow", ".drift.grow", XrmoptionNoArg, "off"},
+       {"-liss", ".drift.trail", XrmoptionNoArg, "on"},
+       {"+liss", ".drift.trail", XrmoptionNoArg, "off"}
 };
 static argtype vars[] =
 {
        {&grow, "grow", "Grow", DEF_GROW, t_Bool},
-       {&liss, "liss", "Liss", DEF_LISS, t_Bool}
+       {&liss, "trail", "Trail", DEF_LISS, t_Bool}
 };
 static OptionStruct desc[] =
 {
-       {(char *) "-/+grow", (char *) "turn on/off growing fractals, else they are animated"},
-       {(char *) "-/+liss", (char *) "turn on/off using lissojous figures to get points"}
+       {"-/+grow", "turn on/off growing fractals, else they are animated"},
+       {"-/+liss", "turn on/off using lissojous figures to get points"}
 };
 
-ModeSpecOpt drift_opts =
+ENTRYPOINT ModeSpecOpt drift_opts =
 {sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
 
 #ifdef USE_MODULES
 ModStruct   drift_description =
-{"drift", "init_drift", "draw_drift", "release_drift",
+{"drift", "init_drift", "draw_drift", (char *) NULL,
  "refresh_drift", "init_drift", (char *) NULL, &drift_opts,
  10000, 30, 1, 1, 64, 1.0, "",
  "Shows cosmic drifting flame fractals", 0, NULL};
@@ -133,6 +133,11 @@ typedef struct {
        short       lasthalf;
        long        saved_random_bits;
        int         nbits;
+
+#ifdef STANDALONE
+  int erase_countdown;
+  eraser_state *eraser;
+#endif
 } driftstruct;
 
 static driftstruct *drifts = (driftstruct *) NULL;
@@ -237,7 +242,9 @@ initmode(ModeInfo * mi, int mode)
        }
        dp->fractal_len = (dp->fractal_len * MI_COUNT(mi)) / 20;
 
+#ifndef STANDALONE
        MI_CLEARWINDOW(mi);
+#endif
 }
 
 static void
@@ -263,8 +270,9 @@ pick_df_coefs(ModeInfo * mi)
 }
 
 static void
-free_drift(driftstruct *dp)
+free_drift(ModeInfo * mi)
 {
+       driftstruct *dp = &drifts[MI_SCREEN(mi)];
        if (dp->ncpoints != NULL) {
                (void) free((void *) dp->ncpoints);
                dp->ncpoints = (int *) NULL;
@@ -289,14 +297,14 @@ initfractal(ModeInfo * mi)
        if (!dp->ncpoints) {
                if ((dp->ncpoints = (int *) malloc(sizeof (int) * MI_NCOLORS(mi))) ==
                        NULL) {
-                       free_drift(dp);
+                       free_drift(mi);
                        return;
                }
        }
        if (!dp->cpts) {
                if ((dp->cpts = (XPoint *) malloc(MAXBATCH2 * sizeof (XPoint) *
                         MI_NCOLORS(mi))) == NULL) {
-                       free_drift(dp);
+                       free_drift(mi);
                        return;
                }
        }
@@ -337,16 +345,12 @@ initfractal(ModeInfo * mi)
 }
 
 
-void
+ENTRYPOINT void
 init_drift(ModeInfo * mi)
 {
        driftstruct *dp;
 
-       if (drifts == NULL) {
-               if ((drifts = (driftstruct *) calloc(MI_NUM_SCREENS(mi),
-                                             sizeof (driftstruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, drifts, free_drift);
        dp = &drifts[MI_SCREEN(mi)];
 
        dp->width = MI_WIDTH(mi);
@@ -603,7 +607,7 @@ draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d)
 }
 
 
-void
+ENTRYPOINT void
 draw_drift(ModeInfo * mi)
 {
        Window      window = MI_WINDOW(mi);
@@ -615,6 +619,17 @@ draw_drift(ModeInfo * mi)
        if (dp->ncpoints == NULL)
                return;
 
+    if (dp->erase_countdown) {
+      if (!--dp->erase_countdown) {
+        dp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), dp->eraser);
+      }
+      return;
+    }
+    if (dp->eraser) {
+      dp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), dp->eraser);
+      return;
+    }
+
        MI_IS_DRAWN(mi) = True;
        dp->timer = 3000;
        while (dp->timer) {
@@ -624,9 +639,7 @@ draw_drift(ModeInfo * mi)
                        draw_flush(mi, dp, window);
                        if (0 == --dp->nfractals) {
 #ifdef STANDALONE
-                         XSync(MI_DISPLAY(mi), False);
-                         sleep(4); /* #### make settable */
-                         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+              dp->erase_countdown = 4 * 1000000 / MI_PAUSE(mi);
 #endif /* STANDALONE */
                                initmode(mi, frandom(dp, 2));
                        }
@@ -655,23 +668,31 @@ draw_drift(ModeInfo * mi)
        }
 }
 
-void
-release_drift(ModeInfo * mi)
+ENTRYPOINT void
+reshape_drift(ModeInfo * mi, int width, int height)
 {
-       if (drifts != NULL) {
-               int         screen;
-
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-                       free_drift(&drifts[screen]);
-               (void) free((void *) drifts);
-               drifts = (driftstruct *) NULL;
-       }
+  MI_CLEARWINDOW(mi);
+  init_drift (mi);
 }
 
-void
+ENTRYPOINT void
 refresh_drift(ModeInfo * mi)
 {
        MI_CLEARWINDOW(mi);
 }
 
+ENTRYPOINT Bool
+drift_handle_event (ModeInfo *mi, XEvent *event)
+{
+  if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      reshape_drift (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  return False;
+}
+
+
+XSCREENSAVER_MODULE ("Drift", drift)
+
 #endif /* MODE_drift */