X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fdrift.c;h=e24a40ee04e8a69e859491c52664b9aadce96adb;hp=8b4aa63ca5df6836e7a26234177c1b7d97b118d9;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hpb=a94197e76a5dea5cb60542840809d6c20d0abbf3 diff --git a/hacks/drift.c b/hacks/drift.c index 8b4aa63c..e24a40ee 100644 --- a/hacks/drift.c +++ b/hacks/drift.c @@ -1,9 +1,8 @@ /* -*- 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 /*- @@ -32,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 @@ -62,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[] = { - {(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}; @@ -134,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; @@ -238,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 @@ -264,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; @@ -290,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; } } @@ -338,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); @@ -604,7 +607,7 @@ draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d) } -void +ENTRYPOINT void draw_drift(ModeInfo * mi) { Window window = MI_WINDOW(mi); @@ -616,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) { @@ -625,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)); } @@ -656,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 */