summaryrefslogtreecommitdiff
path: root/xlsatoms.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlsatoms.c')
-rw-r--r--xlsatoms.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/xlsatoms.c b/xlsatoms.c
new file mode 100644
index 0000000..ca2d68f
--- /dev/null
+++ b/xlsatoms.c
@@ -0,0 +1,235 @@
+/*
+ * $Xorg: xlsatoms.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $
+ *
+Copyright 1989, 1998 The Open Group
+
+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.
+
+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
+OPEN GROUP 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 Open Group 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 Open Group.
+ *
+ * Author: Jim Fulton, MIT X Consortium
+ */
+
+#include <stdio.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/Xproto.h>
+#include <X11/Xmu/Error.h>
+
+char *ProgramName;
+
+static void usage ()
+{
+ fprintf (stderr, "usage: %s [-options...]\n\n", ProgramName);
+ fprintf (stderr, "where options include:\n");
+ fprintf (stderr,
+ " -display dpy X server to which to connect\n");
+ fprintf (stderr,
+ " -format string printf-style format to use\n");
+ fprintf (stderr,
+ " -range [num]-[num] atom values to list\n");
+ fprintf (stderr,
+ " -name string name of single atom to print\n");
+ putc ('\n', stderr);
+ exit (1);
+}
+
+
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *displayname = NULL;
+ char *format = "%lu\t%s";
+ int i, doit;
+ int didit = 0;
+ Display *dpy = NULL;
+
+ ProgramName = argv[0];
+
+ for (doit = 0; doit < 2; doit++) { /* pre-parse to get display */
+ for (i = 1; i < argc; i++) {
+ char *arg = argv[i];
+
+ if (arg[0] == '-') {
+ switch (arg[1]) {
+ case 'd': /* -display dpy */
+ if (++i >= argc) usage ();
+ if (!doit) displayname = argv[i];
+ continue;
+ case 'f': /* -format string */
+ if (++i >= argc) usage ();
+ if (doit) format = argv[i];
+ continue;
+ case 'r': /* -range num-[num] */
+ if (++i >= argc) usage ();
+ if (doit) {
+ do_range (dpy, format, argv[i]);
+ didit = 1;
+ }
+ continue;
+ case 'n': /* -name string */
+ if (++i >= argc) usage ();
+ if (doit) {
+ do_name (dpy, format, argv[i]);
+ didit = 1;
+ }
+ continue;
+ }
+ }
+ usage ();
+ }
+ if (!doit) {
+ dpy = XOpenDisplay (displayname);
+ if (!dpy) {
+ fprintf (stderr, "%s: unable to open display \"%s\"\n",
+ ProgramName, XDisplayName (displayname));
+ exit (1);
+ }
+ } else
+ if (!didit) /* no options, default is list all */
+ list_atoms(dpy, format, 0, 0, 0);
+ }
+
+ XCloseDisplay (dpy);
+ exit (0);
+}
+
+do_name (dpy, format, name)
+ Display *dpy;
+ char *format;
+ char *name;
+{
+ Atom a = XInternAtom (dpy, name, True);
+
+ if (a != None) {
+ printf (format, (unsigned long) a, name);
+ putchar ('\n');
+ } else {
+ fprintf (stderr, "%s: no atom named \"%s\" on server \"%s\"\n",
+ ProgramName, name, DisplayString(dpy));
+ }
+}
+
+
+#define RangeLow (1 << 0)
+#define RangeHigh (1 << 1)
+
+static int parse_range (range, lowp, highp)
+ char *range;
+ long *lowp, *highp;
+{
+ char *dash;
+ int mask = 0;
+
+ if (!range) { /* NULL means default */
+ *lowp = 1;
+ return RangeLow;
+ }
+
+ dash = strchr(range, '-');
+ if (!dash) dash = strchr(range, ':');
+ if (dash) {
+ if (dash == range) { /* -high */
+ *lowp = 1;
+ } else { /* low-[high] */
+ *dash = '\0';
+ *lowp = atoi (range);
+ *dash = '-';
+ }
+ mask |= RangeLow;
+ dash++;
+ if (*dash) { /* [low]-high */
+ *highp = atoi (dash);
+ mask |= RangeHigh;
+ }
+ } else { /* number (low == high) */
+ *lowp = *highp = atoi (range);
+ mask |= (RangeLow | RangeHigh);
+ }
+
+ return mask;
+}
+
+do_range (dpy, format, range)
+ Display *dpy;
+ char *format;
+ char *range;
+{
+ int mask;
+ long low, high;
+
+ mask = parse_range (range, &low, &high);
+ list_atoms (dpy, format, mask, low, high);
+}
+
+
+static int catcher (dpy, err)
+ Display *dpy;
+ XErrorEvent *err;
+{
+ if (err->request_code != X_GetAtomName) {
+ XmuPrintDefaultErrorMessage (dpy, err, stderr);
+ }
+ return 0;
+}
+
+list_atoms (dpy, format, mask, low, high)
+ Display *dpy;
+ char *format;
+ int mask;
+ long low, high;
+{
+ int (*oldhandler)() = XSetErrorHandler (catcher);
+
+ switch (mask) {
+ case RangeHigh:
+ low = 1;
+ /* fall through */
+ case (RangeLow | RangeHigh):
+ for (; low <= high; low++) {
+ char *s = XGetAtomName (dpy, (Atom)low);
+ if (s) {
+ printf (format, low, s);
+ putchar ('\n');
+ XFree (s);
+ }
+ }
+ break;
+
+ default:
+ low = 1;
+ /* fall through */
+ case RangeLow:
+ for (; ; low++) {
+ char *s = XGetAtomName (dpy, (Atom)low);
+ if (s) {
+ printf (format, low, s);
+ putchar ('\n');
+ XFree (s);
+ } else {
+ break;
+ }
+ }
+ break;
+ }
+
+ XSetErrorHandler (oldhandler);
+ return;
+}