From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / grav.c
index c899fa99b0f63dc0155699439054bbdd3a9b5f9a..305b8e81b8bcfe778e76008b5fae68881ce98e5c 100644 (file)
@@ -34,6 +34,7 @@ static const char sccsid[] = "@(#)grav.c      5.00 2000/11/01 xlockmore";
                                        "*ncolors: 64 \n" \
                                        "*fpsSolid: true \n" \
                                        "*ignoreRotation: True \n" \
+                                   "*lowrez: True \n" \
 
 #define BRIGHT_COLORS
 # define release_grav 0
@@ -75,7 +76,7 @@ ENTRYPOINT ModeSpecOpt grav_opts =
 #ifdef USE_MODULES
 ModStruct   grav_description =
 {"grav", "init_grav", "draw_grav", (char *) NULL,
- "refresh_grav", "init_grav", (char *) NULL, &grav_opts,
+ "refresh_grav", "init_grav", "free_grav", &grav_opts,
  10000, -12, 1, 1, 64, 1.0, "",
  "Shows orbiting planets", 0, NULL};
 
@@ -140,9 +141,6 @@ static gravstruct *gravs = (gravstruct *) NULL;
 static void
 init_planet(ModeInfo * mi, planetstruct * planet)
 {
-       Display    *display = MI_DISPLAY(mi);
-       Window      window = MI_WINDOW(mi);
-       GC          gc = MI_GC(mi);
        gravstruct *gp = &gravs[MI_SCREEN(mi)];
 
 # ifdef HAVE_JWXYZ
@@ -171,9 +169,6 @@ init_planet(ModeInfo * mi, planetstruct * planet)
        VEL(X) = FLOATRAND(-VR, VR);
        VEL(Y) = FLOATRAND(-VR, VR);
        VEL(Z) = FLOATRAND(-VR, VR);
-
-       /* Draw planets */
-       Planet(planet->xi, planet->yi);
 }
 
 static void
@@ -236,17 +231,13 @@ draw_planet(ModeInfo * mi, planetstruct * planet)
        Planet(gp->x, gp->y);
 }
 
-static void free_grav(ModeInfo * mi);
-
 ENTRYPOINT void
 init_grav(ModeInfo * mi)
 {
-       Display    *display = MI_DISPLAY(mi);
-       GC          gc = MI_GC(mi);
        unsigned char ball;
        gravstruct *gp;
 
-       MI_INIT (mi, gravs, free_grav);
+       MI_INIT (mi, gravs);
        gp = &gravs[MI_SCREEN(mi)];
 
        gp->width = MI_WIDTH(mi);
@@ -276,11 +267,6 @@ init_grav(ModeInfo * mi)
                gp->starcolor = MI_WHITE_PIXEL(mi);
        for (ball = 0; ball < (unsigned char) gp->nplanets; ball++)
                init_planet(mi, &gp->planets[ball]);
-
-       /* Draw centrepoint */
-       XDrawArc(display, MI_WINDOW(mi), gc,
-                gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
-                0, 23040);
 }
 
 ENTRYPOINT void
@@ -298,6 +284,20 @@ draw_grav(ModeInfo * mi)
        if (gp->planets == NULL)
                return;
 
+       if (!MI_IS_DRAWN(mi)) {
+               for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) {
+                       planetstruct *planet = &gp->planets[ball];
+
+                       /* Draw planets */
+                       Planet(planet->xi, planet->yi);
+               }
+
+               /* Draw centrepoint */
+               XDrawArc(display, MI_WINDOW(mi), gc,
+                        gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+                        0, 23040);
+       }
+
        MI_IS_DRAWN(mi) = True;
        /* Mask centrepoint */
        XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
@@ -335,7 +335,7 @@ reshape_grav(ModeInfo * mi, int width, int height)
     XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
 }
 
-static void
+ENTRYPOINT void
 free_grav(ModeInfo * mi)
 {
        gravstruct *gp = &gravs[MI_SCREEN(mi)];
@@ -343,11 +343,13 @@ free_grav(ModeInfo * mi)
                (void) free((void *) gp->planets);
 }
 
+#ifndef STANDALONE
 ENTRYPOINT void
 refresh_grav(ModeInfo * mi)
 {
        MI_CLEARWINDOW(mi);
 }
+#endif
 
 XSCREENSAVER_MODULE ("Grav", grav)