1
1
/* -*- Mode: C; tab-width: 4 -*- */
2
2
/* lissie --- the Lissajous worm */
4
#if !defined( lint ) && !defined( SABER )
5
static const char sccsid[] = "@(#)lissie.c 4.04 97/07/28 xlockmore";
5
static const char sccsid[] = "@(#)lissie.c 5.00 2000/11/01 xlockmore";
24
24
* other special, indirect and consequential damages.
26
26
* Revision History:
27
* 10-May-97: Compatible with xscreensaver
28
* 18-Aug-96: added refresh-hook.
27
* 01-Nov-2000: Allocation checks
28
* 10-May-1997: Compatible with xscreensaver
29
* 18-Aug-1996: added refresh-hook.
30
* 01-May-1996: written.
33
# define PROGCLASS "Lissie"
34
# define HACK_INIT init_lissie
35
# define HACK_DRAW draw_lissie
36
# define lissie_opts xlockmore_opts
37
# define DEFAULTS "*delay: 10000 \n" \
42
# define SMOOTH_COLORS
43
# include "xlockmore.h" /* in xscreensaver distribution */
35
#define PROGCLASS "Lissie"
36
#define HACK_INIT init_lissie
37
#define HACK_DRAW draw_lissie
38
#define lissie_opts xlockmore_opts
39
#define DEFAULTS "*delay: 10000 \n" \
45
#include "xlockmore.h" /* in xscreensaver distribution */
44
46
#else /* STANDALONE */
45
# include "xlock.h" /* in xlockmore distribution */
47
#include "xlock.h" /* in xlockmore distribution */
46
48
#endif /* STANDALONE */
48
52
ModeSpecOpt lissie_opts =
49
{0, NULL, 0, NULL, NULL};
53
{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
56
ModStruct lissie_description =
57
{"lissie", "init_lissie", "draw_lissie", "release_lissie",
58
"refresh_lissie", "init_lissie", (char *) NULL, &lissie_opts,
59
10000, 1, 2000, -200, 64, 0.6, "",
60
"Shows lissajous worms", 0, NULL};
81
94
int xi, yi, ri, rx, ry, len, pos;
82
95
int redrawing, redrawpos;
83
96
XPoint loc[MAXLISSIELEN];
88
102
int width, height;
90
104
lissiestruct *lissie;
94
static lissstruct *lisses = NULL;
108
static lissstruct *lisses = (lissstruct *) NULL;
127
141
lissie->loc[p].y = lissie->yi + (int) (sin(lissie->ty) * lissie->ry);
130
XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
144
XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
134
148
if (MI_NPIXELS(mi) > 2) {
135
149
XSetForeground(display, gc, MI_PIXEL(mi, lissie->color));
136
if (++lissie->color >= MI_NPIXELS(mi))
150
if (++lissie->color >= (unsigned) MI_NPIXELS(mi))
137
151
lissie->color = 0;
139
XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
153
XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
141
155
if (lissie->redrawing) {
165
179
if (MI_NPIXELS(mi) > 2)
166
180
lissie->color = NRAND(MI_NPIXELS(mi));
168
lissie->color = MI_WIN_WHITE_PIXEL(mi);
182
lissie->color = MI_WHITE_PIXEL(mi);
169
183
/* Initialize parameters */
170
184
if (size < -MINSIZE)
171
185
lissie->ri = NRAND(MIN(-size, MAX(MINSIZE,
215
229
lp = &lisses[MI_SCREEN(mi)];
217
lp->width = MI_WIN_WIDTH(mi);
218
lp->height = MI_WIN_HEIGHT(mi);
231
lp->width = MI_WIDTH(mi);
232
lp->height = MI_HEIGHT(mi);
220
lp->nlissies = MI_BATCHCOUNT(mi);
234
lp->nlissies = MI_COUNT(mi);
221
235
if (lp->nlissies < -MINLISSIES) {
222
236
if (lp->lissie) {
223
237
(void) free((void *) lp->lissie);
238
lp->lissie = (lissiestruct *) NULL;
226
240
lp->nlissies = NRAND(-lp->nlissies - MINLISSIES + 1) + MINLISSIES;
227
241
} else if (lp->nlissies < MINLISSIES)
230
244
lp->loopcount = 0;
233
lp->lissie = (lissiestruct *) calloc(lp->nlissies, sizeof (lissiestruct));
234
XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
246
if (lp->lissie == NULL)
247
if ((lp->lissie = (lissiestruct *) calloc(lp->nlissies,
248
sizeof (lissiestruct))) == NULL)
235
254
for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
236
255
initlissie(mi, &lp->lissie[ball]);
241
260
draw_lissie(ModeInfo * mi)
243
lissstruct *lp = &lisses[MI_SCREEN(mi)];
244
262
register unsigned char ball;
246
if (++lp->loopcount > MI_CYCLES(mi))
267
lp = &lisses[MI_SCREEN(mi)];
268
if (lp->lissie == NULL)
271
MI_IS_DRAWN(mi) = True;
273
if (++lp->loopcount > MI_CYCLES(mi)) {
249
277
for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
250
278
drawlissie(mi, &lp->lissie[ball]);
259
288
for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
260
289
lissstruct *lp = &lisses[screen];
291
if (lp->lissie != NULL) {
263
292
(void) free((void *) lp->lissie);
293
/* lp->lissie = NULL; */
267
296
(void) free((void *) lisses);
297
lisses = (lissstruct *) NULL;
273
302
refresh_lissie(ModeInfo * mi)
275
if (lisses != NULL) {
276
lissstruct *lp = &lisses[MI_SCREEN(mi)];
309
lp = &lisses[MI_SCREEN(mi)];
310
if (lp->lissie == NULL)
279
315
for (i = 0; i < lp->nlissies; i++) {
280
316
lp->lissie[i].redrawing = 1;
281
317
lp->lissie[i].redrawpos = 0;
322
#endif /* MODE_lissie */