xlsatoms.c revision fdb3d228
1fdb3d228Smrg/* 2fdb3d228Smrg * $Xorg: xlsatoms.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $ 3fdb3d228Smrg * 4fdb3d228SmrgCopyright 1989, 1998 The Open Group 5fdb3d228Smrg 6fdb3d228SmrgPermission to use, copy, modify, distribute, and sell this software and its 7fdb3d228Smrgdocumentation for any purpose is hereby granted without fee, provided that 8fdb3d228Smrgthe above copyright notice appear in all copies and that both that 9fdb3d228Smrgcopyright notice and this permission notice appear in supporting 10fdb3d228Smrgdocumentation. 11fdb3d228Smrg 12fdb3d228SmrgThe above copyright notice and this permission notice shall be included in 13fdb3d228Smrgall copies or substantial portions of the Software. 14fdb3d228Smrg 15fdb3d228SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16fdb3d228SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17fdb3d228SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18fdb3d228SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 19fdb3d228SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20fdb3d228SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21fdb3d228Smrg 22fdb3d228SmrgExcept as contained in this notice, the name of The Open Group shall not be 23fdb3d228Smrgused in advertising or otherwise to promote the sale, use or other dealings 24fdb3d228Smrgin this Software without prior written authorization from The Open Group. 25fdb3d228Smrg * 26fdb3d228Smrg * Author: Jim Fulton, MIT X Consortium 27fdb3d228Smrg */ 28fdb3d228Smrg/* $XFree86: xc/programs/xlsatoms/xlsatoms.c,v 1.5 2001/04/01 14:00:23 tsi Exp $ */ 29fdb3d228Smrg 30fdb3d228Smrg#include <stdio.h> 31fdb3d228Smrg#include <stdlib.h> 32fdb3d228Smrg#include <X11/Xos.h> 33fdb3d228Smrg#include <X11/Xlib.h> 34fdb3d228Smrg#include <X11/Xproto.h> 35fdb3d228Smrg#include <X11/Xmu/Error.h> 36fdb3d228Smrg 37fdb3d228Smrgchar *ProgramName; 38fdb3d228Smrg 39fdb3d228Smrgstatic void do_name ( Display *dpy, char *format, char *name ); 40fdb3d228Smrgstatic int parse_range ( char *range, long *lowp, long *highp ); 41fdb3d228Smrgstatic void do_range ( Display *dpy, char *format, char *range ); 42fdb3d228Smrgstatic int catcher ( Display *dpy, XErrorEvent *err ); 43fdb3d228Smrgstatic void list_atoms ( Display *dpy, char *format, int mask, 44fdb3d228Smrg long low, long high ); 45fdb3d228Smrg 46fdb3d228Smrgstatic void 47fdb3d228Smrgusage(void) 48fdb3d228Smrg{ 49fdb3d228Smrg fprintf (stderr, "usage: %s [-options...]\n\n", ProgramName); 50fdb3d228Smrg fprintf (stderr, "where options include:\n"); 51fdb3d228Smrg fprintf (stderr, 52fdb3d228Smrg " -display dpy X server to which to connect\n"); 53fdb3d228Smrg fprintf (stderr, 54fdb3d228Smrg " -format string printf-style format to use\n"); 55fdb3d228Smrg fprintf (stderr, 56fdb3d228Smrg " -range [num]-[num] atom values to list\n"); 57fdb3d228Smrg fprintf (stderr, 58fdb3d228Smrg " -name string name of single atom to print\n"); 59fdb3d228Smrg putc ('\n', stderr); 60fdb3d228Smrg exit (1); 61fdb3d228Smrg} 62fdb3d228Smrg 63fdb3d228Smrgint 64fdb3d228Smrgmain(int argc, char *argv[]) 65fdb3d228Smrg{ 66fdb3d228Smrg char *displayname = NULL; 67fdb3d228Smrg char *format = "%lu\t%s"; 68fdb3d228Smrg int i, doit; 69fdb3d228Smrg int didit = 0; 70fdb3d228Smrg Display *dpy = NULL; 71fdb3d228Smrg 72fdb3d228Smrg ProgramName = argv[0]; 73fdb3d228Smrg 74fdb3d228Smrg for (doit = 0; doit < 2; doit++) { /* pre-parse to get display */ 75fdb3d228Smrg for (i = 1; i < argc; i++) { 76fdb3d228Smrg char *arg = argv[i]; 77fdb3d228Smrg 78fdb3d228Smrg if (arg[0] == '-') { 79fdb3d228Smrg switch (arg[1]) { 80fdb3d228Smrg case 'd': /* -display dpy */ 81fdb3d228Smrg if (++i >= argc) usage (); 82fdb3d228Smrg if (!doit) displayname = argv[i]; 83fdb3d228Smrg continue; 84fdb3d228Smrg case 'f': /* -format string */ 85fdb3d228Smrg if (++i >= argc) usage (); 86fdb3d228Smrg if (doit) format = argv[i]; 87fdb3d228Smrg continue; 88fdb3d228Smrg case 'r': /* -range num-[num] */ 89fdb3d228Smrg if (++i >= argc) usage (); 90fdb3d228Smrg if (doit) { 91fdb3d228Smrg do_range (dpy, format, argv[i]); 92fdb3d228Smrg didit = 1; 93fdb3d228Smrg } 94fdb3d228Smrg continue; 95fdb3d228Smrg case 'n': /* -name string */ 96fdb3d228Smrg if (++i >= argc) usage (); 97fdb3d228Smrg if (doit) { 98fdb3d228Smrg do_name (dpy, format, argv[i]); 99fdb3d228Smrg didit = 1; 100fdb3d228Smrg } 101fdb3d228Smrg continue; 102fdb3d228Smrg } 103fdb3d228Smrg } 104fdb3d228Smrg usage (); 105fdb3d228Smrg } 106fdb3d228Smrg if (!doit) { 107fdb3d228Smrg dpy = XOpenDisplay (displayname); 108fdb3d228Smrg if (!dpy) { 109fdb3d228Smrg fprintf (stderr, "%s: unable to open display \"%s\"\n", 110fdb3d228Smrg ProgramName, XDisplayName (displayname)); 111fdb3d228Smrg exit (1); 112fdb3d228Smrg } 113fdb3d228Smrg } else 114fdb3d228Smrg if (!didit) /* no options, default is list all */ 115fdb3d228Smrg list_atoms(dpy, format, 0, 0, 0); 116fdb3d228Smrg } 117fdb3d228Smrg 118fdb3d228Smrg XCloseDisplay (dpy); 119fdb3d228Smrg exit (0); 120fdb3d228Smrg} 121fdb3d228Smrg 122fdb3d228Smrgstatic void 123fdb3d228Smrgdo_name(Display *dpy, char *format, char *name) 124fdb3d228Smrg{ 125fdb3d228Smrg Atom a = XInternAtom (dpy, name, True); 126fdb3d228Smrg 127fdb3d228Smrg if (a != None) { 128fdb3d228Smrg printf (format, (unsigned long) a, name); 129fdb3d228Smrg putchar ('\n'); 130fdb3d228Smrg } else { 131fdb3d228Smrg fprintf (stderr, "%s: no atom named \"%s\" on server \"%s\"\n", 132fdb3d228Smrg ProgramName, name, DisplayString(dpy)); 133fdb3d228Smrg } 134fdb3d228Smrg} 135fdb3d228Smrg 136fdb3d228Smrg 137fdb3d228Smrg#define RangeLow (1 << 0) 138fdb3d228Smrg#define RangeHigh (1 << 1) 139fdb3d228Smrg 140fdb3d228Smrgstatic int 141fdb3d228Smrgparse_range(char *range, long *lowp, long *highp) 142fdb3d228Smrg{ 143fdb3d228Smrg char *dash; 144fdb3d228Smrg int mask = 0; 145fdb3d228Smrg 146fdb3d228Smrg if (!range) { /* NULL means default */ 147fdb3d228Smrg *lowp = 1; 148fdb3d228Smrg return RangeLow; 149fdb3d228Smrg } 150fdb3d228Smrg 151fdb3d228Smrg dash = strchr(range, '-'); 152fdb3d228Smrg if (!dash) dash = strchr(range, ':'); 153fdb3d228Smrg if (dash) { 154fdb3d228Smrg if (dash == range) { /* -high */ 155fdb3d228Smrg *lowp = 1; 156fdb3d228Smrg } else { /* low-[high] */ 157fdb3d228Smrg *dash = '\0'; 158fdb3d228Smrg *lowp = atoi (range); 159fdb3d228Smrg *dash = '-'; 160fdb3d228Smrg } 161fdb3d228Smrg mask |= RangeLow; 162fdb3d228Smrg dash++; 163fdb3d228Smrg if (*dash) { /* [low]-high */ 164fdb3d228Smrg *highp = atoi (dash); 165fdb3d228Smrg mask |= RangeHigh; 166fdb3d228Smrg } 167fdb3d228Smrg } else { /* number (low == high) */ 168fdb3d228Smrg *lowp = *highp = atoi (range); 169fdb3d228Smrg mask |= (RangeLow | RangeHigh); 170fdb3d228Smrg } 171fdb3d228Smrg 172fdb3d228Smrg return mask; 173fdb3d228Smrg} 174fdb3d228Smrg 175fdb3d228Smrgstatic void 176fdb3d228Smrgdo_range(Display *dpy, char *format, char *range) 177fdb3d228Smrg{ 178fdb3d228Smrg int mask; 179fdb3d228Smrg long low, high; 180fdb3d228Smrg 181fdb3d228Smrg mask = parse_range (range, &low, &high); 182fdb3d228Smrg list_atoms (dpy, format, mask, low, high); 183fdb3d228Smrg} 184fdb3d228Smrg 185fdb3d228Smrg 186fdb3d228Smrgstatic int 187fdb3d228Smrgcatcher(Display *dpy, XErrorEvent *err) 188fdb3d228Smrg{ 189fdb3d228Smrg if (err->request_code != X_GetAtomName) { 190fdb3d228Smrg XmuPrintDefaultErrorMessage (dpy, err, stderr); 191fdb3d228Smrg } 192fdb3d228Smrg return 0; 193fdb3d228Smrg} 194fdb3d228Smrg 195fdb3d228Smrgstatic void 196fdb3d228Smrglist_atoms(Display *dpy, char *format, int mask, long low, long high) 197fdb3d228Smrg{ 198fdb3d228Smrg XErrorHandler oldhandler = XSetErrorHandler (catcher); 199fdb3d228Smrg 200fdb3d228Smrg switch (mask) { 201fdb3d228Smrg case RangeHigh: 202fdb3d228Smrg low = 1; 203fdb3d228Smrg /* fall through */ 204fdb3d228Smrg case (RangeLow | RangeHigh): 205fdb3d228Smrg for (; low <= high; low++) { 206fdb3d228Smrg char *s = XGetAtomName (dpy, (Atom)low); 207fdb3d228Smrg if (s) { 208fdb3d228Smrg printf (format, low, s); 209fdb3d228Smrg putchar ('\n'); 210fdb3d228Smrg XFree (s); 211fdb3d228Smrg } 212fdb3d228Smrg } 213fdb3d228Smrg break; 214fdb3d228Smrg 215fdb3d228Smrg default: 216fdb3d228Smrg low = 1; 217fdb3d228Smrg /* fall through */ 218fdb3d228Smrg case RangeLow: 219fdb3d228Smrg for (; ; low++) { 220fdb3d228Smrg char *s = XGetAtomName (dpy, (Atom)low); 221fdb3d228Smrg if (s) { 222fdb3d228Smrg printf (format, low, s); 223fdb3d228Smrg putchar ('\n'); 224fdb3d228Smrg XFree (s); 225fdb3d228Smrg } else { 226fdb3d228Smrg break; 227fdb3d228Smrg } 228fdb3d228Smrg } 229fdb3d228Smrg break; 230fdb3d228Smrg } 231fdb3d228Smrg 232fdb3d228Smrg XSetErrorHandler (oldhandler); 233fdb3d228Smrg return; 234fdb3d228Smrg} 235