open-src/app/xlswins/sun-src/xlswins.c
changeset 501 172978e9a050
child 1233 1134c9fd2fe6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/open-src/app/xlswins/sun-src/xlswins.c	Wed Aug 13 16:21:50 2008 -0700
@@ -0,0 +1,301 @@
+/*
+ * $XConsortium: xlswins.c,v 1.12 89/12/10 17:14:02 rws Exp $
+ *
+ * Copyright 1989 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  M.I.T. makes no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR 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.
+ *
+ * Author:  Jim Fulton, MIT X Consortium
+ */
+
+#include <stdio.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+char *ProgramName;
+static char *output_format = "0x%lx";
+static char widget_name_buf[1024], widget_class_buf[1024];
+
+static void usage ()
+{
+    static char *help[] = {
+"    -display displayname             X server to contact",
+"    -format {hex, decimal, octal}    format used to print window id",
+"    -indent number                   amount to indent per level",
+"    -long                            print a long listing",
+"    -resources                       print a listing of widget resources",
+"",
+NULL};
+    char **cpp;
+
+    fprintf (stderr, "usage:\n        %s [-options ...] [windowid] ...\n\n",
+	     ProgramName);
+    fprintf (stderr, "where options include:\n");
+    for (cpp = help; *cpp; cpp++) {
+	fprintf (stderr, "%s\n", *cpp);
+    }
+    exit (1);
+}
+
+static long parse_long (s)
+    char *s;
+{
+    char *fmt = "%lu";
+    long retval = 0;
+
+    if (s && *s) {
+	if (*s == '0') s++, fmt = "%lo";
+	if (*s == 'x' || *s == 'X') s++, fmt = "%lx";
+	(void) sscanf (s, fmt, &retval);
+    }
+    return retval;
+}
+
+static int got_xerror = 0;
+
+static int myxerror (dpy, rep)
+    Display *dpy;
+    XErrorEvent *rep;
+{
+    char buffer[BUFSIZ];
+    char mesg[BUFSIZ];
+    char number[32];
+    char *mtype = "XlibMessage";
+
+    got_xerror++;
+    if (rep->error_code == BadWindow) {
+	fflush (stdout);
+	fprintf (stderr, "%s:  no such window ", ProgramName);
+	fprintf (stderr, output_format, rep->resourceid);
+	fprintf (stderr, "\n");
+	return 0;
+    }
+    XGetErrorText(dpy, rep->error_code, buffer, BUFSIZ);
+    XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
+    (void) fprintf(stderr, "%s: %s\n  ", mesg, buffer);
+    XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", 
+        mesg, BUFSIZ);
+    (void) fprintf(stderr, mesg, rep->request_code);
+    sprintf(number, "%d", rep->request_code);
+    XGetErrorDatabaseText(dpy, "XRequest", number, "",  buffer, BUFSIZ);
+    (void) fprintf(stderr, " %s", buffer);
+    fputs("\n  ", stderr);
+    XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code", 
+        mesg, BUFSIZ);
+    (void) fprintf(stderr, mesg, rep->minor_code);
+    fputs("\n  ", stderr);
+    XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+        mesg, BUFSIZ);
+    (void) fprintf(stderr, mesg, rep->resourceid);
+    fputs("\n  ", stderr);
+    XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", 
+        mesg, BUFSIZ);
+    (void) fprintf(stderr, mesg, rep->serial);
+    fputs("\n  ", stderr);
+    XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
+        mesg, BUFSIZ);
+    (void) fprintf(stderr, mesg, NextRequest(dpy)-1);
+    fputs("\n", stderr);
+    if (rep->error_code == BadImplementation) return 0;
+    exit (1);
+}
+
+
+main (argc, argv)
+    int argc;
+    char *argv[];
+{
+    char *displayname = NULL;
+    Display *dpy;
+    Bool long_version = False;
+    Bool print_resources = False;
+    int i;
+    int indent = 2;
+
+    ProgramName = argv[0];
+
+    for (i = 1; i < argc; i++) {
+	char *arg = argv[i];
+
+	if (arg[0] == '-') {
+	    switch (arg[1]) {
+	      case 'd':			/* -display displayname */
+		if (++i >= argc) usage ();
+		displayname = argv[i];
+		continue;
+	      case 'i':			/* -indent number */
+		if (++i >= argc) usage ();
+		indent = atoi (argv[i]);
+		continue;
+	      case 'l':
+		long_version = True;	/* -long */
+		continue;
+	      case 'r':			/* -resources */
+		print_resources = True;
+		continue;
+	      case 'f':			/* -format [odh] */
+		if (++i >= argc) usage ();
+		switch (argv[i][0]) {
+		  case 'd':		/* decimal */
+		    output_format = "%lu";
+		    continue;
+		  case 'o':		/* octal */
+		    output_format = "0%lo";
+		    continue;
+		  case 'h':		/* hex */
+		    output_format = "0x%lx";
+		    continue;
+		}
+		usage ();
+
+	      default:
+		usage ();
+	    }
+	} else {
+	    break;			/* out of for loop */
+	}
+    }
+
+    dpy = XOpenDisplay (displayname);
+    if (!dpy) {
+	fprintf (stderr, "%s:  unable to open display \"%s\"\n",
+		 ProgramName, XDisplayName (displayname));
+	exit (1);
+    }
+
+    XSetErrorHandler (myxerror);
+
+    widget_name_buf[0] = widget_class_buf[0] = '\0';
+    if (i >= argc) {
+	list_window (dpy, RootWindow (dpy, DefaultScreen (dpy)), 0, 
+		     indent, long_version, print_resources, 
+		     widget_name_buf, widget_class_buf);
+    } else {
+	for (; i < argc; i++) {
+	    Window w = parse_long (argv[i]);
+	    if (w == 0) {
+		fprintf (stderr, "%s:  bad window number \"%s\"\n",
+			 ProgramName, argv[i]);
+	    } else {
+		list_window (dpy, w, 0, indent, long_version, print_resources,
+			     widget_name_buf, widget_class_buf);
+	    }
+	}
+    }
+
+    XCloseDisplay (dpy);
+    exit (0);
+}
+
+
+list_window (dpy, w, depth, indent, long_version, print_resources,
+	     pname, pclass)
+    Display *dpy;
+    Window w;
+    int depth;
+    int indent;
+    Bool long_version;
+    Bool print_resources;
+    char *pname, *pclass;
+{
+    Window root, parent;
+    unsigned int nchildren;
+    Window *children = NULL;
+    int n;
+    char *name = NULL;
+    XClassHint ch;
+    int pnamelen, pclasslen;
+
+    if (!print_resources) {
+	if (long_version) {
+	    printf ("%d:  ", depth);
+	}
+	for (n = depth * indent; n > 0; n--) {
+	    putchar (' ');
+	}
+	printf (output_format, w);
+    }
+
+    /*
+     * if we put anything before the XFetchName then we'll have to change the
+     * error handler
+     */
+    got_xerror = 0;
+    (void) XFetchName (dpy, w, &name);
+
+    ch.res_name = ch.res_class = NULL;
+    if (!print_resources) {
+	printf ("  (%s)", name ? name : "");
+
+	if (long_version && got_xerror == 0) {
+	    int x, y, rx, ry;
+	    unsigned int width, height, bw, depth;
+
+	    if (XGetClassHint (dpy, w, &ch)) {
+		printf ("; (%s)(%s)", 
+			ch.res_name ? ch.res_name : "nil",
+			ch.res_class ? ch.res_class : "nil");
+	    } else {
+		printf ("; ()()");
+	    }
+
+	    if (XGetGeometry(dpy, w, &root, &x,&y,&width,&height,&bw,&depth)) {
+		Window child;
+
+		printf ("    %ux%u+%d+%d", width, height, x, y);
+		if (XTranslateCoordinates (dpy, w,root,0,0,&rx,&ry,&child)) {
+		    printf ("  +%d+%d", rx - bw, ry - bw);
+		}
+	    }
+	}
+    } else {
+	(void) XGetClassHint (dpy, w, &ch);
+	if (got_xerror == 0) {
+	    if (*pname) strcat (pname, ".");
+	    if (ch.res_name) strcat (pname, ch.res_name);
+	    if (*pclass) strcat (pclass, ".");
+	    if (ch.res_class) strcat (pclass, ch.res_class);
+
+	    printf ("%s  =  %s", pclass, pname);
+	}
+    }
+    putchar ('\n');
+
+    if (got_xerror) goto done;
+
+    if (!XQueryTree (dpy, w, &root, &parent, &children, &nchildren))
+      goto done;
+
+    pnamelen = strlen(pname);
+    pclasslen = strlen(pclass);
+    for (n = 0; n < nchildren; n++) {
+	pname[pnamelen] = '\0';
+	pclass[pclasslen] = '\0';
+	list_window (dpy, children[n], depth + 1, indent, long_version,
+		     print_resources, pname, pclass);
+    }
+
+  done:
+    if (ch.res_name) XFree (ch.res_name);
+    if (ch.res_class) XFree (ch.res_class);
+    if (name) XFree ((char *) name);
+    if (children) XFree ((char *) children);
+    return;
+}
+