#include "screenhack.h"
#include "colors.h"
+#include "erase.h"
-static GC draw_gc;
+static GC draw_gc, erase_gc;
static unsigned int default_fg_pixel;
#define NCOLORSMAX 200
static XColor colors[NCOLORSMAX];
static int colorindex = 0;
static int colorsloth;
-static XPoint *walkers;
+static XPoint *walkers = 0;
static int nwalkers;
static int width, widthb;
static int height;
-static unsigned int *board;
+static unsigned int *board = 0;
#define getdot(x,y) (board[(y*widthb)+(x>>5)] & (1<<(x & 31)))
#define setdot(x,y) (board[(y*widthb)+(x>>5)] |= (1<<(x & 31)))
width = xgwa.width;
widthb = ((xgwa.width + 31) >> 5);
height = xgwa.height;
+ if (board) free(board);
board = (unsigned int *)calloc(widthb * xgwa.height, sizeof(unsigned int));
if(!board) exit(1);
cmap = xgwa.colormap;
}
gcv.foreground = default_fg_pixel = get_pixel_resource("foreground", "Foreground", dpy, cmap);
draw_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+ gcv.foreground = get_pixel_resource ("background", "Background",dpy, cmap);
+ erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
ncolors = NCOLORSMAX;
make_uniform_colormap(dpy, xgwa.visual, cmap, colors, &ncolors, True, &writeable, False);
+ if (ncolors <= 0) {
+ ncolors = 2;
+ colors[0].red = colors[0].green = colors[0].blue = 0;
+ colors[1].red = colors[1].green = colors[1].blue = 0xFFFF;
+ XAllocColor(dpy, cmap, &colors[0]);
+ XAllocColor(dpy, cmap, &colors[1]);
+ }
colorindex = random()%ncolors;
density = get_integer_resource("density", "Integer");
if( density < 1 ) density = 1;
if( density > 100 ) density = 90; /* more like mold than coral */
nwalkers = (width*height*density)/100;
+ if (walkers) free(walkers);
walkers = (XPoint *)calloc(nwalkers, sizeof(XPoint));
if( (XPoint *)0 == walkers ) exit(1);
for( i = 0; i < seeds; i++ ) {
int x, y;
do {
- x = random() % width;
- y = random() % height;
+ x = 1 + random() % (width - 2);
+ y = 1 + random() % (height - 2);
} while( getdot(x, y) );
setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
XDrawPoints(dpy, window, draw_gc, pointbuf, npoints,
CoordModeOrigin);
npoints = 0;
- XSync(dpy, True);
+ XSync(dpy, False);
}
if (color) {
}
if( 0 == nwalkers ) {
- XSync(dpy, True);
+ XSync(dpy, False);
free(pointbuf);
return;
}
XDrawPoints(dpy, window, draw_gc, pointbuf, npoints,
CoordModeOrigin);
npoints = 0;
- XSync(dpy, True);
+ XSync(dpy, False);
}
+ screenhack_handle_events (dpy);
usleep(delay2);
}
}
char *progclass = "Coral";
char *defaults[] = {
- "Coral.background: black",
- "Coral.foreground: white",
- "*density: 25",
- "*seeds: 20", /* too many for 640x480, too few for 1280x1024 */
- "*delay: 5",
- "*delay2: 1000",
- 0
+ ".background: black",
+ ".foreground: white",
+ "*density: 25",
+ "*seeds: 20", /* too many for 640x480, too few for 1280x1024 */
+ "*delay: 5",
+ "*delay2: 1000",
+ 0
};
XrmOptionDescRec options[] = {
Window window;
{
int delay = get_integer_resource ("delay", "Integer");
-
while( 1 ) {
init_coral(dpy, window);
coral(dpy, window);
+ screenhack_handle_events (dpy);
if( delay ) sleep(delay);
+ erase_full_window(dpy, window);
}
}