open-src/app/xcolor/sun-src/xcolor.c
changeset 509 9469d4c6010a
child 907 3c35d611cdaa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/open-src/app/xcolor/sun-src/xcolor.c	Wed Aug 20 13:34:40 2008 -0700
@@ -0,0 +1,416 @@
+/*-
+ * xcolor.c - X11 client to display all colors in current colormap.
+ *
+ * Copyright 1995 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ * Author: Patrick J. Naughton
+ * [email protected]
+ */
+
+#pragma ident "@(#)xcolor.c	35.3 08/08/21 XCOLOR SMI"
+
+#include <stdio.h>
+#include <math.h>
+#include <X11/X.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+
+#define DEFX 256
+#define DEFY 256
+#define DEFW 128
+#define DEFH 128
+
+#define ICON_WIDTH 48
+#define ICON_HEIGHT 48
+
+Display    *dsp = NULL;		/* current display (must be inited) */
+int         screen;
+Visual	    *visual;
+Window      win;		/* window used to cover screen */
+Window	    icon;
+GC	    gc;			/* graphics context */
+int         height = 0,
+            width = 0;
+Colormap    cmap;
+char       *pname;
+Atom	    ATOM_WM_PROTOCOLS;
+Atom	    ATOM_WM_DELETE_WINDOW;
+
+int    	    cmap_size;
+
+
+void
+error(s1, s2)
+    char       *s1,
+               *s2;
+{
+    fprintf(stderr, s1, pname, s2);
+    exit(1);
+}
+
+dumpCmap()
+{
+    register int i;
+    XColor      color[256];
+
+    for (i = 0; i < 256; i++)
+	color[i].pixel = i;
+    XQueryColors(dsp, DefaultColormap(dsp, screen), color, 256);
+    for (i = 0; i < 256; i++) {
+	printf("/name%02x	%3d %3d %3d RGBcolor def\n",
+	      i, color[i].red >> 8, color[i].green >> 8, color[i].blue >> 8);
+    }
+}
+
+redisplay_indexed(window)
+    Window window;
+{
+    int		 max;
+    register int i,
+                 j;
+    register float fw;
+    register float fh;
+
+    switch (cmap_size) {
+        case   2:   max = 2;   break;
+        case  16:   max = 4;   break; 
+        case 256:   max = 16;  break;
+        default:    max = (int)sqrt((double)cmap_size);
+    }
+
+    if (window == win) {
+	fw = (float) width / (float)max;
+	fh = (float) height / (float)max;
+    } else {
+	fw = (float) ICON_WIDTH / (float)max;
+	fh = (float) ICON_HEIGHT / (float)max;
+    }
+
+    for (i = 0; i < max; i++) {
+	register int y = (int) (i * fh);
+	register int h = (i + 1) * fh - y;
+	for (j = 0; j < max; j++) {
+	    register int x = (int) (j * fw);
+	    register int w = (j + 1) * fw - x;
+	    XSetForeground(dsp, gc, i * max + j);
+	    XFillRectangle(dsp, window, gc, x, y, w, h);
+	}
+    }
+}
+
+
+redisplay_direct(window)
+    Window window;
+{
+    register int i,
+                j, k;
+    register float fw;
+    register float fh;
+    static int roffset, goffset, boffset;
+    static int got_offsets = 0;
+
+    if (window == win) {
+	fw = (float) width / 16.0;
+	fh = (float) height / (3 * 16.0);
+    } else {
+	fw = (float) ICON_WIDTH / 16.0;
+	fh = (float) ICON_HEIGHT / (3 * 16.0);
+    }
+
+    if (!got_offsets) {
+	got_offsets = 1;
+	roffset = ffs(visual->red_mask)-1;
+	goffset = ffs(visual->green_mask)-1;
+	boffset = ffs(visual->blue_mask)-1;
+    }
+
+    /* red channel */
+    k = 0;
+    for (i = 0; i < 16; i++, k++) {
+	register int y = (int) (k * fh);
+	register int h = (k + 1) * fh - y;
+	for (j = 0; j < 16; j++) {
+	    register int x = (int) (j * fw);
+	    register int w = (j + 1) * fw - x;
+	    XSetForeground(dsp, gc, (i * 16 + j)<<roffset);
+	    XFillRectangle(dsp, window, gc, x, y, w, h);
+	}
+    }
+
+    /* green channel */
+    for (i = 0; i < 16; i++, k++) {
+	register int y = (int) (k * fh);
+	register int h = (k + 1) * fh - y;
+	for (j = 0; j < 16; j++) {
+	    register int x = (int) (j * fw);
+	    register int w = (j + 1) * fw - x;
+	    XSetForeground(dsp, gc, (i * 16 + j)<<goffset);
+	    XFillRectangle(dsp, window, gc, x, y, w, h);
+	}
+    }
+
+    /* blue channel */
+    for (i = 0; i < 16; i++, k++) {
+	register int y = (int) (k * fh);
+	register int h = (k + 1) * fh - y;
+	for (j = 0; j < 16; j++) {
+	    register int x = (int) (j * fw);
+	    register int w = (j + 1) * fw - x;
+	    XSetForeground(dsp, gc, (i * 16 + j)<<boffset);
+	    XFillRectangle(dsp, window, gc, x, y, w, h);
+	}
+    }
+}
+
+
+redisplay (w)
+    Window w;
+{
+    if (visual->class == TrueColor || visual->class == DirectColor)
+	    redisplay_direct(w);
+    else
+	    redisplay_indexed(w);
+}
+
+
+HandleEvents()
+{
+    XEvent      event;
+    XConfigureEvent *xce = (XConfigureEvent *) & event;
+    XKeyEvent  *xke = (XKeyEvent *) & event;
+
+    while (1) {
+	XNextEvent(dsp, &event);
+	switch (event.type) {
+	case Expose:
+	    redisplay(event.xexpose.window);
+	    continue;
+	case GraphicsExpose:
+	case NoExpose:
+	case MapNotify:
+	case UnmapNotify:
+	    continue;
+	case ConfigureNotify:
+	    if ((height == xce->height) && (width == xce->width))
+		continue;
+	    height = xce->height;
+	    width = xce->width;
+	    redisplay(event.xconfigure.window);
+	    continue;
+	case KeyPress:
+	    switch (XLookupKeysym(xke, 0)) {
+	    case XK_Escape:
+		return;
+	    default:
+		continue;
+	    }
+	case ClientMessage:
+	    if (event.xclient.message_type == ATOM_WM_PROTOCOLS &&
+		event.xclient.format == 32 &&
+		event.xclient.data.l[0] == ATOM_WM_DELETE_WINDOW)
+	    {
+		return;
+	    }
+	    continue;
+	}
+    }
+}
+
+
+main(argc, argv)
+    int         argc;
+    char       *argv[];
+{
+    XSetWindowAttributes xswa;
+    XGCValues   xgcv;
+    XSizeHints  size_hints;
+    XWMHints	wmhints;
+    int         i;
+    int         geomStat;
+    char       *geom = NULL;
+    char       *displayName = NULL;
+    Status      stat;
+    int         dump = 0;
+    int		nobw = 0;
+    int		half = 0;
+    int		install = 1;
+    int		mask;
+    int		useiconwin = 0;
+    
+    if (getenv("_SYNC")) { 
+	extern int _Xdebug;
+	_Xdebug = 1;
+    }
+
+    pname = argv[0];
+    for (i = 1; i < argc; i++) {
+	if (!strcmp(argv[i], "-geometry"))
+	    geom = argv[++i];
+	else if (!strcmp(argv[i], "-display"))
+	    displayName = argv[++i];
+	else if (!strcmp(argv[i], "-dump"))
+	    dump = 1;
+	else if (!strcmp(argv[i], "-nobw"))
+	    nobw = 1;
+	else if (!strcmp(argv[i], "-half"))
+	    half = 1;
+	else if (!strcmp(argv[i], "-noinst"))
+	    install = 0;
+	else if (!strcmp(argv[i], "-iconwin"))
+	    useiconwin = 1;
+	else
+	    error("usage:  %s [-display dpystr] [-geometry geomstr]\n\
+\t[-dump] [-nobw] [-half] [-noinst] [-iconwin]\n", NULL);
+    }
+
+    /* SUNSOFT_BUYBACK
+    if (!(dsp = XOpenDisplay(displayName)))
+	error("%s: unable to open display, %s.\n", displayName);
+    **********/
+    if (!(dsp = XOpenDisplay(displayName))) {
+	if (displayName)
+	    error("%s: unable to open display, %s.\n", displayName);
+        else
+	    error("unable to open display\n");
+    }
+
+    screen = DefaultScreen(dsp);
+    visual = DefaultVisualOfScreen(DefaultScreenOfDisplay(dsp));
+    cmap_size = visual->map_entries;
+
+    ATOM_WM_PROTOCOLS = XInternAtom(dsp, "WM_PROTOCOLS", False);
+    ATOM_WM_DELETE_WINDOW = XInternAtom(dsp, "WM_DELETE_WINDOW", False);
+
+    if (dump)
+	dumpCmap();
+
+    if (install)  {
+	    stat = XCreateHSBColormap(dsp, screen, &cmap, half 
+					? (cmap_size>>1) : cmap_size,
+				      0.0, 1.0, 1.0,
+				      1.0, 1.0, 1.0, !nobw, &visual);
+	    if (stat != Success)
+		error("%s: unable create colormap (%d).\n", stat);
+    }
+
+    size_hints.x = DEFX;
+    size_hints.y = DEFY;
+    size_hints.width = DEFW;
+    size_hints.height = DEFH;
+
+    size_hints.flags = 0;
+    if (geom) {
+	geomStat = XParseGeometry(geom, &(size_hints.x),
+				  &(size_hints.y),
+				  (unsigned int *) &(size_hints.width),
+				  (unsigned int *) &(size_hints.height));
+	if (geomStat & (XValue | YValue)) {
+	    size_hints.flags |= USPosition;
+	}
+	if (geomStat & (WidthValue | HeightValue)) {
+	    size_hints.flags |= USSize;
+	}
+    }
+
+    width = size_hints.width;
+    height = size_hints.height;
+
+    xswa.event_mask = ExposureMask | KeyPressMask | StructureNotifyMask;
+    mask = CWEventMask;
+
+    if (install) {
+	    xswa.colormap = cmap;
+	    mask |= CWColormap;
+    }
+   
+    win = XCreateWindow(
+			dsp,
+			DefaultRootWindow(dsp),
+			size_hints.x,
+			size_hints.y,
+			size_hints.width,
+			size_hints.height,
+			1,	/* borderwidth */
+
+			DefaultDepth(dsp, screen),	/* depth */
+			InputOutput,	/* class */
+			visual,	/* visual */
+			mask,	/* window attribute mask */
+			&xswa	/* the attributes */
+	);
+
+    XSetStandardProperties(dsp, win, " XColor ", " XCOLOR ",
+			   NULL, argv, argc, &size_hints);
+
+    wmhints.flags = InputHint;
+    wmhints.input = True;
+
+    if (useiconwin) {
+	xswa.event_mask = ExposureMask;
+	mask = CWEventMask;
+
+	if (install) {
+	    xswa.colormap = cmap;
+	    mask |= CWColormap;
+	}
+
+	icon = XCreateWindow(dsp, DefaultRootWindow(dsp),
+	    0, 0, ICON_WIDTH, ICON_HEIGHT, 0, DefaultDepth(dsp, screen),
+	    InputOutput, visual, mask, &xswa);
+
+	wmhints.flags |= IconWindowHint;
+	wmhints.icon_window = icon;
+
+	if (install) {
+	    Window cmapwins[2];
+
+	    cmapwins[0] = icon;
+	    cmapwins[1] = win;
+	    XSetWMColormapWindows(dsp, win, cmapwins, 2);
+	}
+    }
+
+    XSetWMHints(dsp, win, &wmhints);
+    XSetWMProtocols(dsp, win, &ATOM_WM_DELETE_WINDOW, 1);
+
+    xgcv.foreground = BlackPixel(dsp, screen);
+    xgcv.background = WhitePixel(dsp, screen);
+    gc = XCreateGC(dsp, win, GCForeground | GCBackground, &xgcv);
+
+    XMapWindow(dsp, win);
+
+    HandleEvents();
+
+    XUnmapWindow(dsp, win);
+    XDestroyWindow(dsp, win);
+    XFlush(dsp);
+    XCloseDisplay(dsp);
+    exit(0);
+}