jym@berkeley.edu (Jym Dyer) (01/11/91)
___ __ Eons ago I asked about a client that would put a granite _ pattern on an root (X) window. Somebody sent me one. I enhanced it a tad and ported it to VMS. The source below will run on Un*x and VMS. ___ __ The source is in Un*x "ar" format, which I chose because _ I don't have "shar" or VMS_SHARE or anything, and because the "ar" archive can be all text. The files are between headers that end with a backquote, and the headers contain the names of the files. At any rate, just save it into a file called xgranite.ar and run "ar" or your favorite editor on it to get these files: 0-README-0.txt xgranite.c xgranite.man xgranite.opt ___ __ If anyone wants to repackage this with VMS_SHARE and post _ it to vmsnet.sources, be my guest. <_Jym_> -------------8<--------------Cut-Here--------------8<------------- !<arch> 0-README-0.txt 663548381 201 10 100644 792 ` These are the source files for xgranite, a client to generate a granite pattern for the background (root) window. These sources will work on a Un*x or VMS system. The Un*x command to build xgranite is generally this: cc -o xgranite -lX11 xgranite.c On VMS, you must first have the X11 logical name defined to include the DECW$INCLUDE path. One way to do that is with this command: define X11 'f$trnlnm("DECW$INCLUDE")' The program is then built with these two commands: cc xgranite link/notrace xgranite/opt The author of xgranite is listed in the xgranite.man file. The -bg and -fg options and the VMS port were done by Jym Dyer. Kudos to the kind soul who provided the find_root() function (whose name I unfortunately lost). -- Jym Dyer (jym@mica.berkeley.edu) 10-Jan-1991 xgranite.c 663546866 201 10 100644 5670 ` # include <X11/Xlib.h> # include <stdio.h> #ifdef VMS #define random rand #endif #define Dynamic 1 Display *dpy; int scr; Window root; char *prog_name; unsigned long NameToPixel(); #ifdef VMS static Window find_root(); #endif main(argc, argv) char **argv; { extern Pixmap mkrand(); char *display_name = NULL; int i; int width, height; char *fore_color = NULL; char *back_color = NULL; int dark; prog_name = argv[0]; width = 0; height = 0; dark = 0; for (i = 1; i < argc; i++) { if (!strcmp ("-display", argv[i])) { if (++i >= argc) usage(1); display_name = argv[i]; continue; } if (!strcmp("-width", argv[i])) { if (++i >= argc) usage(1); width = atoi(argv[i]); continue; } if (!strcmp("-height", argv[i])) { if (++i >= argc) usage(1); height = atoi(argv[i]); continue; } if (!strcmp("-fg",argv[i]) || !strcmp("-foreground",argv[i])) { if (++i>=argc) usage(1); fore_color = argv[i]; continue; } if (!strcmp("-bg",argv[i]) || !strcmp("-background",argv[i])) { if (++i>=argc) usage(1); back_color = argv[i]; continue; } if (!strcmp("-darkness", argv[i])) { if (++i >= argc) usage(1); dark = atoi(argv[i]); continue; } if (!strcmp("-help", argv[i])) { usage(0); } usage(1); } dpy = XOpenDisplay(display_name); if (!dpy) { fprintf(stderr, "%s: unable to open display '%s'\n", prog_name, XDisplayName(display_name)); usage(1); } scr = DefaultScreen(dpy); root = RootWindow(dpy, scr); #ifdef VMS root = find_root(dpy, root); #endif if (width <= 0) { if (width < 0) fprintf(stderr, "%s: invalid width, using default.\n", prog_name); width = DisplayWidth(dpy, scr); } if (height <= 0) { if (height < 0) fprintf(stderr, "%s: invalid height, using default.\n", prog_name); height = DisplayHeight(dpy, scr); } if (dark < 0) dark = 0; if (dark > 15) dark = 15; background(mkrand(dark, width, height), width, height, fore_color, back_color); XCloseDisplay(dpy); exit(0); } usage(status) { fprintf(stderr, "usage: %s [options]\n", prog_name); fprintf(stderr, "\twhere options are:\n"); fprintf(stderr, "\t-display <display>\n"); fprintf(stderr, "\t-width <N>\n"); fprintf(stderr, "\t-height <N>\n"); fprintf(stderr, "\t-fg <color> or -foreground <color>\n"); fprintf(stderr, "\t-bg <color> or -background <color>\n"); fprintf(stderr, "\t-darkness <N>\n"); fprintf(stderr, "\t-help\n"); exit(status); } Pixmap mkrand(dark, width, height) { extern long random(); extern long time(); extern char *malloc(); unsigned short *data; register unsigned short *pd; register unsigned short *data_end; int data_size; register int j; register unsigned int n; if ((data = (unsigned short *) malloc(256)) == NULL) { perror("malloc"); exit(1); } #ifndef VMS (void) initstate((unsigned int) time(0), (char *) data, 256); #else (void) srand((unsigned int) time(0) + (unsigned int) data); #endif free(data); data_size = ((width * height) / 8); if ((data = (unsigned short *) malloc(data_size)) == NULL) { perror("malloc"); exit(1); } data_end = &data[data_size / sizeof(*data)]; for (pd = data_end - 1; pd >= &data[0]; pd--) *pd = random() & 0xffff; if (dark > 0) { for (pd = data_end - 1; pd >= &data[0]; pd--) { n = random(); n |= (n & 0x1) << 31; /* high bit = low bit */ for (j = 0; j < 8; j++) { *pd |= ((n & 0x0f) < dark) << j; *pd |= ((n & 0x0f) < dark) << (j+8); /*hibyte*/ n >>= 4; } } } return(XCreateBitmapFromData(dpy, root, (char *) data, width, height)); } /* swiped from xsetroot */ background(bitmap, width, height, fore_color, back_color) Pixmap bitmap; unsigned int width, height; { Pixmap pix; GC gc; XGCValues gc_init; gc_init.foreground = NameToPixel(fore_color, BlackPixel(dpy, scr)); gc_init.background = NameToPixel(back_color, WhitePixel(dpy, scr)); gc = XCreateGC(dpy, root, GCForeground|GCBackground, &gc_init); pix = XCreatePixmap(dpy, root, width, height, (unsigned int) DefaultDepth(dpy, scr)); XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, (unsigned long) 1); XSetWindowBackgroundPixmap(dpy, root, pix); XFreeGC(dpy, gc); XFreePixmap(dpy, bitmap); XFreePixmap(dpy, pix); XClearWindow(dpy, root); } unsigned long NameToPixel(name, pixel) char *name; unsigned long pixel; { XColor ecolor; if (!name || !*name) return pixel; if (!XParseColor(dpy,DefaultColormap(dpy,scr),name,&ecolor)) { fprintf(stderr,"%s: unknown color \"%s\"\n",prog_name,name); exit(1); /*NOTREACHED*/ } if (!XAllocColor(dpy, DefaultColormap(dpy, scr),&ecolor)) { fprintf(stderr, "%s: unable to allocate color for \"%s\"\n", prog_name, name); exit(1); /*NOTREACHED*/ } if ((ecolor.pixel != BlackPixel(dpy, scr)) && (ecolor.pixel != WhitePixel(dpy, scr)) && (DefaultVisual(dpy, scr)->class & Dynamic)) return(ecolor.pixel); } #ifdef VMS static Window find_root(dpy, pwin) Display *dpy; Window pwin; { XWindowAttributes pxwa,cxwa; Window root,parent,*child; int i,nchild; if (!XGetWindowAttributes(dpy,pwin,&pxwa)) printf("find_root: fail to get window attributes\n"); if (XQueryTree(dpy,pwin,&root,&parent,&child,&nchild)) { for (i = 0; i < nchild; i++) { if (!XGetWindowAttributes(dpy,child[i],&cxwa)) printf("find_root: fail to get window attributes\n"); if (pxwa.width == cxwa.width && pxwa.height == cxwa.height) return(find_root(dpy, child[i])); } return(pwin); } else printf("find_root: fail to get root window\n"); } #endif /* VMS */ xgranite.man 663546870 201 10 100644 992 ` .TH XGRANITE 1 .SH NAME xgranite \- make a random background .SH SYNOPSIS .B xgranite [-display \fIdisplay\fP] [-width \fIwidth\fP] [-height \fIheight\fP] [-darkness \fIdarkness\fP] .SH DESCRIPTION .I xgranite makes a random background that somewhat resembles granite. .SH OPTIONS .PP The various options are as follows: .IP "\fB-display\fP \fIdisplay\fP" Specifies the server to connect to; see \fIX(1)\fP. .IP "\fB-width\fP \fIwidth\fP" Specifies the width of the random bitmap. If no width is specified the width of the screen is used. .IP "\fB-height\fP \fIheight\fP" Specifies the height of the random bitmap. If no height is specified the height of the screen is used. .IP "\fB-darknes\fP \fIdarknes\fP" Specifies how dark to make the random pattern. .PP For a completely random background don't use \fB-width\fP or \fB-height\fP. .SH "SEE ALSO" X(1), xsetroot(1), xset(1), xrdb(1) .SH AUTHOR .ta 1.2i Program: Rusty C. Wright .br rusty@cartan.berkeley.edu .br ucbvax!cartan!rusty xgranite.opt 663546874 201 10 100644 76 ` xgranite.obj sys$share:decw$dwtlibshr.exe/share sys$share:vaxcrtl.exe/share