From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / julia.c
index d7066b0896e94d2dad8b8d8156423482292330ab..c41aba517f52844c0fae9172354014a5d62408fe 100644 (file)
@@ -46,6 +46,7 @@ static const char sccsid[] = "@(#)julia.c     4.03 97/04/10 xlockmore";
                                        "*ignoreRotation: True   \n" \
 
 # define UNIFORM_COLORS
+# define release_julia 0
 # include "xlockmore.h"                                /* in xscreensaver distribution */
 #else  /* !STANDALONE */
 # include "xlock.h"                                    /* in xlockmore distribution */
@@ -74,7 +75,7 @@ typedef struct {
        int         nbuffers;
        int         redrawing, redrawpos;
        Pixmap      pixmap;
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
        Cursor      cursor;
 #endif
        GC          stippledGC;
@@ -152,6 +153,8 @@ incr(ModeInfo * mi, juliastruct * jp)
          }
 }
 
+static void free_julia (ModeInfo * mi);
+
 ENTRYPOINT void
 init_julia(ModeInfo * mi)
 {
@@ -161,11 +164,7 @@ init_julia(ModeInfo * mi)
        XGCValues   gcv;
        int         i;
 
-       if (julias == NULL) {
-               if ((julias = (juliastruct *) calloc(MI_NUM_SCREENS(mi),
-                                             sizeof (juliastruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, julias, free_julia);
        jp = &julias[MI_SCREEN(mi)];
 
        jp->centerx = MI_WIN_WIDTH(mi) / 2;
@@ -176,7 +175,7 @@ init_julia(ModeInfo * mi)
                jp->depth = 10;
 
 
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
        if (jp->button_down_p && !jp->cursor && !jp->cursor)
          {
                Pixmap bit;
@@ -190,7 +189,7 @@ init_julia(ModeInfo * mi)
                                                                                  0, 0);
                XFreePixmap (display, bit);
          }
-#endif /* HAVE_COCOA */
+#endif /* HAVE_JWXYZ */
 
        if (jp->pixmap != None &&
            jp->circsize != (MIN(jp->centerx, jp->centery) / 60) * 2 + 1) {
@@ -219,14 +218,14 @@ init_julia(ModeInfo * mi)
                        XFreeGC(display, bg_gc);
        }
 
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
        if (MI_WIN_IS_INROOT(mi))
          ;
        else if (jp->circsize > 0)
          XDefineCursor (display, window, jp->cursor);
        else
          XUndefineCursor (display, window);
-#endif /* HAVE_COCOA */
+#endif /* HAVE_JWXYZ */
 
        if (!jp->stippledGC) {
                gcv.foreground = MI_WIN_BLACK_PIXEL(mi);
@@ -334,11 +333,11 @@ draw_julia (ModeInfo * mi)
        /* draw a circle at the c-parameter so you can see it's effect on the
           structure of the julia set */
        XSetForeground(display, jp->stippledGC, MI_WIN_WHITE_PIXEL(mi));
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
        XSetTSOrigin(display, jp->stippledGC, new_circle.x, new_circle.y);
        XSetStipple(display, jp->stippledGC, jp->pixmap);
        XSetFillStyle(display, jp->stippledGC, FillOpaqueStippled);
-#endif /* HAVE_COCOA */
+#endif /* HAVE_JWXYZ */
        XDrawArc(display, window, jp->stippledGC, 
              new_circle.x-jp->circsize/2,
              new_circle.y-jp->circsize/2,
@@ -414,35 +413,27 @@ draw_julia (ModeInfo * mi)
        }
 }
 
-ENTRYPOINT void
-release_julia (ModeInfo * mi)
+static void
+free_julia (ModeInfo * mi)
 {
-       if (julias != NULL) {
-               int         screen;
-
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-                       Display    *display = MI_DISPLAY(mi);
-                       juliastruct *jp = &julias[screen];
-                       int         buffer;
-
-                       if (jp->pointBuffer) {
-                               for (buffer = 0; buffer < jp->nbuffers; buffer++)
-                                       if (jp->pointBuffer[buffer])
-                                               (void) free((void *) jp->pointBuffer[buffer]);
-                               (void) free((void *) jp->pointBuffer);
-                       }
-                       if (jp->stippledGC != None)
-                               XFreeGC(display, jp->stippledGC);
-                       if (jp->pixmap != None)
-                               XFreePixmap(display, jp->pixmap);
-#ifndef HAVE_COCOA
-                       if (jp->cursor)
-                         XFreeCursor (display, jp->cursor);
-#endif
-               }
-               (void) free((void *) julias);
-               julias = NULL;
+       Display    *display = MI_DISPLAY(mi);
+       juliastruct *jp = &julias[MI_SCREEN(mi)];
+       int         buffer;
+
+       if (jp->pointBuffer) {
+               for (buffer = 0; buffer < jp->nbuffers; buffer++)
+                       if (jp->pointBuffer[buffer])
+                               (void) free((void *) jp->pointBuffer[buffer]);
+               (void) free((void *) jp->pointBuffer);
        }
+       if (jp->stippledGC != None)
+               XFreeGC(display, jp->stippledGC);
+       if (jp->pixmap != None)
+               XFreePixmap(display, jp->pixmap);
+#ifndef HAVE_JWXYZ
+       if (jp->cursor)
+         XFreeCursor (display, jp->cursor);
+#endif
 }
 
 ENTRYPOINT void