From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / worm.c
index e57367d5045faff0754dc161ac4fcbdf10554eb1..452ae12dd4e20b7f4baf7585f205d9903dffda16 100644 (file)
@@ -38,10 +38,6 @@ static const char sccsid[] = "@(#)worm.c     4.04 97/07/28 xlockmore";
  */
 
 #ifdef STANDALONE
-# define PROGCLASS "Worm"
-# define HACK_INIT init_worm
-# define HACK_DRAW draw_worm
-# define worm_opts xlockmore_opts
 # define DEFAULTS      "*delay:  17000 \n"     \
                                        "*count:  -20 \n"               \
                                        "*cycles:  10 \n"               \
@@ -52,14 +48,19 @@ static const char sccsid[] = "@(#)worm.c    4.04 97/07/28 xlockmore";
                                        "*right3d: red \n"              \
                                        "*left3d:  blue \n"             \
                                        "*both3d:  magenta \n"  \
-                                       "*none3d:  black \n     "
+                                       "*none3d:  black \n" \
+                                       "*fpsSolid:  true \n" \
+
 # define SMOOTH_COLORS
+# define release_worm 0
+# define reshape_worm 0
+# define worm_handle_event 0
 # include "xlockmore.h"                /* in xscreensaver distribution */
 #else /* STANDALONE */
 # include "xlock.h"            /* in xlockmore distribution */
 #endif /* STANDALONE */
 
-ModeSpecOpt worm_opts =
+ENTRYPOINT ModeSpecOpt worm_opts =
 {0, NULL, 0, NULL, NULL};
 
 #define MINSIZE 1
@@ -240,11 +241,16 @@ worm_doit(ModeInfo * mi, int which, unsigned long color)
        }
 }
 
-static void
-free_worms(wormstruct * wp)
+ENTRYPOINT void
+free_worm(ModeInfo * mi)
 {
+       wormstruct *wp;
        int         wn;
 
+       if(!worms)
+               return;
+       wp = &worms[MI_SCREEN(mi)];
+
        if (wp->worm) {
                for (wn = 0; wn < wp->nw; wn++) {
                        if (wp->worm[wn].circ)
@@ -265,18 +271,14 @@ free_worms(wormstruct * wp)
        }
 }
 
-void
-init_worm(ModeInfo * mi)
+ENTRYPOINT void
+init_worm (ModeInfo * mi)
 {
        wormstruct *wp;
        int         size = MI_SIZE(mi);
        int         i, j;
 
-       if (worms == NULL) {
-               if ((worms = (wormstruct *) calloc(MI_NUM_SCREENS(mi),
-                                              sizeof (wormstruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, worms);
        wp = &worms[MI_SCREEN(mi)];
        if (MI_NPIXELS(mi) <= 2 || MI_WIN_IS_USE3D(mi))
                wp->nc = 2;
@@ -285,7 +287,7 @@ init_worm(ModeInfo * mi)
        if (wp->nc > NUMCOLORS)
                wp->nc = NUMCOLORS;
 
-       free_worms(wp);
+       free_worm(mi);
        wp->nw = MI_BATCHCOUNT(mi);
        if (wp->nw < -MINWORMS)
                wp->nw = NRAND(-wp->nw - MINWORMS + 1) + MINWORMS;
@@ -361,8 +363,8 @@ init_worm(ModeInfo * mi)
                XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
 
-void
-draw_worm(ModeInfo * mi)
+ENTRYPOINT void
+draw_worm (ModeInfo * mi)
 {
        Display    *display = MI_DISPLAY(mi);
        Window      window = MI_WINDOW(mi);
@@ -407,21 +409,9 @@ draw_worm(ModeInfo * mi)
                wp->chromo = 0;
 }
 
-void
-release_worm(ModeInfo * mi)
-{
-       if (worms != NULL) {
-               int         screen;
-
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
-                       free_worms(&worms[screen]);
-               (void) free((void *) worms);
-               worms = NULL;
-       }
-}
-
-void
-refresh_worm(ModeInfo * mi)
+#ifndef STANDALONE
+ENTRYPOINT void
+refresh_worm (ModeInfo * mi)
 {
        if (MI_WIN_IS_USE3D(mi))
                /* The 3D code does drawing&clearing by XORing.  We do not
@@ -438,3 +428,6 @@ refresh_worm(ModeInfo * mi)
                }
        }
 }
+#endif
+
+XSCREENSAVER_MODULE ("Worm", worm)