/* -*- Mode: C; tab-width: 4 -*- */
/* drift --- drifting recursive fractal cosmic flames */
-#if !defined( lint ) && !defined( SABER )
+#if 0
static const char sccsid[] = "@(#)drift.c 5.00 2000/11/01 xlockmore";
-
#endif
/*-
*/
#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
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[] =
{
- {(caddr_t *) & grow, (char *) "grow", (char *) "Grow", (char *) DEF_GROW, t_Bool},
- {(caddr_t *) & liss, (char *) "liss", (char *) "Liss", (char *) DEF_LISS, t_Bool}
+ {&grow, "grow", "Grow", DEF_GROW, 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};
short lasthalf;
long saved_random_bits;
int nbits;
+
+#ifdef STANDALONE
+ int erase_countdown;
+ eraser_state *eraser;
+#endif
} driftstruct;
static driftstruct *drifts = (driftstruct *) NULL;
}
dp->fractal_len = (dp->fractal_len * MI_COUNT(mi)) / 20;
+#ifndef STANDALONE
MI_CLEARWINDOW(mi);
+#endif
}
static void
}
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;
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;
}
}
}
-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);
}
-void
+ENTRYPOINT void
draw_drift(ModeInfo * mi)
{
Window window = MI_WINDOW(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) {
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));
}
}
}
-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 */