mikew@wyse.wyse.com (Mike Wexler) (12/23/88)
Submitted-by: natham@hp-pcs.hp.com (Nathan Meyers) Posting-number: Volume 2, Issue 49 Archive-name: kaleid2/part01 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: README AUTHOR Makefile kaleid.1 kaleid.c kalicon.h # patchlevel.h # Wrapped by mikew@wyse on Thu Dec 22 09:21:51 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(501 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' XKaleid produces a colorful kaleidoscope display in an X11 window -- it Xwas ported from an MS-DOS program written for the EGA/VGA display. X XFor connoisseurs of window managers, this program does two interesting Xthings: 1) it creates and maintains a window icon, and 2) it observes Xwindow manager sizing hints for its window icon. X XTo make on bsd systems: X X make X XTo make on systems of SYSV descent (such as hp-ux): X X make SYSV X X--------------------- XNathan Meyers XHewlett-Packard Xnathanm@hp-pcd.hp.com END_OF_FILE if test 501 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'AUTHOR' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'AUTHOR'\" else echo shar: Extracting \"'AUTHOR'\" \(369 characters\) sed "s/^X//" >'AUTHOR' <<'END_OF_FILE' XThis X11 implementation is based on a public-domain kaleidoscope program Xby Judson D. McClendon of Sun Valley Systems (Birmingham, AL). XPermission granted to author to port to X11 and publish. X XX11 kaleid program by Nathan Meyers of Hewlett-Packard (internet mail Xaddress nathanm@hp-pcd.hp.com). Permission granted to freely copy and Xdistribute on a non-profit basis. END_OF_FILE if test 369 -ne `wc -c <'AUTHOR'`; then echo shar: \"'AUTHOR'\" unpacked with wrong size! fi # end of 'AUTHOR' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(214 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' XCFLAGS=-O -I/global/include XLDFLAGS=-L/global/lib X Xkaleid: kaleid.o X cc kaleid.o $(CFLAGS) $(LDFLAGS) -o kaleid -lX11 X Xkaleid.o: kaleid.c kalicon.h X cc -c $(CFLAGS) kaleid.c X XSYSV: X @make "CFLAGS=$(CFLAGS) -DSYSV" END_OF_FILE if test 214 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'kaleid.1' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'kaleid.1'\" else echo shar: Extracting \"'kaleid.1'\" \(4591 characters\) sed "s/^X//" >'kaleid.1' <<'END_OF_FILE' X.TH KALEID 1 X.PD X.ad b X.SH NAME Xkaleid \- X11 Kaleidoscope Display X.SH SYNOPSIS X.TP \w'\fBkaleid\fR 'u X\fBkaleid\fR X[\|\fB-display\fR displayname\|] [\|\fB-bg\fR background\|] X[\|\fB-bd\fR border\|] [\|\fB-bw\fR borderwidth\|] X[\|\fB-geometry\fR geometry\|] [\|\fB-delay\fR msec\|] X[\|\fB-icondelay\fR msec\|] [\|\fB-iconic\fR\|] [\|\fB-mono\fR\|] X[\|\fB-mult\fR number\|] [\|\fB-r\fR\|] [\|\fB-randomcolor\fR\|] X.SH HP-UX COMPATIBILITY X.TP 10 XOrigin: XUser Contributed X.SH DESCRIPTION X.I Kaleid Xis an X11 port of Judson McClendon's EGA/VGA Kaleidoscope program from Xthe PC community. \fIKaleid\fR runs a colorful kaleidoscope display in Xan X11 window. The 16-color palette is chosen to approximate the Xdefault palette found on EGA and VGA displays. X.PP XWith window managers that support icon windows (such as \fIuwm\fR), the X\fIkaleid\fR icon is a small kaleidoscope window that runs a slow Xkaleidoscope display (see \fB-icondelay\fR option, below). X.PP XOptions: X.TP .5i X.B -display XSpecify display on which to run; defaults to contents of DISPLAY Xenvironment variable. X.TP X.B -bg XSpecify background color; defaults to black. X.TP X.B -bd XSpecify border color; defaults to white. X.TP X.B -bw XSpecify border width in pixels; defaults to 2. X.TP X.B -geometry XSpecify window geometry; defaults to =300x300+0+0. X.TP X.B -delay XSpecify a delay (in msec) to be performed between drawing each set of Xlines \(em can be used to avoid swamping the X11 server. Defaults to 10 X(100 when \fB-r\fR option, below, is used). X.TP X.B -icondelay XSpecify the delay to be used when drawing to the \fIkaleid\fR icon. XDefaults to 100 msec. X.TP X.B -iconic XCause \fIkaleid\fR to come up in the iconic state. X.TP X.B -mono XForce \fIkaleid\fR to run in monochrome mode (default behavior on Xa monochrome display). X.TP X.B -mult XRun specified number of \fIkaleid\fR windows. Each window is a Xtop-level window with an associated icon. See the note on WINDOW XMANAGER INTERACTIONS (below) for details on where the multiple windows Xget mapped. X.TP X.B -r XRun \fIkaleid\fR in the root window. This option causes \fIkaleid\fR Xto ignore all options irrelevant to running in the root window. X.TP X.B -randomcolor XInstead of the standard palette, use a randomly-generated palette that Xis randomly changed at times during \fIkaleid\fR's execution. This Xoption causes kaleid to allocate read/write color cells instead of Xread-only color cells, and will not work on a display whose default Xvisual type is StaticColor, StaticGray, or TrueColor. X.SH NOTE XSpecifying a delay (icondelay) value of 0 will cause kaleid to draw into Xits window (icon) at top speed, bogging down your server and, if X\fIkaleid\fR is run remotely, your network. The default delay value Xwas chosen to work well on a fast CPU with a fast X server -- it is Xprobably too low for many systems. X.PP XIf \fIkaleid\fR and the server are running on the same CPU, running X\fIkaleid\fR with a higher nice (nice(1)) value will usually produce Xgood results without 1) swamping the server, and 2) requiring you to Ximpose an unpleasantly long delay. X.SH AUTHORSHIP XThere have been many different kaleidoscope programs for many different Xflavors of computers and PCs over the years. This program was modified Xfrom the public-domain kaleidoscope program for IBM PCs by Judson D. XMcClendon (Sun Valley Systems, 329 37th Court N.E., Birmingham, AL, X35215, CompuServe address [74415,1003]). The port to X11 was performed Xby Nathan Meyers of Hewlett-Packard (nathanm@hp-pcd.hp.com). X.SH WINDOW MANAGER INTERACTIONS XSome window managers do not appear to cope very well with window icons, Xresulting in strange icon behavior. \fIUwm\fR does not suffer from this Xproblem, although problems can occur when changing window managers (to Xor from \fIuwm\fR) during execution of \fIkaleid\fR. X.PP XOn window managers that support window icons and that specify icon Xsizing hints, \fIkaleid\fR will respect the icon sizing hints, creating Xthe largest permissible icon. Without icon sizing hints, the default Xicon size is 64x64. X.PP X\fIKaleid\fR maps all of its top-level windows to =+0+0 unless Xoverridden by a geometry string, and all of its icon windows to =+0+0. XWhere the windows and icons actually \fIend up\fR is a function of how Xyour window manager handles placement of windows and icons. \fIUwm\fR, Xfor example, will request manual window placement for each top-level Xwindow if a geometry string is not specified, but will leave all icons Xmapped at =+0+0. Conversely, with window managers that maintain Xgalleries or grids of icons, multiple \fIkaleid\fR icons can be Xspectacular. END_OF_FILE if test 4591 -ne `wc -c <'kaleid.1'`; then echo shar: \"'kaleid.1'\" unpacked with wrong size! fi # end of 'kaleid.1' fi if test -f 'kaleid.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'kaleid.c'\" else echo shar: Extracting \"'kaleid.c'\" \(20946 characters\) sed "s/^X//" >'kaleid.c' <<'END_OF_FILE' X#include <stdio.h> X#include <X11/X.h> X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/Xos.h> X#include <signal.h> X#include "kalicon.h" X X/* X KALEIDOSCOPE (X11 Version) X X Original EGA/VGA version (for IBM PCs and compatibles) by: X Judson D. McClendon X Sun Valley Systems X 329 37th Court N.E. X Birmingham, AL 35215 X Compuserve: [74415,1003] X X Ported to X11 by Nathan Meyers, nathanm@hp-pcd.hp.com. X*/ X Xchar *progname; X X X/* Approximation of CGA/EGA/VGA colors -- (out of standard order) */ Xunsigned long colors[][3] = { { 0x0000, 0x0000, 0x0000 }, /* black */ X { 0xffff, 0xffff, 0xffff }, /* bright white */ X { 0x0000, 0x0000, 0xaaaa }, /* blue */ X { 0x0000, 0xaaaa, 0x0000 }, /* green */ X { 0x0000, 0xaaaa, 0xaaaa }, /* cyan */ X { 0xaaaa, 0x0000, 0x0000 }, /* red */ X { 0xaaaa, 0x0000, 0xaaaa }, /* magenta */ X { 0xaaaa, 0x5555, 0x0000 }, /* brown */ X { 0xaaaa, 0xaaaa, 0xaaaa }, /* white */ X { 0x5555, 0x5555, 0x5555 }, /* dark grey */ X { 0x5555, 0x5555, 0xffff }, /* light blue */ X { 0x5555, 0xffff, 0x5555 }, /* light green */ X { 0x5555, 0xffff, 0xffff }, /* light cyan */ X { 0xffff, 0x5555, 0x5555 }, /* light red */ X { 0xffff, 0x5555, 0xffff }, /* light magenta */ X { 0xffff, 0xffff, 0x5555 } }; /* yellow */ X X#define NCOLORS 16 X Xstatic char *what = "@(#)kaleid.c $Revision: 1.60 $"; X XDisplay *display; Xint screen; X Xvoid refreshrootquit() X{ X XClearWindow(display,RootWindow(display,screen)); X XSync(display,0); X exit(0); X} X Xint nwindows=1, nvisible=0; Xint *visible; XWindow *window; Xint *CX, *CY, *M; Xint *X1, *Y1, *X2, *Y2, *XV1, *YV1, *XV2, *YV2, *HC; Xint *XA, *YA, *XB, *YB, *XC, *YC, *XD, *YD; Xstruct timeval *schedule, *intervals; Xint numcolors; Xint dynamic_colors=0; Xunsigned long palette[NCOLORS]; Xlong rndm(); X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X unsigned long bgcolor, bdcolor; X int bwidth = 2; X int i; X XSizeHints size_hints; X XIconSize icon_size_hints, *icon_size_list; X int numsizes, currsize; X XWMHints wm_hints; X char *displayname = NULL, *background = NULL, *border = NULL; X char *geomstring = NULL; X GC color_gcs[NCOLORS]; X XColor screen_in_out, visual_def_return, exact_def_return; X int o_argc = argc; X char **o_argv = argv; X XEvent event; X long time(); X int doroot = 0; X int delayvalue = -1, icondelay=100; X int iconic=0; X int monochrome=0; X char *basename, *strrchr(); X X progname = argv[0]; X X if ((basename=strrchr(progname,'/'))!=NULL) basename++; X else basename=progname; X X while (--argc>0) { X char *option = (*++argv); X if (!strcmp(option,"-display")) { X if (--argc==0) usage(); X displayname = (*++argv); X } X else if (strchr(option,':')) { X displayname = option; X } X else if (!strcmp(option,"-bg")) { X if (--argc==0) usage(); X background = (*++argv); X } X else if (!strcmp(option,"-bd")) { X if (--argc==0) usage(); X border = (*++argv); X } X else if (!strcmp(option,"-bw")) { X if (--argc==0) usage(); X bwidth = atoi(*++argv); X if (bwidth<0) bwidth = 0; X } X else if (!strcmp(option,"-delay")) { X if (--argc==0) usage(); X delayvalue = atoi(*++argv); X if (delayvalue<0) delayvalue = 0; X } X else if (!strcmp(option,"-icondelay")) { X if (--argc==0) usage(); X icondelay = atoi(*++argv); X if (icondelay<0) icondelay = 0; X } X else if (!strcmp(option,"-iconic")) { X iconic = 1; X } X else if (!strcmp(option,"-geometry")) { X if (--argc==0) usage(); X geomstring = (*++argv); X } X else if (*option=='=') { X geomstring = option; X } X else if (!strcmp(option,"-mono")) { X monochrome=1; X } X else if (!strcmp(option,"-mult")) { X if (--argc==0) usage(); X nwindows = atoi(*++argv); X if (nwindows<1) nwindows = 1; X } X else if (!strcmp(option,"-r")) { X doroot = 1; X } X else if (!strcmp(option,"-root")) { X doroot = 1; X } X else if (!strcmp(option,"-randomcolor")) { X dynamic_colors = 1; X } X else usage(); X } X X if (delayvalue == -1) delayvalue = doroot ? 100 : 10; X X display = XOpenDisplay(displayname); X if (display==NULL) { X (void)fprintf(stderr, X (displayname==NULL) ? X "%s: Failed to open display.\n" : X "%s: Failed to open display %s.\n", X progname,displayname); X exit(1); X } X screen = DefaultScreen(display); X X if (background == NULL || X XAllocNamedColor(display, X DefaultColormap(display,screen), X background, X &visual_def_return, X &exact_def_return)==False) X bgcolor = BlackPixel(display,screen); X else bgcolor = exact_def_return.pixel; X X if (border==NULL || X XAllocNamedColor(display, X DefaultColormap(display,screen), X border, X &visual_def_return, X &exact_def_return)==False) X bdcolor = WhitePixel(display,screen); X else bdcolor = exact_def_return.pixel; X X if (!monochrome && DisplayCells(display,screen) > 2) { X if (dynamic_colors) { X for (numcolors=NCOLORS; numcolors>=2; numcolors--) { X if (XAllocColorCells(display,DefaultColormap(display,screen), X 0, (unsigned long *)NULL, 0, X palette, (unsigned int)numcolors) == True) { X randomize_colors(); X break; X } X } X if (numcolors < 2) fatalerror("Cannot allocate R/W color cells",NULL); X } X else { X for (numcolors=0; numcolors<NCOLORS; numcolors++) { X screen_in_out.flags = DoRed | DoGreen | DoBlue; X screen_in_out.red = colors[numcolors][0]; X screen_in_out.green = colors[numcolors][1]; X screen_in_out.blue = colors[numcolors][2]; X if (XAllocColor(display, DefaultColormap(display,screen), X &screen_in_out)==False) { X if (numcolors < 2) fatalerror("Cannot allocate colors",NULL); X break; X } X palette[numcolors] = screen_in_out.pixel; X } X } X } X else { X numcolors=2; X palette[0] = WhitePixel(display,screen); X palette[1] = BlackPixel(display,screen); X } X X size_hints.x = 0; X size_hints.y = 0; X size_hints.width = 300; X size_hints.height = 300; X X size_hints.flags = PPosition | PSize; X if (geomstring!=NULL) { X int result; X result = XParseGeometry(geomstring,&size_hints.x,&size_hints.y, X &size_hints.width,&size_hints.height); X if (result & XNegative) X size_hints.x += DisplayWidth(display,screen) X - size_hints.width X - bwidth*2; X if (result & YNegative) X size_hints.y += DisplayHeight(display,screen) X - size_hints.height X - bwidth*2; X if (result & XValue || result & YValue) { X size_hints.flags |= USPosition; X size_hints.flags &= ~PPosition; X } X if (result & WidthValue || result & HeightValue) { X size_hints.flags |= USSize; X size_hints.flags &= ~PSize; X } X } X X if (doroot) { X char *calloc(); X if (!allocate_arrays(1)) { X (void)fprintf(stderr,"%s: malloc() failure\n",progname); X exit(1); X } X intervals[0].tv_sec = delayvalue/1000; X intervals[0].tv_usec = (delayvalue % 1000) * 1000; X window[0] = RootWindow(display,screen); X } X else { X Pixmap bitmapicon; X char *calloc(); X X if (!allocate_arrays((unsigned)(2*nwindows))) { X (void)fprintf(stderr,"%s: malloc() failure\n",progname); X exit(1); X } X X for (i=0; i<nwindows; i++) X window[i] = XCreateSimpleWindow(display,RootWindow(display,screen), X size_hints.x,size_hints.y, X size_hints.width,size_hints.height, X bwidth,bdcolor,bgcolor); X X icon_size_hints.max_width=64; X icon_size_hints.max_height=64; X currsize=0; X if (XGetIconSizes(display,RootWindow(display,screen), X &icon_size_list,&numsizes)) { X for (i=1; i<numsizes; i++) { /* Look for largest icon size */ X if (icon_size_list[i].max_width >= icon_size_list[currsize].max_width && X icon_size_list[i].max_height >= icon_size_list[currsize].max_height) X currsize=i; X } X if (icon_size_list[currsize].max_width <= 0 || X icon_size_list[currsize].max_height <= 0 ) { X XFree(icon_size_list); X icon_size_list = &icon_size_hints; X } X } X else X icon_size_list = &icon_size_hints; X X for (i=0; i<nwindows; i++) { X window[i+nwindows] = XCreateSimpleWindow(display, X RootWindow(display,screen), 0,0, X icon_size_list[currsize].max_width, X icon_size_list[currsize].max_height, X 2,BlackPixel(display,screen), X WhitePixel(display,screen)); X X CX[i+nwindows] = icon_size_list[currsize].max_width >> 1; X CY[i+nwindows] = icon_size_list[currsize].max_height >> 1; X M[i+nwindows] = (CX[i+nwindows]>CY[i+nwindows]) ? X CX[i+nwindows] : X CY[i+nwindows]; X M[i+nwindows] = M[i+nwindows] ? M[i+nwindows] : 1; X } X X if (icon_size_list != &icon_size_hints) XFree(icon_size_list); X X for (i=0; i<nwindows; i++) X XSetStandardProperties(display,window[i],"Kaleidoscope",basename, X None,o_argv,o_argc,&size_hints); X X /* Create bitmap icon for wm's that don't support window icons */ X bitmapicon=XCreateBitmapFromData(display,RootWindow(display,screen), X icon_bits, icon_width, icon_height); X X /* Use window icon for window managers that support one */ X wm_hints.icon_pixmap = bitmapicon; X wm_hints.flags = IconPixmapHint | IconWindowHint; X X if (iconic) { X wm_hints.initial_state = IconicState; X wm_hints.flags |= StateHint; X } X X for (i=0; i<nwindows; i++) { X wm_hints.icon_window = window[i+nwindows]; X XSetWMHints(display,window[i],&wm_hints); X XSelectInput(display,window[i], X StructureNotifyMask|VisibilityChangeMask); X XSelectInput(display,window[i+nwindows], X StructureNotifyMask|VisibilityChangeMask); X XMapWindow(display,window[i]); X X intervals[i].tv_sec = delayvalue/1000; X intervals[i].tv_usec = (delayvalue % 1000) * 1000; X intervals[i+nwindows].tv_sec = icondelay/1000; X intervals[i+nwindows].tv_usec = (icondelay % 1000) * 1000; X X CX[i] = size_hints.width/2; X CY[i] = size_hints.height/2; X M[i] = (CX[i]>CY[i]) ? CX[i] : CY[i]; X M[i] = M[i] ? M[i] : 1; X } X X } X X for (i = 0; i<numcolors; i++) { X XGCValues values; X values.foreground = palette[i]; X color_gcs[i] = XCreateGC(display,window[0],GCForeground,&values); X } X X nwindows <<= 1; X if (doroot) { X nwindows=1; X nvisible=1; X visible[0]=1; X } X X srand48(time((long *)NULL)); X X for (;;) { X int winno; X for (winno=0; winno<nwindows; winno++) if (visible[winno]) break; X if (doroot) { X int dontcare; X Window wdontcare; X struct sigvec vec; X XGetGeometry(display,RootWindow(display,screen),&wdontcare,&dontcare, X &dontcare, &CX[0], &CY[0], &dontcare, &dontcare); X CX[0] >>= 1; X CY[0] >>= 1; X M[0] = (CX[0]>CY[0]) ? CX[0] : CY[0]; X M[0] = M[0] ? M[0] : 1; X vec.sv_handler = refreshrootquit; X vec.sv_mask = 0x0; X vec.sv_flags = 0; X (void)sigvec(SIGINT, &vec, (struct sigvec *)NULL); X (void)sigvec(SIGQUIT, &vec, (struct sigvec *)NULL); X (void)sigvec(SIGTERM, &vec, (struct sigvec *)NULL); X } X while (nvisible) { X if (!rndm(50L)) { X X1[winno] = rndm((long)M[winno]) + 1; X X2[winno] = rndm((long)M[winno]) + 1; X Y1[winno] = rndm((long)X1[winno]); X Y2[winno] = rndm((long)X2[winno]); X } X if (!rndm(10L)) { X XV1[winno] = rndm(7L)-3; X XV2[winno] = rndm(7L)-3; X YV1[winno] = rndm(7L)-3; X YV2[winno] = rndm(7L)-3; X HC[winno] = rndm((long)numcolors); X } X if (CX[winno]<CY[winno]) { X XA[winno] = (long)X1[winno]*(long)CX[winno]/(long)CY[winno]; X YA[winno] = (long)Y1[winno]*(long)CX[winno]/(long)CY[winno]; X XB[winno] = X1[winno]; X YB[winno] = Y1[winno]; X XC[winno] = (long)X2[winno]*(long)CX[winno]/(long)CY[winno]; X YC[winno] = (long)Y2[winno]*(long)CX[winno]/(long)CY[winno]; X XD[winno] = X2[winno]; X YD[winno] = Y2[winno]; X } X else { X XA[winno] = X1[winno]; X YA[winno] = Y1[winno]; X XB[winno] = (long)X1[winno]*(long)CY[winno]/(long)CX[winno]; X YB[winno] = (long)Y1[winno]*(long)CY[winno]/(long)CX[winno]; X XC[winno] = X2[winno]; X YC[winno] = Y2[winno]; X XD[winno] = (long)X2[winno]*(long)CY[winno]/(long)CX[winno]; X YD[winno] = (long)Y2[winno]*(long)CY[winno]/(long)CX[winno]; X } X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]+XA[winno], X CY[winno]-YB[winno], X CX[winno]+XC[winno], X CY[winno]-YD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]-YA[winno], X CY[winno]+XB[winno], X CX[winno]-YC[winno], X CY[winno]+XD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]-XA[winno], X CY[winno]-YB[winno], X CX[winno]-XC[winno], X CY[winno]-YD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]-YA[winno], X CY[winno]-XB[winno], X CX[winno]-YC[winno], X CY[winno]-XD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]-XA[winno], X CY[winno]+YB[winno], X CX[winno]-XC[winno], X CY[winno]+YD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]+YA[winno], X CY[winno]-XB[winno], X CX[winno]+YC[winno], X CY[winno]-XD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]+XA[winno], X CY[winno]+YB[winno], X CX[winno]+XC[winno], X CY[winno]+YD[winno]); X XDrawLine(display,window[winno],color_gcs[HC[winno]], X CX[winno]+YA[winno], X CY[winno]+XB[winno], X CX[winno]+YC[winno], X CY[winno]+XD[winno]); X XFlush(display); X X1[winno]= (X1[winno] + XV1[winno]) % M[winno]; X Y1[winno]= (Y1[winno] + YV1[winno]) % M[winno]; X X2[winno]= (X2[winno] + XV2[winno]) % M[winno]; X Y2[winno]= (Y2[winno] + YV2[winno]) % M[winno]; X if (!rndm(500L)) XClearWindow(display,window[winno]); X if (dynamic_colors && !rndm((long)(800/numcolors))) randomize_color(); X winno=scheduler(); X if (XCheckMaskEvent(display,~0L,&event)==True) handle_event(&event); X } X XNextEvent(display,&event); X handle_event(&event); X } X} X Xrandomize_color() X{ X int i; X XColor color; X color.pixel = palette[rndm((long)numcolors)]; X color.red = rndm(65535L); X color.green = rndm(65535L); X color.blue = rndm(65535L); X color.flags = DoRed|DoGreen|DoBlue; X XStoreColor(display, DefaultColormap(display,screen), &color); X} X Xrandomize_colors() X{ X int i; X XColor color[NCOLORS]; X for (i=0; i<numcolors; i++) { X color[i].pixel = palette[i]; X color[i].red = rndm(65535L); X color[i].green = rndm(65535L); X color[i].blue = rndm(65535L); X color[i].flags = DoRed|DoGreen|DoBlue; X } X XStoreColors(display, DefaultColormap(display,screen), color, numcolors); X} X Xhandle_event(event) XXEvent *event; X{ X int i; X if (event->type==ConfigureNotify) { X for (i=0; i<nwindows; i++) { X if (event->xconfigure.window==window[i]) { X if (CX[i] != event->xconfigure.width/2 || X CY[i] != event->xconfigure.height/2) X XClearWindow(display,event->xconfigure.window); X CX[i] = event->xconfigure.width/2; X CY[i] = event->xconfigure.height/2; X M[i] = (CX[i]>CY[i]) ? CX[i] : CY[i]; X M[i] = M[i] ? M[i] : 1; X break; X } X } X } X else if (event->type==MapNotify) { X for (i=0; i<nwindows; i++) { X if (event->xmap.window==window[i]) { X X1[i] = rndm((long)M[i]) + 1; X X2[i] = rndm((long)M[i]) + 1; X Y1[i] = rndm((long)X1[i]); X Y2[i] = rndm((long)X2[i]); X XV1[i] = rndm(7L)-3; X XV2[i] = rndm(7L)-3; X YV1[i] = rndm(7L)-3; X YV2[i] = rndm(7L)-3; X HC[i] = rndm((long)numcolors); X break; X } X } X } X else if (event->type==VisibilityNotify) { X for (i=0; i<nwindows; i++) { X if (event->xvisibility.window==window[i]) { X if (visible[i] && X event->xvisibility.state == VisibilityFullyObscured) { X visible[i]=0; X nvisible--; X } X else if (!visible[i] && X event->xvisibility.state != VisibilityFullyObscured) { X visible[i]=1; X nvisible++; X } X break; X } X } X } X} X Xusage() X{ X int i; X (void)fprintf(stderr,"Usage: %s [-display <displayname>] [-bg <background>]", X progname); X (void)fprintf(stderr," [-bd <border>]\n"); X for (i = 0; i<(strlen(progname)+8); i++) (void)putc(' ',stderr); X (void)fprintf(stderr,"[-bw <borderwidth>] [-geometry <geometry>]"); X (void)fprintf(stderr," [-delay <msec>]\n"); X for (i = 0; i<(strlen(progname)+8); i++) (void)putc(' ',stderr); X (void)fprintf(stderr,"[-icondelay <msec>] [-iconic] [-mono]"); X (void)fprintf(stderr," [-mult <number>] -r\n"); X for (i = 0; i<(strlen(progname)+8); i++) (void)putc(' ',stderr); X (void)fprintf(stderr,"[-randomcolor]\n"); X exit(1); X} X Xfatalerror(s1,s2) Xchar *s1,*s2; X{ X (void)fprintf(stderr,"%s: ",progname); X (void)fprintf(stderr,s1,s2); X (void)putc('\n',stderr); X exit(1); X} X Xlong rndm(maxval) Xlong maxval; X{ X long lrand48(); X return ((lrand48() >> 15) * maxval) >> 16; X} X Xallocate_arrays(nwin) Xunsigned nwin; X{ X char *calloc(); X if ((window=(Window *)calloc(nwin,sizeof(Window))) == NULL) return 0; X if ((CX=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((CY=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((M=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((visible=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((X1=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((Y1=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((X2=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((Y2=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XV1=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YV1=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XV2=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YV2=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((HC=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XA=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YA=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XB=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YB=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XC=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YC=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((XD=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((YD=(int *)calloc(nwin,sizeof(int))) == NULL) return 0; X if ((schedule=(struct timeval *)calloc(nwin,sizeof(struct timeval))) == NULL) X return 0; X if ((intervals=(struct timeval *)calloc(nwin,sizeof(struct timeval))) == NULL) X return 0; X return 1; X} X Xint scheduler() X{ X struct timeval currtime, *nextalarm, *alarmindex; X struct timezone tzp; X int i; X X /* Get current time */ X (void)gettimeofday(&currtime, &tzp); X X /* Find earliest alarm due */ X alarmindex = nextalarm = schedule; X for (i=1; i<nwindows; i++) { X if (visible[++alarmindex - schedule] && X ( alarmindex->tv_sec < nextalarm->tv_sec || X alarmindex->tv_sec == nextalarm->tv_sec && X alarmindex->tv_usec < nextalarm->tv_usec )) X nextalarm = alarmindex; X } X X /* If the next alarm is not past due, sleep until it comes due */ X if (currtime.tv_sec < nextalarm->tv_sec || X currtime.tv_sec == nextalarm->tv_sec && X currtime.tv_usec < nextalarm->tv_usec) { X struct timeval timeout; X int fd=ConnectionNumber(display), readfds; X X timeout.tv_sec = 0; X timeout.tv_usec = 0; X timeout.tv_sec = nextalarm->tv_sec - currtime.tv_sec; X timeout.tv_usec = nextalarm->tv_usec - currtime.tv_usec; X if (timeout.tv_usec < 0) { X timeout.tv_sec -= 1L; X timeout.tv_usec += 1000000L; X } X X readfds = 1<<fd; X (void)select(fd+1, &readfds, NULL, NULL, &timeout); X X /* Recompute current time */ X (void)gettimeofday(&currtime, &tzp); X X } X X /* Set next alarm to current time + interval */ X nextalarm->tv_sec = currtime.tv_sec + intervals[nextalarm-schedule].tv_sec; X nextalarm->tv_usec = currtime.tv_usec + intervals[nextalarm-schedule].tv_usec; X if (nextalarm->tv_usec >= 1000000) { X nextalarm->tv_sec += 1; X nextalarm->tv_usec -= 1000000; X } X X /* Return index of next alarm */ X return nextalarm-schedule; X} END_OF_FILE if test 20946 -ne `wc -c <'kaleid.c'`; then echo shar: \"'kaleid.c'\" unpacked with wrong size! fi # end of 'kaleid.c' fi if test -f 'kalicon.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'kalicon.h'\" else echo shar: Extracting \"'kalicon.h'\" \(3360 characters\) sed "s/^X//" >'kalicon.h' <<'END_OF_FILE' X/* Kaleidoscope icon -- for window managers that do not support window X icons. */ X X#define icon_width 64 X#define icon_height 64 Xstatic char icon_bits[] = { X 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, X 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, X 0xff, 0xf3, 0xff, 0xbb, 0xbb, 0xff, 0x9f, 0xff, 0xff, 0xcf, 0xff, 0x77, X 0xdd, 0xff, 0xe7, 0xff, 0xff, 0x33, 0xff, 0x6f, 0xed, 0xff, 0x99, 0xff, X 0xff, 0xcf, 0xfc, 0xeb, 0xae, 0x7f, 0xe6, 0xff, 0xff, 0x3f, 0xf3, 0x57, X 0xd4, 0x9f, 0xf9, 0xff, 0xff, 0xcf, 0xc8, 0x37, 0xd9, 0x27, 0xe6, 0xff, X 0xfb, 0x3f, 0x27, 0x2b, 0xa9, 0xc9, 0xf9, 0xbf, 0xd7, 0xff, 0x9c, 0x94, X 0x52, 0x72, 0xfe, 0xd7, 0xd7, 0xbf, 0x73, 0x90, 0x12, 0x9c, 0xf9, 0xd7, X 0xaf, 0x7e, 0xce, 0x03, 0x81, 0x67, 0xfe, 0xea, 0xaf, 0xfe, 0x39, 0x07, X 0x81, 0x99, 0xff, 0xea, 0x5f, 0xf5, 0xe6, 0x00, 0x00, 0xe6, 0x5e, 0xf5, X 0x5f, 0xed, 0x99, 0x03, 0x80, 0x39, 0x5f, 0xf5, 0xbf, 0xaa, 0x67, 0x06, X 0x41, 0xce, 0xab, 0xfa, 0xbf, 0x5a, 0x9b, 0x11, 0x88, 0xb3, 0xad, 0xfa, X 0x7f, 0x56, 0x65, 0x02, 0x81, 0x4c, 0xd5, 0xfc, 0x7f, 0xb5, 0x9a, 0x01, X 0x00, 0xb3, 0x56, 0xfd, 0xff, 0xac, 0x6a, 0x20, 0x08, 0xac, 0x6a, 0xfe, X 0xff, 0x6a, 0x95, 0x08, 0x01, 0x52, 0xab, 0xfe, 0xff, 0x59, 0x55, 0x22, X 0x81, 0x54, 0x35, 0xff, 0xff, 0xd5, 0xaa, 0x28, 0x08, 0xaa, 0x55, 0xff, X 0xff, 0xb3, 0x0a, 0x98, 0x32, 0xa0, 0x9a, 0xff, 0xff, 0xb3, 0x45, 0x64, X 0x4c, 0xc4, 0x9a, 0xff, 0xb7, 0x25, 0x01, 0x4a, 0xa4, 0x00, 0x41, 0xdb, X 0x6f, 0x02, 0x00, 0x05, 0x41, 0x0b, 0x80, 0xec, 0x9f, 0x0d, 0x02, 0x21, X 0x08, 0x01, 0x60, 0xf3, 0x7f, 0x03, 0x90, 0x12, 0x91, 0x96, 0x80, 0xfd, X 0xf7, 0x00, 0x00, 0xc6, 0xc7, 0x00, 0x00, 0xde, 0x4f, 0x0c, 0x00, 0xc1, X 0x07, 0x01, 0x60, 0xe4, 0xbf, 0x33, 0x65, 0xe8, 0x2f, 0x4c, 0x99, 0xf9, X 0x4f, 0x0c, 0x00, 0xc1, 0x07, 0x01, 0x60, 0xe4, 0xf7, 0x00, 0x00, 0xc6, X 0xc7, 0x00, 0x00, 0xde, 0x7f, 0x03, 0x90, 0x12, 0x91, 0x96, 0x80, 0xfd, X 0x9f, 0x0d, 0x02, 0x21, 0x08, 0x01, 0x60, 0xf3, 0x6f, 0x02, 0x00, 0x05, X 0x41, 0x0b, 0x80, 0xec, 0xb7, 0x25, 0x01, 0x4a, 0xa4, 0x00, 0x41, 0xdb, X 0xff, 0xb3, 0x45, 0x64, 0x4c, 0xc4, 0x9a, 0xff, 0xff, 0xb3, 0x0a, 0x98, X 0x32, 0xa0, 0x9a, 0xff, 0xff, 0xd5, 0xaa, 0x28, 0x08, 0xaa, 0x55, 0xff, X 0xff, 0x59, 0x55, 0x22, 0x81, 0x54, 0x35, 0xff, 0xff, 0x6a, 0x95, 0x08, X 0x01, 0x52, 0xab, 0xfe, 0xff, 0xac, 0x6a, 0x20, 0x08, 0xac, 0x6a, 0xfe, X 0x7f, 0xb5, 0x9a, 0x01, 0x00, 0xb3, 0x56, 0xfd, 0x7f, 0x56, 0x65, 0x02, X 0x81, 0x4c, 0xd5, 0xfc, 0xbf, 0x5a, 0x9b, 0x11, 0x88, 0xb3, 0xad, 0xfa, X 0xbf, 0xaa, 0x67, 0x06, 0x41, 0xce, 0xab, 0xfa, 0x5f, 0xed, 0x99, 0x03, X 0x80, 0x39, 0x5f, 0xf5, 0x5f, 0xf5, 0xe6, 0x00, 0x00, 0xe6, 0x5e, 0xf5, X 0xaf, 0xfe, 0x39, 0x07, 0x81, 0x99, 0xff, 0xea, 0xaf, 0x7e, 0xce, 0x03, X 0x81, 0x67, 0xfe, 0xea, 0xd7, 0xbf, 0x73, 0x90, 0x12, 0x9c, 0xf9, 0xd7, X 0xd7, 0xff, 0x9c, 0x94, 0x52, 0x72, 0xfe, 0xd7, 0xfb, 0x3f, 0x27, 0x2b, X 0xa9, 0xc9, 0xf9, 0xbf, 0xff, 0xcf, 0xc8, 0x37, 0xd9, 0x27, 0xe6, 0xff, X 0xff, 0x3f, 0xf3, 0x57, 0xd4, 0x9f, 0xf9, 0xff, 0xff, 0xcf, 0xfc, 0xeb, X 0xae, 0x7f, 0xe6, 0xff, 0xff, 0x33, 0xff, 0x6f, 0xed, 0xff, 0x99, 0xff, X 0xff, 0xcf, 0xff, 0x77, 0xdd, 0xff, 0xe7, 0xff, 0xff, 0xf3, 0xff, 0xbb, X 0xbb, 0xff, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, X 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; END_OF_FILE if test 3360 -ne `wc -c <'kalicon.h'`; then echo shar: \"'kalicon.h'\" unpacked with wrong size! fi # end of 'kalicon.h' fi if test -f 'patchlevel.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patchlevel.h'\" else echo shar: Extracting \"'patchlevel.h'\" \(21 characters\) sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE' X#define PATCHLEVEL 2 END_OF_FILE if test 21 -ne `wc -c <'patchlevel.h'`; then echo shar: \"'patchlevel.h'\" unpacked with wrong size! fi # end of 'patchlevel.h' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330 Moderator of comp.sources.x