diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:57 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 16:48:57 +0000 |
commit | 874408d7537bb75aae3716ad7ebafdf155e1ab0f (patch) | |
tree | 65698f43d8d9cce6c7dd85f190e61cbdd7422f45 /listres.c |
Initial revisionXORG-STABLE
Diffstat (limited to 'listres.c')
-rw-r--r-- | listres.c | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/listres.c b/listres.c new file mode 100644 index 0000000..9d53e71 --- /dev/null +++ b/listres.c @@ -0,0 +1,306 @@ +/* + * $XConsortium: listres.c,v 1.32 94/04/17 20:43:22 dave Exp $ + * + * +Copyright (c) 1989 X Consortium + +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, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +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. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + * * + * Author: Jim Fulton, MIT X Consortium + */ +/* $XFree86: xc/programs/listres/listres.c,v 1.4 2001/04/01 14:00:18 tsi Exp $ */ + +#include <stdio.h> +#include <stdlib.h> +#include <X11/Xos.h> +#include <X11/StringDefs.h> +#include <X11/IntrinsicP.h> +#include <X11/Xaw/Cardinals.h> +#include <X11/Core.h> +#include <X11/Xmu/CharSet.h> +#include <X11/Xmu/WidgetNode.h> +#include <X11/Xaw/AllWidgets.h> + +#define widget_list XawWidgetArray /* or motif or ol or ... */ +#define nwidgets XawWidgetCount + + +static XrmOptionDescRec Options[] = { + { "-top", "*topObject", XrmoptionSepArg, (caddr_t) NULL }, + { "-format", "*resourceFormat", XrmoptionSepArg, (caddr_t) NULL }, + { "-tree", "*showTree", XrmoptionNoArg, (caddr_t) "on" }, + { "-nosuper", "*showSuper", XrmoptionNoArg, (caddr_t) "off" }, + { "-variable", "*showVariable", XrmoptionNoArg, (caddr_t) "on" }, +}; + +typedef struct { + Boolean show_tree; + Boolean show_all; + Boolean show_variable; + Boolean show_superclass; + char *top_object; + char *format; + } OptionsRec; + +OptionsRec options; + +#define Offset(field) XtOffsetOf(OptionsRec, field) + +static XtResource Resources[] = { + { "showTree", "ShowTree", XtRBoolean, sizeof(Boolean), + Offset(show_tree), XtRImmediate, (XtPointer) FALSE }, + { "showSuper", "ShowSuper", XtRBoolean, sizeof(Boolean), + Offset(show_superclass), XtRImmediate, (caddr_t) TRUE }, + { "showVariable", "ShowVariable", XtRBoolean, sizeof(Boolean), + Offset(show_variable), XtRImmediate, (caddr_t) FALSE }, + { "topObject", "TopObject", XtRString, sizeof(char *), + Offset(top_object), XtRString, (caddr_t) "core" }, + { "resourceFormat", "ResourceFormat", XtRString, sizeof(char *), + Offset(format), XtRString, (caddr_t) " %-16s %20s %-20s %s" }, +}; + +#undef Offset + +const char *ProgramName; + +void +usage () +{ + fprintf(stderr, "usage: %s [-options...]\n", ProgramName); + fprintf(stderr, "\nwhere options include:\n"); + fprintf(stderr, + " -all list all known widget and object classes\n"); + fprintf(stderr, + " -tree list all widgets and objects in a tree\n"); + fprintf(stderr, + " -nosuper do not print superclass resources\n"); + fprintf(stderr, + " -variable show variable name instead of class name\n"); + fprintf(stderr, + " -top name object to be top of tree\n"); + fprintf(stderr, + " -format string printf format for instance, class, type\n"); + fprintf(stderr, "\n"); + exit (1); +} + +static void print_tree_level (wn, level) + register XmuWidgetNode *wn; + register int level; +{ + register int i; + + if (!wn) return; + + for (i = 0; i < level; i++) { + putchar (' '); putchar (' '); + } + printf ("%d: %s/%s\n", level, wn->label, XmuWnClassname(wn)); + print_tree_level (wn->children, level + 1); + print_tree_level (wn->siblings, level); +} + +static void tree_known_widgets () +{ + register int i; + register XmuWidgetNode *wn; + + for (i = 0, wn = widget_list; i < nwidgets; i++, wn++) { + if (!wn->superclass) { /* list all rooted objects */ + print_tree_level (wn, 0); + } + } +} + + +/* + * print_classname - print out the superclass-to-subclass hierchy of names + * in the form super\sub\sub.... + */ +static int print_classname (node, topnode, level, showvar) + XmuWidgetNode *node, *topnode; + int level; + Bool showvar; +{ + int retval; + + if (node && node != topnode) { + retval = print_classname (node->superclass, topnode, level + 1, + showvar); + } else { + retval = level - 1; + } + if (node) + printf ("%s%s", showvar ? node->label : XmuWnClassname(node), + level ? "\\" : ""); + + return retval; +} + +static void list_known_widgets () +{ + int i; + XmuWidgetNode *wn; + int width = 0; + char format[20]; + + for (i = 0, wn = widget_list; i < nwidgets; i++, wn++) { + int l = strlen (wn->label); + if (l > width) width = l; + } + sprintf (format, "%%-%ds ", width); + for (i = 0, wn = widget_list; i < nwidgets; i++, wn++) { + printf (format, wn->label); + print_classname (wn, (XmuWidgetNode *) NULL, 0, False); + putchar ('\n'); + } +} + +/* ARGSUSED */ +static void print_resources (node, format, topnode, showsuper, showvar) + XmuWidgetNode *node; + const char *format; + XmuWidgetNode *topnode; + Bool showsuper; + Bool showvar; +{ + int i; + XtResourceList res = node->resources; + XmuWidgetNode **wn = node->resourcewn; + + for (i = 0; i < node->nresources; i++, res++, wn++) { + if (!showsuper && *wn != node) continue; + printf (format, showvar ? (*wn)->label : XmuWnClassname(*wn), + res->resource_name, res->resource_class, res->resource_type); + putchar ('\n'); + } + if (node->nconstraints > 0) { + printf (format, "----", "----", "----", "----"); + putchar ('\n'); + } + res = node->constraints; + wn = node->constraintwn; + for (i = 0; i < node->nconstraints; i++, res++, wn++) { + if (!showsuper && *wn != node) continue; + printf (format, showvar ? (*wn)->label : XmuWnClassname(*wn), + res->resource_name, res->resource_class, res->resource_type); + putchar ('\n'); + } + return; +} + + +/* + * list_resources - display resources of a widget, identifying class from + * which they come + */ +static void +list_resources (node, format, topnode, toplevel, showsuper, showvar) + XmuWidgetNode *node; + const char *format; + XmuWidgetNode *topnode; + Widget toplevel; + Bool showsuper; + Bool showvar; +{ + static Bool first = True; + + XmuWnFetchResources (node, toplevel, topnode); + if (first) { + printf (format, showvar ? "Variable" : "WidgetClass", + "Instance", "Class", "Type"); + putchar ('\n'); + printf (format, showvar ? "--------" : "-----------", + "--------", "-----", "----"); + putchar ('\n'); + first = False; + } + printf ("%s: ", node->label); + print_classname (node, topnode, 0, showvar); + putchar ('\n'); + print_resources (node, format, topnode, showsuper, showvar); + putchar ('\n'); +} + + +int +main (argc, argv) + int argc; + char **argv; +{ + int i; + XtAppContext appcon; + XmuWidgetNode *topnode; + Widget toplevel, container; + + ProgramName = argv[0]; + + XtSetLanguageProc(NULL, (XtLanguageProc) NULL, NULL); + + toplevel = XtAppInitialize (&appcon, "Listres", Options, XtNumber(Options), + &argc, argv, NULL, NULL, 0); + container = XtCreateWidget ("dummy", widgetClass, toplevel, NULL, ZERO); + + XtGetApplicationResources (toplevel, (caddr_t) &options, + Resources, XtNumber(Resources), NULL, ZERO); + XmuWnInitializeNodes (widget_list, nwidgets); + if (argc == 1) { + if (options.show_tree) { + tree_known_widgets(); + } else { + list_known_widgets(); + } + exit (0); + } + + topnode = XmuWnNameToNode (widget_list, nwidgets, options.top_object); + argc--, argv++; /* skip command */ + + if (argc > 0 && argv[0][0] == '-') { + int len = strlen (argv[0]); + if (len >= 2 && strncmp(argv[0], "-all", len) == 0) { + XmuWidgetNode *wn; + for (i = 0, wn = widget_list; i < nwidgets; i++, wn++) { + list_resources (wn, options.format, topnode, container, + (Bool) options.show_superclass, + (Bool) options.show_variable); + } + } else + usage(); + } else { + for (; argc > 0; argc--, argv++) { + XmuWidgetNode *node; + + if (argv[0][0] == '-') usage (); + node = XmuWnNameToNode (widget_list, nwidgets, *argv); + if (!node) { + fprintf (stderr, "%s: unable to find widget \"%s\"\n", + ProgramName, *argv); + continue; + } + list_resources (node, options.format, topnode, container, + (Bool) options.show_superclass, + (Bool) options.show_variable); + } + } + exit (0); +} |