/* -*- Mode: C; tab-width: 4 -*- */
/* crystal --- polygons moving according to plane group rules */
-#if !defined( lint ) && !defined( SABER )
+#if 0
static const char sccsid[] = "@(#)crystal.c 4.12 98/09/10 xlockmore";
-
#endif
/*-
*/
#ifdef STANDALONE
-# define PROGCLASS "Crystal"
-# define HACK_INIT init_crystal
-# define HACK_DRAW draw_crystal
-# define crystal_opts xlockmore_opts
# define DEFAULTS "*delay: 60000 \n" \
"*count: -500 \n" \
"*cycles: 200 \n" \
"*size: -15 \n" \
"*ncolors: 100 \n" \
- "*fullrandom: True \n" \
- "*verbose: False \n"
+ "*fpsSolid: True \n" \
+ "*ignoreRotation: True \n" \
+
# include "xlockmore.h" /* in xscreensaver distribution */
#else /* STANDALONE */
# include "xlock.h" /* in xlockmore distribution */
#define DEF_MAXSIZE "False"
#define DEF_CYCLE "True"
-#define min(a,b) ((a) <= (b) ? (a) : (b))
+#undef NRAND
+#define NRAND(n) ( (n) ? (int) (LRAND() % (n)) : 0)
-#ifdef STANDALONE
-void release_crystal(ModeInfo * mi);
-#endif
+#define min(a,b) ((a) <= (b) ? (a) : (b))
static int nx, ny;
static XrmOptionDescRec opts[] =
{
- {"-nx", "crystal.nx", XrmoptionSepArg, (caddr_t) NULL},
- {"-ny", "crystal.ny", XrmoptionSepArg, (caddr_t) NULL},
- {"-centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "on"},
- {"+centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "off"},
- {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "on"},
- {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "off"},
- {"-cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "on"},
- {"+cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "off"},
- {"-grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "on"},
- {"+grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "off"},
- {"-shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "on"},
- {"+shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "off"}
+ {"-nx", "crystal.nx", XrmoptionSepArg, 0},
+ {"-ny", "crystal.ny", XrmoptionSepArg, 0},
+ {"-centre", ".crystal.centre", XrmoptionNoArg, "on"},
+ {"+centre", ".crystal.centre", XrmoptionNoArg, "off"},
+ {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, "on"},
+ {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, "off"},
+ {"-cell", ".crystal.cell", XrmoptionNoArg, "on"},
+ {"+cell", ".crystal.cell", XrmoptionNoArg, "off"},
+ {"-grid", ".crystal.grid", XrmoptionNoArg, "on"},
+ {"+grid", ".crystal.grid", XrmoptionNoArg, "off"},
+ {"-shift", ".crystal.shift", XrmoptionNoArg, "on"},
+ {"+shift", ".crystal.shift", XrmoptionNoArg, "off"}
};
static argtype vars[] =
{
- {(caddr_t *) & nx, "nx", "nx", DEF_NX, t_Int},
- {(caddr_t *) & ny, "ny", "ny", DEF_NY, t_Int},
- {(caddr_t *) & centre, "centre", "Centre", DEF_CENTRE, t_Bool},
- {(caddr_t *) & maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
- {(caddr_t *) & unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
- {(caddr_t *) & grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
- {(caddr_t *) & cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+ {&nx, "nx", "nx", DEF_NX, t_Int},
+ {&ny, "ny", "ny", DEF_NY, t_Int},
+ {¢re, "centre", "Centre", DEF_CENTRE, t_Bool},
+ {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+ {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+ {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+ {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
};
static OptionStruct desc[] =
{
{"-/+shift", "turn on/off colour cycling"}
};
-ModeSpecOpt crystal_opts =
+ENTRYPOINT ModeSpecOpt crystal_opts =
{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
#ifdef USE_MODULES
}
}
-void
+ENTRYPOINT void init_crystal(ModeInfo * mi);
+ENTRYPOINT void release_crystal(ModeInfo * mi);
+
+
+ENTRYPOINT void
draw_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
int i;
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
if (cryst->no_colors) {
release_crystal(mi);
init_crystal(mi);
/* Rotate colours */
if (cryst->cycle_p) {
- rotate_colors(display, cryst->cmap, cryst->colors, cryst->ncolors,
+ rotate_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors,
cryst->direction);
if (!(LRAND() % 1000))
cryst->direction = -cryst->direction;
XSetFunction(display, cryst->gc, GXcopy);
}
-void
+ENTRYPOINT void
refresh_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
XSetFunction(display, cryst->gc, GXcopy);
}
-void
+ENTRYPOINT void
release_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
MI_BG_PIXEL(mi) = cryst->bg;
#endif
if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+ free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
+ cryst->ncolors);
if (cryst->colors)
(void) free((void *) cryst->colors);
#if 0 /* #### wrong! -jwz */
}
}
-void
+ENTRYPOINT void
init_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
cryst->offset_w = (int) (cryst->b * 0.5);
}
} else {
+ int max_repeat = 10;
cryst->offset_w = -1;
- while (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)) < 4) {
+ while (max_repeat-- &&
+ (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)) < 4)
+ ) {
cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
PI_RAD))) - cell_min) + cell_min;
if (cryst->planegroup > 8)
if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
/* Set up colour map */
if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+ free_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors);
if (cryst->colors)
(void) free((void *) cryst->colors);
cryst->colors = 0;
}
if (!cryst->mono_p) {
if (!(LRAND() % 10))
- make_random_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
- True, True, &cryst->cycle_p, True);
+ make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, True, &cryst->cycle_p, True);
else if (!(LRAND() % 2))
- make_uniform_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
- True, &cryst->cycle_p, True);
+ make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors, True,
+ &cryst->cycle_p, True);
else
- make_smooth_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
- True, &cryst->cycle_p, True);
+ make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, &cryst->cycle_p, True);
}
#if 0 /* #### wrong! -jwz */
XInstallColormap(display, cryst->cmap);
crystal_setupatom(atom0, cryst->gamma);
crystal_drawatom(mi, atom0);
}
- XSync(display, False);
XSetFunction(display, cryst->gc, GXcopy);
}
+
+ENTRYPOINT void
+reshape_crystal(ModeInfo * mi, int width, int height)
+{
+ release_crystal(mi);
+ init_crystal(mi);
+}
+
+ENTRYPOINT Bool
+crystal_handle_event (ModeInfo *mi, XEvent *event)
+{
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reshape_crystal (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Crystal", crystal)