From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / braid.c
index efb424289b130a962f0dcb2809839e8ddfdea9fe..a1bb6a47403e4369ce3b61c7290dfc813de183df 100644 (file)
@@ -31,28 +31,26 @@ static const char sccsid[] = "@(#)braid.c   5.00 2000/11/01 xlockmore";
  */
 
 #ifdef STANDALONE
-#define MODE_braid
-#define PROGCLASS "Braid"
-#define HACK_INIT init_braid
-#define HACK_DRAW draw_braid
-#define braid_opts xlockmore_opts
-#define DEFAULTS "*delay: 1000 \n" \
- "*count: 15 \n" \
- "*cycles: 100 \n" \
- "*size: -7 \n" \
- "*ncolors: 64 \n"
-#define UNIFORM_COLORS
-#include "xlockmore.h"
-#include "erase.h"
+# define MODE_braid
+# define DEFAULTS  "*delay: 1000 \n" \
+                                  "*count: 15 \n" \
+                                  "*cycles: 100 \n" \
+                                  "*size: -7 \n" \
+                                  "*ncolors: 64 \n" \
+                                  "*fpsSolid: true \n" \
+                                  "*ignoreRotation: True" \
+
+# define UNIFORM_COLORS
+# include "xlockmore.h"
+# include "erase.h"
 #else /* STANDALONE */
-#include "xlock.h"
-
+# include "xlock.h"
+# define ENTRYPOINT /**/
 #endif /* STANDALONE */
 
 #ifdef MODE_braid
 
-ModeSpecOpt braid_opts =
-{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
+ENTRYPOINT ModeSpecOpt braid_opts = {0, NULL, 0, NULL, NULL};
 
 #ifdef USE_MODULES
 ModStruct   braid_description =
@@ -102,6 +100,9 @@ typedef struct {
        float       top, bottom, left, right;
        int         age;
        int         color_direction;
+#ifdef STANDALONE
+  eraser_state *eraser;
+#endif
 } braidtype;
 
 static braidtype *braids = (braidtype *) NULL;
@@ -161,7 +162,7 @@ applywordbackto(braidtype * braid, int string, int position)
        return c;
 }
 
-void
+ENTRYPOINT void
 init_braid(ModeInfo * mi)
 {
        braidtype  *braid;
@@ -183,7 +184,9 @@ init_braid(ModeInfo * mi)
        /* jwz: go in the other direction sometimes. */
        braid->color_direction = ((LRAND() & 1) ? 1 : -1);
 
+#ifndef STANDALONE
        MI_CLEARWINDOW(mi);
+#endif
 
        min_length = (braid->center_x > braid->center_y) ?
                braid->center_y : braid->center_x;
@@ -196,7 +199,7 @@ init_braid(ModeInfo * mi)
                braid->nstrands = INTRAND(MINSTRANDS,
                                       MAX(MIN(MIN(MAXSTRANDS, MI_COUNT(mi)),
                                               (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS));
-       braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH, braid->nstrands * 6));
+       braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH -1, braid->nstrands * 6));
 
        for (i = 0; i < braid->braidlength; i++) {
                braid->braidword[i] =
@@ -265,7 +268,7 @@ init_braid(ModeInfo * mi)
                        braid->components[i] *= -1;
 }
 
-void
+ENTRYPOINT void
 draw_braid(ModeInfo * mi)
 {
        Display    *display = MI_DISPLAY(mi);
@@ -283,6 +286,13 @@ draw_braid(ModeInfo * mi)
                return;
        braid = &braids[MI_SCREEN(mi)];
 
+#ifdef STANDALONE
+    if (braid->eraser) {
+      braid->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), braid->eraser);
+      return;
+    }
+#endif
+
        MI_IS_DRAWN(mi) = True;
        XSetLineAttributes(display, MI_GC(mi), braid->linewidth,
                           LineSolid,
@@ -430,13 +440,32 @@ draw_braid(ModeInfo * mi)
 
        if (++braid->age > MI_CYCLES(mi)) {
 #ifdef STANDALONE
-         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+      braid->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), braid->eraser);
 #endif
                init_braid(mi);
        }
 }
 
-void
+ENTRYPOINT void
+reshape_braid(ModeInfo * mi, int width, int height)
+{
+  XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+  init_braid (mi);
+}
+
+ENTRYPOINT Bool
+braid_handle_event (ModeInfo *mi, XEvent *event)
+{
+  if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      reshape_braid (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+
+  return False;
+}
+
+ENTRYPOINT void
 release_braid(ModeInfo * mi)
 {
        if (braids != NULL) {
@@ -445,10 +474,12 @@ release_braid(ModeInfo * mi)
        }
 }
 
-void
+ENTRYPOINT void
 refresh_braid(ModeInfo * mi)
 {
        MI_CLEARWINDOW(mi);
 }
 
+XSCREENSAVER_MODULE ("Braid", braid)
+
 #endif /* MODE_braid */