From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / drift.c
index 56e89b0a1ef85aa61372448008d00dfb8bd7c198..e24a40ee04e8a69e859491c52664b9aadce96adb 100644 (file)
@@ -36,10 +36,10 @@ static const char sccsid[] = "@(#)drift.c   5.00 2000/11/01 xlockmore";
                                  "*count: 30 \n" \
                                  "*ncolors: 200 \n" \
                                  "*fpsSolid: true \n" \
+                                 "*ignoreRotation: True \n" \
 
 # define SMOOTH_COLORS
-# define reshape_drift 0
-# define drift_handle_event 0
+# define release_drift 0
 # include "xlockmore.h"                /* in xscreensaver distribution */
 # include "erase.h"
 #else /* STANDALONE */
@@ -82,7 +82,7 @@ ENTRYPOINT ModeSpecOpt drift_opts =
 
 #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};
@@ -270,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;
@@ -296,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;
                }
        }
@@ -349,11 +350,7 @@ 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);
@@ -672,16 +669,10 @@ draw_drift(ModeInfo * mi)
 }
 
 ENTRYPOINT void
-release_drift(ModeInfo * mi)
+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);
 }
 
 ENTRYPOINT void
@@ -690,6 +681,18 @@ 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 */