xcmsdb.c revision 8650bb69
12c7c4e3dSmrg/* $Xorg: xcmsdb.c,v 1.3 2000/08/17 19:54:13 cpqbld Exp $ */
22c7c4e3dSmrg
32c7c4e3dSmrg/*
42c7c4e3dSmrg * (c) Copyright 1990 Tektronix Inc.
52c7c4e3dSmrg * 	All Rights Reserved
62c7c4e3dSmrg *
72c7c4e3dSmrg * Permission to use, copy, modify, and distribute this software and its
82c7c4e3dSmrg * documentation for any purpose and without fee is hereby granted,
92c7c4e3dSmrg * provided that the above copyright notice appear in all copies and that
102c7c4e3dSmrg * both that copyright notice and this permission notice appear in
112c7c4e3dSmrg * supporting documentation, and that the name of Tektronix not be used
122c7c4e3dSmrg * in advertising or publicity pertaining to distribution of the software
132c7c4e3dSmrg * without specific, written prior permission.
142c7c4e3dSmrg *
152c7c4e3dSmrg * Tektronix disclaims all warranties with regard to this software, including
162c7c4e3dSmrg * all implied warranties of merchantability and fitness, in no event shall
172c7c4e3dSmrg * Tektronix be liable for any special, indirect or consequential damages or
182c7c4e3dSmrg * any damages whatsoever resulting from loss of use, data or profits,
192c7c4e3dSmrg * whether in an action of contract, negligence or other tortious action,
202c7c4e3dSmrg * arising out of or in connection with the use or performance of this
212c7c4e3dSmrg * software.
222c7c4e3dSmrg *
232c7c4e3dSmrg *
242c7c4e3dSmrg *	NAME
252c7c4e3dSmrg *		xcmsdb.c
262c7c4e3dSmrg *
272c7c4e3dSmrg *	DESCRIPTION
282c7c4e3dSmrg *		Program to load, query or remove the Screen Color
292c7c4e3dSmrg *		Characterization Data from the root window of the screen.
302c7c4e3dSmrg *
312c7c4e3dSmrg */
322c7c4e3dSmrg/* $XFree86: xc/programs/xcmsdb/xcmsdb.c,v 1.5 2001/01/17 23:45:19 dawes Exp $ */
332c7c4e3dSmrg
342c7c4e3dSmrg/*
352c7c4e3dSmrg *      INCLUDES
362c7c4e3dSmrg */
372c7c4e3dSmrg
382c7c4e3dSmrg#include <stdio.h>
392c7c4e3dSmrg#include <stdlib.h>
402c7c4e3dSmrg#include <X11/Xlib.h>
412c7c4e3dSmrg#include <X11/Xatom.h>
422c7c4e3dSmrg#include <X11/Xos.h>
432c7c4e3dSmrg#include <ctype.h>
442c7c4e3dSmrg
452c7c4e3dSmrg#include "SCCDFile.h"
462c7c4e3dSmrg
472c7c4e3dSmrgstatic void QuerySCCDataRGB(Display *dpy, Window root);
482c7c4e3dSmrgstatic void RemoveSCCData(Display *dpy, Window root, int colorFlag);
492c7c4e3dSmrgstatic unsigned long _XcmsGetElement(int format, char **pValue,
502c7c4e3dSmrg				     unsigned long *pCount);
512c7c4e3dSmrgstatic int _XcmsGetProperty(Display *pDpy, Window w, Atom property,
522c7c4e3dSmrg			    int *pFormat, unsigned long *pNItems,
532c7c4e3dSmrg			    unsigned long *pNBytes, char **pValue);
542c7c4e3dSmrg
552c7c4e3dSmrg
568650bb69Smrgstatic char *ProgramName;
572c7c4e3dSmrg
582c7c4e3dSmrgstatic void
592c7c4e3dSmrgSyntax (void)
602c7c4e3dSmrg{
612c7c4e3dSmrg    fprintf (stderr,
622c7c4e3dSmrg	     "usage:  %s [-options ...] [filename]\n\n",
632c7c4e3dSmrg	     ProgramName);
642c7c4e3dSmrg    fprintf (stderr,
652c7c4e3dSmrg	     "where options include:\n");
662c7c4e3dSmrg    fprintf (stderr,
672c7c4e3dSmrg	     "    -display host:dpy[.scrn]     display to use\n");
682c7c4e3dSmrg    fprintf (stderr,
692c7c4e3dSmrg	     "    -format [ 32 | 16 | 8 ]      property format\n");
702c7c4e3dSmrg    fprintf (stderr,
712c7c4e3dSmrg	     "    -query                       query Screen Color Characterization Data\n");
722c7c4e3dSmrg    fprintf (stderr,
732c7c4e3dSmrg	     "    -remove                      remove Screen Color Characterization Data\n");
742c7c4e3dSmrg#ifdef GRAY
752c7c4e3dSmrg    fprintf (stderr,
762c7c4e3dSmrg	     "    -color                       use color as default\n");
772c7c4e3dSmrg    fprintf (stderr,
782c7c4e3dSmrg	     "    -gray                        use gray-scale as default\n");
792c7c4e3dSmrg#endif /* GRAY */
802c7c4e3dSmrg    fprintf (stderr,
812c7c4e3dSmrg	     "\n");
822c7c4e3dSmrg    exit (1);
832c7c4e3dSmrg}
842c7c4e3dSmrg
852c7c4e3dSmrgstatic Bool
862c7c4e3dSmrgoptionmatch(char *opt, char *arg, int minlen)
872c7c4e3dSmrg{
882c7c4e3dSmrg    int arglen;
892c7c4e3dSmrg
902c7c4e3dSmrg    if (strcmp(opt, arg) == 0) {
912c7c4e3dSmrg	return(True);
922c7c4e3dSmrg    }
932c7c4e3dSmrg
942c7c4e3dSmrg    if ((arglen = strlen(arg)) >= (int)strlen(opt) || arglen < minlen) {
952c7c4e3dSmrg	return(False);
962c7c4e3dSmrg    }
972c7c4e3dSmrg
982c7c4e3dSmrg    if (strncmp (opt, arg, arglen) == 0) {
992c7c4e3dSmrg	return(True);
1002c7c4e3dSmrg    }
1012c7c4e3dSmrg
1022c7c4e3dSmrg    return(False);
1032c7c4e3dSmrg}
1042c7c4e3dSmrg
1052c7c4e3dSmrgint
1062c7c4e3dSmrgmain(int argc, char *argv[])
1072c7c4e3dSmrg{
1082c7c4e3dSmrg    Display *dpy;
1092c7c4e3dSmrg    int i;
1102c7c4e3dSmrg    char *displayname = NULL;
1112c7c4e3dSmrg    char *filename = NULL;
1122c7c4e3dSmrg    int query = 0;
1132c7c4e3dSmrg    int remove = 0;
1142c7c4e3dSmrg    int load = 0;
1152c7c4e3dSmrg    int color = -1;
1162c7c4e3dSmrg    int targetFormat = 32;
1172c7c4e3dSmrg
1182c7c4e3dSmrg    ProgramName = argv[0];
1192c7c4e3dSmrg
1202c7c4e3dSmrg    for (i = 1; i < argc; i++) {
1212c7c4e3dSmrg	char *arg = argv[i];
1222c7c4e3dSmrg
1232c7c4e3dSmrg	if (arg[0] == '-') {
1242c7c4e3dSmrg	    if (arg[1] == '\0') {
1252c7c4e3dSmrg		filename = NULL;
1262c7c4e3dSmrg		continue;
1272c7c4e3dSmrg	    } else if (optionmatch ("-help", arg, 1)) {
1282c7c4e3dSmrg		Syntax ();
1292c7c4e3dSmrg		/* doesn't return */
1302c7c4e3dSmrg	    } else if (optionmatch ("-display", arg, 1)) {
1312c7c4e3dSmrg		if (++i >= argc) Syntax ();
1322c7c4e3dSmrg		displayname = argv[i];
1332c7c4e3dSmrg		continue;
1342c7c4e3dSmrg	    } else if (optionmatch ("-format", arg, 1)) {
1352c7c4e3dSmrg		if (++i >= argc) Syntax ();
1362c7c4e3dSmrg		targetFormat = atoi(argv[i]);
1372c7c4e3dSmrg		if (targetFormat != 32 && targetFormat != 16 &&
1382c7c4e3dSmrg			targetFormat != 8) Syntax();
1392c7c4e3dSmrg		continue;
1402c7c4e3dSmrg	    } else if (optionmatch ("-query", arg, 1)) {
1412c7c4e3dSmrg		query = 1;
1422c7c4e3dSmrg		continue;
1432c7c4e3dSmrg	    } else if (optionmatch ("-remove", arg, 1)) {
1442c7c4e3dSmrg		remove = 1;
1452c7c4e3dSmrg		continue;
1462c7c4e3dSmrg#ifdef GRAY
1472c7c4e3dSmrg	    } else if (optionmatch ("-color", arg, 1)) {
1482c7c4e3dSmrg		color = 1;
1492c7c4e3dSmrg		continue;
1502c7c4e3dSmrg	    } else if (optionmatch ("-gray", arg, 1)) {
1512c7c4e3dSmrg		color = 0;
1522c7c4e3dSmrg		continue;
1532c7c4e3dSmrg#endif /* GRAY */
1542c7c4e3dSmrg	    }
1552c7c4e3dSmrg	    Syntax ();
1562c7c4e3dSmrg	} else {
1572c7c4e3dSmrg	    load = 1;
1582c7c4e3dSmrg	    filename = arg;
1592c7c4e3dSmrg	}
1602c7c4e3dSmrg    }
1612c7c4e3dSmrg
1622c7c4e3dSmrg    /* Open display  */
1632c7c4e3dSmrg    if (!(dpy = XOpenDisplay (displayname))) {
1642c7c4e3dSmrg      fprintf (stderr, "%s:  Can't open display '%s'\n",
1652c7c4e3dSmrg	       ProgramName, XDisplayName(displayname));
1662c7c4e3dSmrg      exit (1);
1672c7c4e3dSmrg    }
1682c7c4e3dSmrg
1692c7c4e3dSmrg    if (load && query) {
1702c7c4e3dSmrg	load = 0;
1712c7c4e3dSmrg    }
1722c7c4e3dSmrg    if (load && remove) {
1732c7c4e3dSmrg	load = 0;
1742c7c4e3dSmrg    }
1752c7c4e3dSmrg
1762c7c4e3dSmrg    if (!query && !remove) {
1772c7c4e3dSmrg	LoadSCCData(dpy, DefaultScreen(dpy), filename, targetFormat);
1782c7c4e3dSmrg    }
1792c7c4e3dSmrg
1802c7c4e3dSmrg    if (query) {
1812c7c4e3dSmrg	if (color != 0)
1822c7c4e3dSmrg	    QuerySCCDataRGB(dpy, RootWindow(dpy, DefaultScreen(dpy)));
1832c7c4e3dSmrg#ifdef GRAY
1842c7c4e3dSmrg	if (color != 1)
1852c7c4e3dSmrg	    QuerySCCDataGray(dpy, RootWindow(dpy, DefaultScreen(dpy)));
1862c7c4e3dSmrg#endif /* GRAY */
1872c7c4e3dSmrg    }
1882c7c4e3dSmrg
1892c7c4e3dSmrg    if (remove) {
1902c7c4e3dSmrg	RemoveSCCData(dpy, RootWindow(dpy, DefaultScreen(dpy)), color);
1912c7c4e3dSmrg    }
1922c7c4e3dSmrg
1932c7c4e3dSmrg    XCloseDisplay(dpy);
1942c7c4e3dSmrg    exit (0);
1952c7c4e3dSmrg    /*NOTREACHED*/
1962c7c4e3dSmrg}
1972c7c4e3dSmrg
1982c7c4e3dSmrg
1992c7c4e3dSmrgstatic Atom
2002c7c4e3dSmrgParseAtom(Display *dpy, char *name, int only_flag)
2012c7c4e3dSmrg{
2022c7c4e3dSmrg    return(XInternAtom(dpy, name, only_flag));
2032c7c4e3dSmrg}
2042c7c4e3dSmrg
2052c7c4e3dSmrg
2062c7c4e3dSmrg/*
2072c7c4e3dSmrg *	NAME
2082c7c4e3dSmrg *		PrintTableType0
2092c7c4e3dSmrg *
2102c7c4e3dSmrg *	SYNOPSIS
2112c7c4e3dSmrg */
2122c7c4e3dSmrgstatic void
2132c7c4e3dSmrgPrintTableType0(int format, char **pChar, unsigned long *pCount)
2142c7c4e3dSmrg/*
2152c7c4e3dSmrg *	DESCRIPTION
2162c7c4e3dSmrg *
2172c7c4e3dSmrg *	RETURNS
2182c7c4e3dSmrg *		XcmsFailure if failed.
2192c7c4e3dSmrg *		XcmsSuccess if succeeded.
2202c7c4e3dSmrg *
2212c7c4e3dSmrg */
2222c7c4e3dSmrg{
2232c7c4e3dSmrg    unsigned int nElements;
2242c7c4e3dSmrg    unsigned short hValue;
2252c7c4e3dSmrg    XcmsFloat fValue;
2262c7c4e3dSmrg
2272c7c4e3dSmrg    nElements = _XcmsGetElement(format, pChar, pCount) + 1;
2282c7c4e3dSmrg    printf ("\t    length:%d\n", nElements);
2292c7c4e3dSmrg
2302c7c4e3dSmrg    switch (format) {
2312c7c4e3dSmrg      case 8:
2322c7c4e3dSmrg	while (nElements--) {
2332c7c4e3dSmrg	    /* 0xFFFF/0xFF = 0x101 */
2342c7c4e3dSmrg	    hValue = _XcmsGetElement (format, pChar, pCount) * 0x101;
2352c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
2362c7c4e3dSmrg		    / (XcmsFloat)255.0;
2372c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
2382c7c4e3dSmrg	}
2392c7c4e3dSmrg	break;
2402c7c4e3dSmrg      case 16:
2412c7c4e3dSmrg	while (nElements--) {
2422c7c4e3dSmrg	    hValue = _XcmsGetElement (format, pChar, pCount);
2432c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
2442c7c4e3dSmrg		    / (XcmsFloat)65535.0;
2452c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
2462c7c4e3dSmrg	}
2472c7c4e3dSmrg	break;
2482c7c4e3dSmrg      case 32:
2492c7c4e3dSmrg	while (nElements--) {
2502c7c4e3dSmrg	    hValue = _XcmsGetElement (format, pChar, pCount);
2512c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
2522c7c4e3dSmrg		    / (XcmsFloat)4294967295.0;
2532c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
2542c7c4e3dSmrg	}
2552c7c4e3dSmrg	break;
2562c7c4e3dSmrg      default:
2572c7c4e3dSmrg	return;
2582c7c4e3dSmrg    }
2592c7c4e3dSmrg}
2602c7c4e3dSmrg
2612c7c4e3dSmrg
2622c7c4e3dSmrg/*
2632c7c4e3dSmrg *	NAME
2642c7c4e3dSmrg *		PrintTableType1
2652c7c4e3dSmrg *
2662c7c4e3dSmrg *	SYNOPSIS
2672c7c4e3dSmrg */
2682c7c4e3dSmrgstatic void
2692c7c4e3dSmrgPrintTableType1(int format, char **pChar, unsigned long *pCount)
2702c7c4e3dSmrg/*
2712c7c4e3dSmrg *	DESCRIPTION
2722c7c4e3dSmrg *
2732c7c4e3dSmrg *	RETURNS
2742c7c4e3dSmrg *		XcmsFailure if failed.
2752c7c4e3dSmrg *		XcmsSuccess if succeeded.
2762c7c4e3dSmrg *
2772c7c4e3dSmrg */
2782c7c4e3dSmrg{
2792c7c4e3dSmrg    int count;
2802c7c4e3dSmrg    unsigned int max_index;
2812c7c4e3dSmrg    unsigned short hValue;
2822c7c4e3dSmrg    XcmsFloat fValue;
2832c7c4e3dSmrg
2842c7c4e3dSmrg    max_index = _XcmsGetElement(format, pChar, pCount);
2852c7c4e3dSmrg    printf ("\t    length:%d\n", max_index + 1);
2862c7c4e3dSmrg
2872c7c4e3dSmrg    switch (format) {
2882c7c4e3dSmrg      case 8:
2892c7c4e3dSmrg	for (count = 0; count < max_index+1; count++) {
2902c7c4e3dSmrg	    hValue = (count * 65535) / max_index;
2912c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
2922c7c4e3dSmrg		    / (XcmsFloat)255.0;
2932c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
2942c7c4e3dSmrg	}
2952c7c4e3dSmrg	break;
2962c7c4e3dSmrg      case 16:
2972c7c4e3dSmrg	for (count = 0; count < max_index+1; count++) {
2982c7c4e3dSmrg	    hValue = (count * 65535) / max_index;
2992c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
3002c7c4e3dSmrg		    / (XcmsFloat)65535.0;
3012c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
3022c7c4e3dSmrg	}
3032c7c4e3dSmrg	break;
3042c7c4e3dSmrg      case 32:
3052c7c4e3dSmrg	for (count = 0; count < max_index+1; count++) {
3062c7c4e3dSmrg	    hValue = (count * 65535) / max_index;
3072c7c4e3dSmrg	    fValue = _XcmsGetElement (format, pChar, pCount)
3082c7c4e3dSmrg		    / (XcmsFloat)4294967295.0;
3092c7c4e3dSmrg	    printf ("\t\t0x%x\t%8.5f\n", hValue, fValue);
3102c7c4e3dSmrg	}
3112c7c4e3dSmrg	break;
3122c7c4e3dSmrg      default:
3132c7c4e3dSmrg	return;
3142c7c4e3dSmrg    }
3152c7c4e3dSmrg}
3162c7c4e3dSmrg
3172c7c4e3dSmrg
3182c7c4e3dSmrg/*
3192c7c4e3dSmrg *      NAME
3202c7c4e3dSmrg *		QuerySCCData - Query for the SCC data on the root window
3212c7c4e3dSmrg *
3222c7c4e3dSmrg *      SYNOPSIS
3232c7c4e3dSmrg */
3242c7c4e3dSmrgstatic void
3252c7c4e3dSmrgQuerySCCDataRGB(Display *dpy, Window root)
3262c7c4e3dSmrg/*
3272c7c4e3dSmrg *      DESCRIPTION
3282c7c4e3dSmrg *
3292c7c4e3dSmrg *      RETURNS
3302c7c4e3dSmrg *		None
3312c7c4e3dSmrg */
3322c7c4e3dSmrg{
3332c7c4e3dSmrg    char *property_return, *pChar;
3342c7c4e3dSmrg    int  i, j;
3352c7c4e3dSmrg    int  count, format, cType, nTables;
3362c7c4e3dSmrg    unsigned long nitems, nbytes_return;
3372c7c4e3dSmrg    Atom MatricesAtom, CorrectAtom;
3382c7c4e3dSmrg    VisualID visualID;
3392c7c4e3dSmrg    XVisualInfo vinfo_template, *vinfo_ret;
3402c7c4e3dSmrg    int nvis;
3412c7c4e3dSmrg    static char *visual_strings[] = {
3422c7c4e3dSmrg	"StaticGray",
3432c7c4e3dSmrg	"GrayScale",
3442c7c4e3dSmrg	"StaticColor",
3452c7c4e3dSmrg	"PseudoColor",
3462c7c4e3dSmrg	"TrueColor",
3472c7c4e3dSmrg	"DirectColor"
3482c7c4e3dSmrg	};
3492c7c4e3dSmrg
3502c7c4e3dSmrg    /*
3512c7c4e3dSmrg     * Get Matrices
3522c7c4e3dSmrg     */
3532c7c4e3dSmrg    MatricesAtom = ParseAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);
3542c7c4e3dSmrg    if (MatricesAtom != None) {
3552c7c4e3dSmrg	if (_XcmsGetProperty (dpy, root, MatricesAtom, &format, &nitems,
3562c7c4e3dSmrg			  &nbytes_return, &property_return) == XcmsFailure) {
3572c7c4e3dSmrg	    format = 0;
3582c7c4e3dSmrg	} else if (nitems != 18) {
3592c7c4e3dSmrg	    printf ("Property %s had invalid length of %ld\n",
3602c7c4e3dSmrg		    XDCCC_MATRIX_ATOM_NAME, nitems);
3612c7c4e3dSmrg	    if (property_return) {
3622c7c4e3dSmrg		XFree (property_return);
3632c7c4e3dSmrg	    }
3642c7c4e3dSmrg	    return;
3652c7c4e3dSmrg	}
3662c7c4e3dSmrg    }
3672c7c4e3dSmrg    if (MatricesAtom == None || !format) {
3682c7c4e3dSmrg	printf ("Could not find property %s\n", XDCCC_MATRIX_ATOM_NAME);
3692c7c4e3dSmrg    } else if (format != 32) {
3702c7c4e3dSmrg	printf ("Data in property %s not in 32 bit format\n",
3712c7c4e3dSmrg		XDCCC_MATRIX_ATOM_NAME);
3722c7c4e3dSmrg    } else {
3732c7c4e3dSmrg	pChar = property_return;
3742c7c4e3dSmrg	printf ("Screen: %d\n", DefaultScreen(dpy));
3752c7c4e3dSmrg	printf ("Querying property %s\n", XDCCC_MATRIX_ATOM_NAME);
3762c7c4e3dSmrg	printf ("\tXYZtoRGB matrix :\n");
3772c7c4e3dSmrg	for (i = 0; i < 3; i++) {
3782c7c4e3dSmrg	    printf ("\t");
3792c7c4e3dSmrg	    for (j = 0; j < 3; j++) {
3802c7c4e3dSmrg		printf ("\t%8.5f",
3812c7c4e3dSmrg			(long)_XcmsGetElement(format, &pChar, &nitems)
3822c7c4e3dSmrg			/ (XcmsFloat) XDCCC_NUMBER);
3832c7c4e3dSmrg	    }
3842c7c4e3dSmrg	    printf ("\n");
3852c7c4e3dSmrg	}
3862c7c4e3dSmrg	printf ("\tRGBtoXYZ matrix :\n");
3872c7c4e3dSmrg	for (i = 0; i < 3; i++) {
3882c7c4e3dSmrg	    printf ("\t");
3892c7c4e3dSmrg	    for (j = 0; j < 3; j++) {
3902c7c4e3dSmrg		printf ("\t%8.5f",
3912c7c4e3dSmrg			(long) _XcmsGetElement(format, &pChar, &nitems)
3922c7c4e3dSmrg			/ (XcmsFloat) XDCCC_NUMBER);
3932c7c4e3dSmrg	    }
3942c7c4e3dSmrg	    printf ("\n");
3952c7c4e3dSmrg	}
3962c7c4e3dSmrg	XFree (property_return);
3972c7c4e3dSmrg    }
3982c7c4e3dSmrg
3992c7c4e3dSmrg
4002c7c4e3dSmrg    /*
4012c7c4e3dSmrg     * Get Intensity Tables
4022c7c4e3dSmrg     */
4032c7c4e3dSmrg    CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);
4042c7c4e3dSmrg    if (CorrectAtom != None) {
4052c7c4e3dSmrg	if (_XcmsGetProperty (dpy, root, CorrectAtom, &format, &nitems,
4062c7c4e3dSmrg			  &nbytes_return, &property_return) == XcmsFailure) {
4072c7c4e3dSmrg	    format = 0;
4082c7c4e3dSmrg	} else if (nitems <= 0) {
4092c7c4e3dSmrg            printf ("Property %s had invalid length of %ld\n",
4102c7c4e3dSmrg		    XDCCC_CORRECT_ATOM_NAME, nitems);
4112c7c4e3dSmrg	    if (property_return) {
4122c7c4e3dSmrg		XFree (property_return);
4132c7c4e3dSmrg	    }
4142c7c4e3dSmrg	    return;
4152c7c4e3dSmrg	}
4162c7c4e3dSmrg    }
4172c7c4e3dSmrg    if (CorrectAtom == None || !format) {
4182c7c4e3dSmrg	printf ("Could not find property %s\n", XDCCC_CORRECT_ATOM_NAME);
4192c7c4e3dSmrg    } else {
4202c7c4e3dSmrg	printf ("\nQuerying property %s\n", XDCCC_CORRECT_ATOM_NAME);
4212c7c4e3dSmrg	pChar = property_return;
4222c7c4e3dSmrg
4232c7c4e3dSmrg	while (nitems) {
4242c7c4e3dSmrg	    switch (format) {
4252c7c4e3dSmrg	      case 8:
4262c7c4e3dSmrg		/*
4272c7c4e3dSmrg		 * Must have at least:
4282c7c4e3dSmrg		 *		VisualID0
4292c7c4e3dSmrg		 *		VisualID1
4302c7c4e3dSmrg		 *		VisualID2
4312c7c4e3dSmrg		 *		VisualID3
4322c7c4e3dSmrg		 *		type
4332c7c4e3dSmrg		 *		count
4342c7c4e3dSmrg		 *		length
4352c7c4e3dSmrg		 *		intensity1
4362c7c4e3dSmrg		 *		intensity2
4372c7c4e3dSmrg		 */
4382c7c4e3dSmrg		if (nitems < 9) {
4392c7c4e3dSmrg		    goto IntensityTblError;
4402c7c4e3dSmrg		}
4412c7c4e3dSmrg		count = 3;
4422c7c4e3dSmrg		break;
4432c7c4e3dSmrg	      case 16:
4442c7c4e3dSmrg		/*
4452c7c4e3dSmrg		 * Must have at least:
4462c7c4e3dSmrg		 *		VisualID0
4472c7c4e3dSmrg		 *		VisualID3
4482c7c4e3dSmrg		 *		type
4492c7c4e3dSmrg		 *		count
4502c7c4e3dSmrg		 *		length
4512c7c4e3dSmrg		 *		intensity1
4522c7c4e3dSmrg		 *		intensity2
4532c7c4e3dSmrg		 */
4542c7c4e3dSmrg		if (nitems < 7) {
4552c7c4e3dSmrg		    goto IntensityTblError;
4562c7c4e3dSmrg		}
4572c7c4e3dSmrg		count = 1;
4582c7c4e3dSmrg		break;
4592c7c4e3dSmrg	      case 32:
4602c7c4e3dSmrg		/*
4612c7c4e3dSmrg		 * Must have at least:
4622c7c4e3dSmrg		 *		VisualID0
4632c7c4e3dSmrg		 *		type
4642c7c4e3dSmrg		 *		count
4652c7c4e3dSmrg		 *		length
4662c7c4e3dSmrg		 *		intensity1
4672c7c4e3dSmrg		 *		intensity2
4682c7c4e3dSmrg		 */
4692c7c4e3dSmrg		if (nitems < 6) {
4702c7c4e3dSmrg		    goto IntensityTblError;
4712c7c4e3dSmrg		}
4722c7c4e3dSmrg		count = 0;
4732c7c4e3dSmrg		break;
4742c7c4e3dSmrg	      default:
4752c7c4e3dSmrg		goto IntensityTblError;
4762c7c4e3dSmrg	    }
4772c7c4e3dSmrg
4782c7c4e3dSmrg	    /*
4792c7c4e3dSmrg	     * Get VisualID
4802c7c4e3dSmrg	     */
4812c7c4e3dSmrg	    visualID = _XcmsGetElement(format, &pChar, &nitems);
4822c7c4e3dSmrg	    /* add the depth, class, and bits info in output */
4832c7c4e3dSmrg	    vinfo_template.visualid = visualID;
4842c7c4e3dSmrg	    vinfo_ret = XGetVisualInfo(dpy, VisualIDMask, &vinfo_template,
4852c7c4e3dSmrg				       &nvis);
4862c7c4e3dSmrg	    while (count--) {
4872c7c4e3dSmrg		visualID = visualID << format;
4882c7c4e3dSmrg		visualID |= _XcmsGetElement(format, &pChar, &nitems);
4892c7c4e3dSmrg	    }
4902c7c4e3dSmrg
4912c7c4e3dSmrg	    if (vinfo_ret != NULL) {
4922c7c4e3dSmrg		printf
4932c7c4e3dSmrg		 ("\n\tVisualID: 0x%lx class: %s depth: %d bits_per_rgb: %d\n",
4942c7c4e3dSmrg		  visualID, visual_strings[vinfo_ret->class],
4952c7c4e3dSmrg		  vinfo_ret->depth, vinfo_ret->bits_per_rgb);
4962c7c4e3dSmrg	    }
4972c7c4e3dSmrg	    else
4982c7c4e3dSmrg	    printf ("\n\tVisualID: 0x%lx\n", visualID);
4992c7c4e3dSmrg	    XFree(vinfo_ret);
5002c7c4e3dSmrg	    cType = _XcmsGetElement(format, &pChar, &nitems);
5012c7c4e3dSmrg	    printf ("\ttype: %d\n", cType);
5022c7c4e3dSmrg	    nTables = _XcmsGetElement(format, &pChar, &nitems);
5032c7c4e3dSmrg	    printf ("\tcount: %d\n", nTables);
5042c7c4e3dSmrg
5052c7c4e3dSmrg	    switch (cType) {
5062c7c4e3dSmrg	      case 0:
5072c7c4e3dSmrg		/* Red Table should always exist */
5082c7c4e3dSmrg		printf ("\tRed Conversion Table:\n");
5092c7c4e3dSmrg		PrintTableType0(format, &pChar, &nitems);
5102c7c4e3dSmrg		if (nTables > 1) {
5112c7c4e3dSmrg		    printf ("\tGreen Conversion Table:\n");
5122c7c4e3dSmrg		    PrintTableType0(format, &pChar, &nitems);
5132c7c4e3dSmrg		    printf ("\tBlue Conversion Table:\n");
5142c7c4e3dSmrg		    PrintTableType0(format, &pChar, &nitems);
5152c7c4e3dSmrg		}
5162c7c4e3dSmrg		break;
5172c7c4e3dSmrg	      case 1:
5182c7c4e3dSmrg		/* Red Table should always exist */
5192c7c4e3dSmrg		printf ("\tRed Conversion Table:\n");
5202c7c4e3dSmrg		PrintTableType1(format, &pChar, &nitems);
5212c7c4e3dSmrg		if (nTables > 1) {
5222c7c4e3dSmrg		    printf ("\tGreen Conversion Table:\n");
5232c7c4e3dSmrg		    PrintTableType1(format, &pChar, &nitems);
5242c7c4e3dSmrg		    printf ("\tBlue Conversion Table:\n");
5252c7c4e3dSmrg		    PrintTableType1(format, &pChar, &nitems);
5262c7c4e3dSmrg		}
5272c7c4e3dSmrg	        break;
5282c7c4e3dSmrg	      default:
5292c7c4e3dSmrg		goto IntensityTblError;
5302c7c4e3dSmrg	    }
5312c7c4e3dSmrg	}
5322c7c4e3dSmrg	XFree (property_return);
5332c7c4e3dSmrg    }
5342c7c4e3dSmrg    return;
5352c7c4e3dSmrg
5362c7c4e3dSmrgIntensityTblError:
5372c7c4e3dSmrg    XFree (property_return);
5382c7c4e3dSmrg    printf("Fatal error in %s property\n", XDCCC_CORRECT_ATOM_NAME);
5392c7c4e3dSmrg}
5402c7c4e3dSmrg
5412c7c4e3dSmrg
5422c7c4e3dSmrg#ifdef GRAY
5432c7c4e3dSmrg
5442c7c4e3dSmrg/*
5452c7c4e3dSmrg *      NAME
5462c7c4e3dSmrg *		QuerySCCDataGray - Query for the SCC data on the root window
5472c7c4e3dSmrg *
5482c7c4e3dSmrg *      SYNOPSIS
5492c7c4e3dSmrg */
5502c7c4e3dSmrgint
5512c7c4e3dSmrgQuerySCCDataGray(Display *dpy, Window root)
5522c7c4e3dSmrg/*
5532c7c4e3dSmrg *      DESCRIPTION
5542c7c4e3dSmrg *
5552c7c4e3dSmrg *      RETURNS
5562c7c4e3dSmrg *		None
5572c7c4e3dSmrg */
5582c7c4e3dSmrg{
5592c7c4e3dSmrg    char *property_return, *pChar;
5602c7c4e3dSmrg    int  j;
5612c7c4e3dSmrg    int  count, format, cType;
5622c7c4e3dSmrg    unsigned long  nitems, nbytes_return;
5632c7c4e3dSmrg    Atom MatricesAtom, CorrectAtom;
5642c7c4e3dSmrg    VisualID visualID;
5652c7c4e3dSmrg
5662c7c4e3dSmrg    MatricesAtom = ParseAtom (dpy, XDCCC_SCREENWHITEPT_ATOM_NAME, True);
5672c7c4e3dSmrg    if (MatricesAtom != None) {
5682c7c4e3dSmrg	if (_XcmsGetProperty (dpy, root, MatricesAtom, &format, &nitems,
5692c7c4e3dSmrg			  &nbytes_return, &property_return)  == XcmsFailure) {
5702c7c4e3dSmrg	    format = 0;
5712c7c4e3dSmrg	} else if (nitems != 3) {
5722c7c4e3dSmrg	    printf ("Property %s had invalid length of %d\n",
5732c7c4e3dSmrg		    XDCCC_SCREENWHITEPT_ATOM_NAME, nitems);
5742c7c4e3dSmrg	    if (property_return) {
5752c7c4e3dSmrg		XFree (property_return);
5762c7c4e3dSmrg	    }
5772c7c4e3dSmrg	    return;
5782c7c4e3dSmrg	}
5792c7c4e3dSmrg    }
5802c7c4e3dSmrg    if (MatricesAtom == None || !format) {
5812c7c4e3dSmrg	printf ("Could not find property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
5822c7c4e3dSmrg    } else {
5832c7c4e3dSmrg	pChar = property_return;
5842c7c4e3dSmrg	printf ("\nQuerying property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
5852c7c4e3dSmrg	printf ("\tWhite Point XYZ :\n");
5862c7c4e3dSmrg	printf ("\t");
5872c7c4e3dSmrg	for (j = 0; j < 3; j++) {
5882c7c4e3dSmrg	    printf ("\t%8.5lf",
5892c7c4e3dSmrg			(long) _XcmsGetElement(format, &pChar, &nitems) /
5902c7c4e3dSmrg			(XcmsFloat) XDCCC_NUMBER);
5912c7c4e3dSmrg	}
5922c7c4e3dSmrg	printf ("\n");
5932c7c4e3dSmrg	XFree (property_return);
5942c7c4e3dSmrg    }
5952c7c4e3dSmrg
5962c7c4e3dSmrg    CorrectAtom = XInternAtom (dpy, XDCCC_GRAY_CORRECT_ATOM_NAME, True);
5972c7c4e3dSmrg    if (CorrectAtom != None) {
5982c7c4e3dSmrg	if (_XcmsGetProperty (dpy, root, CorrectAtom, &format, &nitems,
5992c7c4e3dSmrg			  &nbytes_return, &property_return) == XcmsFailure) {
6002c7c4e3dSmrg	    format = 0;
6012c7c4e3dSmrg	} else if (nitems <= 0) {
6022c7c4e3dSmrg            printf ("Property %s had invalid length of %d\n",
6032c7c4e3dSmrg		    XDCCC_GRAY_CORRECT_ATOM_NAME, nitems);
6042c7c4e3dSmrg	    if (property_return) {
6052c7c4e3dSmrg		XFree (property_return);
6062c7c4e3dSmrg	    }
6072c7c4e3dSmrg	    return;
6082c7c4e3dSmrg	}
6092c7c4e3dSmrg    }
6102c7c4e3dSmrg    if (CorrectAtom == None || !format) {
6112c7c4e3dSmrg	printf ("Could not find property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
6122c7c4e3dSmrg    } else {
6132c7c4e3dSmrg	printf ("\nQuerying property %s\n\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
6142c7c4e3dSmrg	pChar = property_return;
6152c7c4e3dSmrg
6162c7c4e3dSmrg	while (nitems) {
6172c7c4e3dSmrg	    switch (format) {
6182c7c4e3dSmrg	      case 8:
6192c7c4e3dSmrg		/*
6202c7c4e3dSmrg		 * Must have at least:
6212c7c4e3dSmrg		 *		VisualID0
6222c7c4e3dSmrg		 *		VisualID1
6232c7c4e3dSmrg		 *		VisualID2
6242c7c4e3dSmrg		 *		VisualID3
6252c7c4e3dSmrg		 *		type
6262c7c4e3dSmrg		 *		count
6272c7c4e3dSmrg		 *		length
6282c7c4e3dSmrg		 *		intensity1
6292c7c4e3dSmrg		 *		intensity2
6302c7c4e3dSmrg		 */
6312c7c4e3dSmrg		if (nitems < 9) {
6322c7c4e3dSmrg		    goto IntensityTblError;
6332c7c4e3dSmrg		}
6342c7c4e3dSmrg		count = 3;
6352c7c4e3dSmrg		break;
6362c7c4e3dSmrg	      case 16:
6372c7c4e3dSmrg		/*
6382c7c4e3dSmrg		 * Must have at least:
6392c7c4e3dSmrg		 *		VisualID0
6402c7c4e3dSmrg		 *		VisualID3
6412c7c4e3dSmrg		 *		type
6422c7c4e3dSmrg		 *		count
6432c7c4e3dSmrg		 *		length
6442c7c4e3dSmrg		 *		intensity1
6452c7c4e3dSmrg		 *		intensity2
6462c7c4e3dSmrg		 */
6472c7c4e3dSmrg		if (nitems < 7) {
6482c7c4e3dSmrg		    goto IntensityTblError;
6492c7c4e3dSmrg		}
6502c7c4e3dSmrg		count = 1;
6512c7c4e3dSmrg		break;
6522c7c4e3dSmrg	      case 32:
6532c7c4e3dSmrg		/*
6542c7c4e3dSmrg		 * Must have at least:
6552c7c4e3dSmrg		 *		VisualID0
6562c7c4e3dSmrg		 *		type
6572c7c4e3dSmrg		 *		count
6582c7c4e3dSmrg		 *		length
6592c7c4e3dSmrg		 *		intensity1
6602c7c4e3dSmrg		 *		intensity2
6612c7c4e3dSmrg		 */
6622c7c4e3dSmrg		if (nitems < 6) {
6632c7c4e3dSmrg		    goto IntensityTblError;
6642c7c4e3dSmrg		}
6652c7c4e3dSmrg		count = 0;
6662c7c4e3dSmrg		break;
6672c7c4e3dSmrg	      default:
6682c7c4e3dSmrg		goto IntensityTblError;
6692c7c4e3dSmrg		break;
6702c7c4e3dSmrg	    }
6712c7c4e3dSmrg
6722c7c4e3dSmrg	    /*
6732c7c4e3dSmrg	     * Get VisualID
6742c7c4e3dSmrg	     */
6752c7c4e3dSmrg	    visualID = _XcmsGetElement(format, &pChar, &nitems);
6762c7c4e3dSmrg	    while (count--) {
6772c7c4e3dSmrg		visualID = visualID << format;
6782c7c4e3dSmrg		visualID |= _XcmsGetElement(format, &pChar, &nitems);
6792c7c4e3dSmrg	    }
6802c7c4e3dSmrg
6812c7c4e3dSmrg	    printf ("\n\tVisualID: 0x%lx\n", visualID);
6822c7c4e3dSmrg	    cType = _XcmsGetElement(format, &pChar, &nitems);
6832c7c4e3dSmrg	    printf ("\ttype: %d\n", cType);
6842c7c4e3dSmrg	    printf ("\tGray Conversion Table:\n");
6852c7c4e3dSmrg	    switch (cType) {
6862c7c4e3dSmrg	      case 0:
6872c7c4e3dSmrg		PrintTableType0(format, &pChar, &nitems);
6882c7c4e3dSmrg		break;
6892c7c4e3dSmrg	      case 1:
6902c7c4e3dSmrg		PrintTableType1(format, &pChar, &nitems);
6912c7c4e3dSmrg		break;
6922c7c4e3dSmrg	      default:
6932c7c4e3dSmrg		goto IntensityTblError;
6942c7c4e3dSmrg	    }
6952c7c4e3dSmrg	}
6962c7c4e3dSmrg	XFree (property_return);
6972c7c4e3dSmrg    }
6982c7c4e3dSmrg    return;
6992c7c4e3dSmrgIntensityTblError:
7002c7c4e3dSmrg    XFree (property_return);
7012c7c4e3dSmrg    printf("Fatal error in %s property\n", XDCCC_CORRECT_ATOM_NAME);
7022c7c4e3dSmrg}
7032c7c4e3dSmrg#endif /* GRAY */
7042c7c4e3dSmrg
7052c7c4e3dSmrg
7062c7c4e3dSmrg/*
7072c7c4e3dSmrg *      NAME
7082c7c4e3dSmrg *		RemoveSCCData - Remove for the SCC data on the root window
7092c7c4e3dSmrg *
7102c7c4e3dSmrg *      SYNOPSIS
7112c7c4e3dSmrg */
7122c7c4e3dSmrgstatic void
7132c7c4e3dSmrgRemoveSCCData(Display *dpy, Window root, int colorFlag)
7142c7c4e3dSmrg/*
7152c7c4e3dSmrg *      DESCRIPTION
7162c7c4e3dSmrg *
7172c7c4e3dSmrg *      RETURNS
7182c7c4e3dSmrg *		None
7192c7c4e3dSmrg */
7202c7c4e3dSmrg{
7212c7c4e3dSmrg    unsigned char *ret_prop;
7222c7c4e3dSmrg    unsigned long ret_len, ret_after;
7232c7c4e3dSmrg    int  ret_format;
7242c7c4e3dSmrg    Atom MatricesAtom, CorrectAtom, ret_atom;
7252c7c4e3dSmrg
7262c7c4e3dSmrg    if (colorFlag != 0) {
7272c7c4e3dSmrg	MatricesAtom = ParseAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);
7282c7c4e3dSmrg	if (MatricesAtom != None) {
7292c7c4e3dSmrg	    XGetWindowProperty (dpy, root, MatricesAtom, 0, 8192, False,
7302c7c4e3dSmrg			XA_INTEGER, &ret_atom, &ret_format, &ret_len,
7312c7c4e3dSmrg			&ret_after, &ret_prop);
7322c7c4e3dSmrg	}
7332c7c4e3dSmrg	if (MatricesAtom == None || !ret_format) {
7342c7c4e3dSmrg	    printf ("Could not find property %s\n", XDCCC_MATRIX_ATOM_NAME);
7352c7c4e3dSmrg	} else {
7362c7c4e3dSmrg	    printf ("Deleting property %s\n", XDCCC_MATRIX_ATOM_NAME);
7372c7c4e3dSmrg	    XDeleteProperty (dpy, root, MatricesAtom);
7382c7c4e3dSmrg	    XFree ((char *)ret_prop);
7392c7c4e3dSmrg	}
7402c7c4e3dSmrg
7412c7c4e3dSmrg	CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);
7422c7c4e3dSmrg	if (CorrectAtom != None) {
7432c7c4e3dSmrg	    XGetWindowProperty (dpy, root, CorrectAtom, 0, 8192, False,
7442c7c4e3dSmrg			XA_INTEGER, &ret_atom, &ret_format, &ret_len,
7452c7c4e3dSmrg			&ret_after, &ret_prop);
7462c7c4e3dSmrg	}
7472c7c4e3dSmrg	if (CorrectAtom == None || !ret_format) {
7482c7c4e3dSmrg	    printf ("Could not find property %s\n", XDCCC_CORRECT_ATOM_NAME);
7492c7c4e3dSmrg	} else {
7502c7c4e3dSmrg	    printf ("Deleting property %s\n", XDCCC_CORRECT_ATOM_NAME);
7512c7c4e3dSmrg	    XDeleteProperty (dpy, root, CorrectAtom);
7522c7c4e3dSmrg	    XFree ((char *)ret_prop);
7532c7c4e3dSmrg	}
7542c7c4e3dSmrg    }
7552c7c4e3dSmrg#ifdef GRAY
7562c7c4e3dSmrg    if (colorFlag != 1) {
7572c7c4e3dSmrg	MatricesAtom = ParseAtom (dpy, XDCCC_SCREENWHITEPT_ATOM_NAME, True);
7582c7c4e3dSmrg	if (MatricesAtom != None) {
7592c7c4e3dSmrg	    XGetWindowProperty (dpy, root, MatricesAtom, 0, 8192, False,
7602c7c4e3dSmrg			XA_INTEGER, &ret_atom, &ret_format, &ret_len,
7612c7c4e3dSmrg			&ret_after, &ret_prop);
7622c7c4e3dSmrg	}
7632c7c4e3dSmrg	if (MatricesAtom == None || !ret_format) {
7642c7c4e3dSmrg	    printf ("Could not find property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
7652c7c4e3dSmrg	} else {
7662c7c4e3dSmrg	    printf ("Deleting property %s\n", XDCCC_SCREENWHITEPT_ATOM_NAME);
7672c7c4e3dSmrg	    XDeleteProperty (dpy, root, MatricesAtom);
7682c7c4e3dSmrg	    XFree ((char *)ret_prop);
7692c7c4e3dSmrg	}
7702c7c4e3dSmrg
7712c7c4e3dSmrg	CorrectAtom = XInternAtom (dpy, XDCCC_GRAY_CORRECT_ATOM_NAME, True);
7722c7c4e3dSmrg	if (CorrectAtom != None) {
7732c7c4e3dSmrg	    XGetWindowProperty (dpy, root, CorrectAtom, 0, 8192, False,
7742c7c4e3dSmrg			XA_INTEGER, &ret_atom, &ret_format, &ret_len,
7752c7c4e3dSmrg			&ret_after, &ret_prop);
7762c7c4e3dSmrg	}
7772c7c4e3dSmrg	if (CorrectAtom == None || !ret_format) {
7782c7c4e3dSmrg	    printf ("Could not find property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
7792c7c4e3dSmrg	} else {
7802c7c4e3dSmrg	    printf ("Deleting property %s\n", XDCCC_GRAY_CORRECT_ATOM_NAME);
7812c7c4e3dSmrg	    XDeleteProperty (dpy, root, CorrectAtom);
7822c7c4e3dSmrg	    XFree ((char *)ret_prop);
7832c7c4e3dSmrg	}
7842c7c4e3dSmrg    }
7852c7c4e3dSmrg#endif /* GRAY */
7862c7c4e3dSmrg}
7872c7c4e3dSmrg
7882c7c4e3dSmrgstatic unsigned long
7892c7c4e3dSmrg_XcmsGetElement(int format, char **pValue, unsigned long *pCount)
7902c7c4e3dSmrg/*
7912c7c4e3dSmrg *	DESCRIPTION
7922c7c4e3dSmrg *	    Get the next element from the property and return it.
7932c7c4e3dSmrg *	    Also increment the pointer the amount needed.
7942c7c4e3dSmrg *
7952c7c4e3dSmrg *	Returns
7962c7c4e3dSmrg *	    unsigned long
7972c7c4e3dSmrg */
7982c7c4e3dSmrg{
7992c7c4e3dSmrg    unsigned long value;
8002c7c4e3dSmrg
8012c7c4e3dSmrg    switch (format) {
8022c7c4e3dSmrg      case 32:
8032c7c4e3dSmrg	value = *((unsigned long *)(*pValue)) & 0xFFFFFFFF;
8042c7c4e3dSmrg	*pValue += sizeof(unsigned long);
8052c7c4e3dSmrg	*pCount -= 1;
8062c7c4e3dSmrg	break;
8072c7c4e3dSmrg      case 16:
8082c7c4e3dSmrg	value = *((unsigned short *)(*pValue));
8092c7c4e3dSmrg	*pValue += sizeof(unsigned short);
8102c7c4e3dSmrg	*pCount -= 1;
8112c7c4e3dSmrg	break;
8122c7c4e3dSmrg      case 8:
8132c7c4e3dSmrg	value = *((unsigned char *) (*pValue));
8142c7c4e3dSmrg	*pValue += 1;
8152c7c4e3dSmrg	*pCount -= 1;
8162c7c4e3dSmrg	break;
8172c7c4e3dSmrg      default:
8182c7c4e3dSmrg	value = 0;
8192c7c4e3dSmrg	break;
8202c7c4e3dSmrg    }
8212c7c4e3dSmrg    return(value);
8222c7c4e3dSmrg}
8232c7c4e3dSmrg
8242c7c4e3dSmrg
8252c7c4e3dSmrg/*
8262c7c4e3dSmrg *	NAME
8272c7c4e3dSmrg *		_XcmsGetProperty -- Determine the existance of a property
8282c7c4e3dSmrg *
8292c7c4e3dSmrg *	SYNOPSIS
8302c7c4e3dSmrg */
8312c7c4e3dSmrgstatic int
8322c7c4e3dSmrg_XcmsGetProperty(Display *pDpy, Window w, Atom property, int *pFormat,
8332c7c4e3dSmrg		 unsigned long *pNItems, unsigned long *pNBytes,
8342c7c4e3dSmrg		 char **pValue)
8352c7c4e3dSmrg/*
8362c7c4e3dSmrg *	DESCRIPTION
8372c7c4e3dSmrg *
8382c7c4e3dSmrg *	Returns
8392c7c4e3dSmrg *	    0 if property does not exist.
8402c7c4e3dSmrg *	    1 if property exists.
8412c7c4e3dSmrg */
8422c7c4e3dSmrg{
8432c7c4e3dSmrg    char *prop_ret;
8442c7c4e3dSmrg    int format_ret;
8452c7c4e3dSmrg    long len = 6516;
8462c7c4e3dSmrg    unsigned long nitems_ret, after_ret;
8472c7c4e3dSmrg    Atom atom_ret;
8482c7c4e3dSmrg
8492c7c4e3dSmrg    while (XGetWindowProperty (pDpy, w, property, 0, len, False,
8502c7c4e3dSmrg			       XA_INTEGER, &atom_ret, &format_ret,
8512c7c4e3dSmrg			       &nitems_ret, &after_ret,
8522c7c4e3dSmrg			       (unsigned char **)&prop_ret)) {
8532c7c4e3dSmrg	if (after_ret > 0) {
8542c7c4e3dSmrg	    len += nitems_ret * (format_ret >> 3);
8552c7c4e3dSmrg	    XFree (prop_ret);
8562c7c4e3dSmrg	} else {
8572c7c4e3dSmrg	    break;
8582c7c4e3dSmrg	}
8592c7c4e3dSmrg    }
8602c7c4e3dSmrg    if (format_ret == 0 || nitems_ret == 0) {
8612c7c4e3dSmrg	/* the property does not exist or is of an unexpected type */
8622c7c4e3dSmrg	return(XcmsFailure);
8632c7c4e3dSmrg    }
8642c7c4e3dSmrg
8652c7c4e3dSmrg    *pFormat = format_ret;
8662c7c4e3dSmrg    *pNItems = nitems_ret;
8672c7c4e3dSmrg    *pNBytes = nitems_ret * (format_ret >> 3);
8682c7c4e3dSmrg    *pValue = prop_ret;
8692c7c4e3dSmrg    return(XcmsSuccess);
8702c7c4e3dSmrg}
871