URI: 
       tpart01 - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tpart01 (26666B)
       ---
            1 Path: uunet!wyse!mikew
            2 From: mikew@wyse.wyse.com (Mike Wexler)
            3 Newsgroups: comp.sources.x
            4 Subject: v02i056:  subroutine to print events in human readable form, Part01/01
            5 Message-ID: <1935@wyse.wyse.com>
            6 Date: 22 Dec 88 19:28:25 GMT
            7 Organization: Wyse Technology, San Jose
            8 Lines: 1093
            9 Approved: mikew@wyse.com
           10 
           11 Submitted-by: richsun!darkstar!ken
           12 Posting-number: Volume 2, Issue 56
           13 Archive-name: showevent/part01
           14 
           15 
           16 
           17 Following is a shar file of a debugging aid along with a sample program to
           18 show how it is used.  The README contains more details.
           19 
           20                                 Ken
           21 
           22 #! /bin/sh
           23 # This is a shell archive, meaning:
           24 # 1. Remove everything above the #! /bin/sh line.
           25 # 2. Save the resulting text in a file.
           26 # 3. Execute the file with /bin/sh (not csh) to create the files:
           27 #        Makefile
           28 #        README
           29 #        ShowEvent.c
           30 #        ShowEvent.man
           31 #        patchlevel.h
           32 #        sample.c
           33 # This archive created: Thu Dec 22 12:13:46 1988
           34 export PATH; PATH=/bin:$PATH
           35 if test -f 'Makefile'
           36 then
           37         echo shar: will not over-write existing file "'Makefile'"
           38 else
           39 cat << \SHAR_EOF > 'Makefile'
           40 CFLAGS = -g 
           41 INCLUDE = -I/global/include
           42 LFLAGS = -L/global/lib
           43 OBJS =        ShowEvent.o sample.o
           44 LIBS = -lX11
           45 
           46 all: sample
           47 
           48 .c.o:
           49         $(CC) $(INCLUDE) $(CFLAGS) -c $<
           50 
           51 sample: $(OBJS)
           52         $(CC) $(LFLAGS) $(OBJS) $(LIBS) -o sample
           53 SHAR_EOF
           54 fi # end of overwriting check
           55 if test -f 'README'
           56 then
           57         echo shar: will not over-write existing file "'README'"
           58 else
           59 cat << \SHAR_EOF > 'README'
           60 There are times during debugging when it would be real useful to be able to
           61 print the fields of an event in a human readable form.  Too many times I found 
           62 myself scrounging around in section 8 of the Xlib manual looking for the valid 
           63 fields for the events I wanted to see, then adding printf's to display the 
           64 numeric values of the fields, and then scanning through X.h trying to decode
           65 the cryptic detail and state fields.  After playing with xev, I decided to
           66 write a couple of standard functions that I could keep in a library and call
           67 on whenever I needed a little debugging verbosity.  The first function,
           68 GetType(), is useful for returning the string representation of the type of
           69 an event.  The second function, ShowEvent(), is used to display all the fields
           70 of an event in a readable format.  The functions are not complicated, in fact,
           71 they are mind-numbingly boring - but that's just the point nobody wants to
           72 spend the time writing functions like this, they just want to have them when
           73 they need them.
           74 
           75 A simple, sample program is included which does little else but to demonstrate
           76 the use of these two functions.  These functions have saved me many an hour 
           77 during debugging and I hope you find some benefit to these.  If you have any
           78 comments, suggestions, improvements, or if you find any blithering errors you 
           79 can get it touch with me at the following location:
           80 
           81                         ken@richsun.UUCP
           82 SHAR_EOF
           83 fi # end of overwriting check
           84 if test -f 'ShowEvent.c'
           85 then
           86         echo shar: will not over-write existing file "'ShowEvent.c'"
           87 else
           88 cat << \SHAR_EOF > 'ShowEvent.c'
           89 #include <X11/Intrinsic.h>
           90 #include <X11/Xproto.h>
           91 
           92 Boolean use_separate_lines = True;
           93 static char *sep;
           94 
           95 /******************************************************************************/
           96 /**** Miscellaneous routines to convert values to their string equivalents ****/
           97 /******************************************************************************/
           98 
           99 /* Returns the string equivalent of a boolean parameter */
          100 static char *TorF(bool)
          101 int bool;
          102 {
          103     switch (bool) {
          104     case True:
          105         return ("True");
          106 
          107     case False:
          108         return ("False");
          109 
          110     default:
          111         return ("?");
          112     }
          113 }
          114 
          115 /* Returns the string equivalent of a property notify state */
          116 static char *PropertyState(state)
          117 int state;
          118 {
          119     switch (state) {
          120     case PropertyNewValue:
          121         return ("PropertyNewValue");
          122 
          123     case PropertyDelete:
          124         return ("PropertyDelete");
          125 
          126     default:
          127         return ("?");
          128     }
          129 }
          130 
          131 /* Returns the string equivalent of a visibility notify state */
          132 static char *VisibilityState(state)
          133 int state;
          134 {
          135     switch (state) {
          136     case VisibilityUnobscured:
          137         return ("VisibilityUnobscured");
          138 
          139     case VisibilityPartiallyObscured:
          140         return ("VisibilityPartiallyObscured");
          141 
          142     case VisibilityFullyObscured:
          143         return ("VisibilityFullyObscured");
          144 
          145     default:
          146         return ("?");
          147     }
          148 }
          149 
          150 /* Returns the string equivalent of a timestamp */
          151 static char *ServerTime(time)
          152 Time time;
          153 {
          154     unsigned long msec;
          155     unsigned long sec;
          156     unsigned long min;
          157     unsigned long hr;
          158     unsigned long day;
          159     char buffer[32];
          160 
          161     msec = time % 1000;
          162     time /= 1000;
          163     sec = time % 60;
          164     time /= 60;
          165     min = time % 60;
          166     time /= 60;
          167     hr = time % 24;
          168     time /= 24;
          169     day = time;
          170 
          171     sprintf(buffer, "%d day%s %02d:%02d:%02d.%03d",
          172       day, day == 1 ? "" : "(s)", hr, min, sec, msec);
          173     return (buffer);
          174 }
          175 
          176 /* Simple structure to ease the interpretation of masks */
          177 typedef struct _MaskType {
          178     unsigned int value;
          179     char *string;
          180 } MaskType;
          181 
          182 /* Returns the string equivalent of a mask of buttons and/or modifier keys */
          183 static char *ButtonAndOrModifierState(state)
          184 unsigned int state;
          185 {
          186     char buffer[256];
          187     static MaskType masks[] = {
          188         {Button1Mask, "Button1Mask"},
          189         {Button2Mask, "Button2Mask"},
          190         {Button3Mask, "Button3Mask"},
          191         {Button4Mask, "Button4Mask"},
          192         {Button5Mask, "Button5Mask"},
          193         {ShiftMask, "ShiftMask"},
          194         {LockMask, "LockMask"},
          195         {ControlMask, "ControlMask"},
          196         {Mod1Mask, "Mod1Mask"},
          197         {Mod2Mask, "Mod2Mask"},
          198         {Mod3Mask, "Mod3Mask"},
          199         {Mod4Mask, "Mod4Mask"},
          200         {Mod5Mask, "Mod5Mask"},
          201     };
          202     int num_masks = sizeof(masks) / sizeof(MaskType);
          203     int i;
          204     Boolean first = True;
          205 
          206     buffer[0] = NULL;
          207 
          208     for (i = 0; i < num_masks; i++)
          209         if (state & masks[i].value)
          210             if (first) {
          211                 first = False;
          212                 strcpy(buffer, masks[i].string);
          213             } else {
          214                 strcat(buffer, " | ");
          215                 strcat(buffer, masks[i].string);
          216             }
          217     return (buffer);
          218 }
          219 
          220 /* Returns the string equivalent of a mask of configure window values */
          221 static char *ConfigureValueMask(valuemask)
          222 unsigned int valuemask;
          223 {
          224     char buffer[256];
          225     static MaskType masks[] = {
          226         {CWX, "CWX"},
          227         {CWY, "CWY"},
          228         {CWWidth, "CWWidth"},
          229         {CWHeight, "CWHeight"},
          230         {CWBorderWidth, "CWBorderWidth"},
          231         {CWSibling, "CWSibling"},
          232         {CWStackMode, "CWStackMode"},
          233     };
          234     int num_masks = sizeof(masks) / sizeof(MaskType);
          235     int i;
          236     Boolean first = True;
          237 
          238     buffer[0] = NULL;
          239 
          240     for (i = 0; i < num_masks; i++)
          241         if (valuemask & masks[i].value)
          242             if (first) {
          243                 first = False;
          244                 strcpy(buffer, masks[i].string);
          245             } else {
          246                 strcat(buffer, " | ");
          247                 strcat(buffer, masks[i].string);
          248             }
          249 
          250     return (buffer);
          251 }
          252 
          253 /* Returns the string equivalent of a motion hint */
          254 static char *IsHint(is_hint)
          255 char is_hint;
          256 {
          257     switch (is_hint) {
          258     case NotifyNormal:
          259         return ("NotifyNormal");
          260 
          261     case NotifyHint:
          262         return ("NotifyHint");
          263 
          264     default:
          265         return ("?");
          266     }
          267 }
          268 
          269 /* Returns the string equivalent of an id or the value "None" */
          270 static char *MaybeNone(value)
          271 int value;
          272 {
          273     char buffer[16];
          274 
          275     if (value == None)
          276         return ("None");
          277     else {
          278         sprintf(buffer, "0x%x", value);
          279         return (buffer);
          280     }
          281 }
          282 
          283 /* Returns the string equivalent of a colormap state */
          284 static char *ColormapState(state)
          285 int state;
          286 {
          287     switch (state) {
          288     case ColormapInstalled:
          289         return ("ColormapInstalled");
          290 
          291     case ColormapUninstalled:
          292         return ("ColormapUninstalled");
          293 
          294     default:
          295         return ("?");
          296     }
          297 }
          298 
          299 /* Returns the string equivalent of a crossing detail */
          300 static char *CrossingDetail(detail)
          301 int detail;
          302 {
          303     switch (detail) {
          304     case NotifyAncestor:
          305         return ("NotifyAncestor");
          306 
          307     case NotifyInferior:
          308         return ("NotifyInferior");
          309 
          310     case NotifyVirtual:
          311         return ("NotifyVirtual");
          312 
          313     case NotifyNonlinear:
          314         return ("NotifyNonlinear");
          315 
          316     case NotifyNonlinearVirtual:
          317         return ("NotifyNonlinearVirtual");
          318 
          319     default:
          320         return ("?");
          321     }
          322 }
          323 
          324 /* Returns the string equivalent of a focus change detail */
          325 static char *FocusChangeDetail(detail)
          326 int detail;
          327 {
          328     switch (detail) {
          329     case NotifyAncestor:
          330         return ("NotifyAncestor");
          331 
          332     case NotifyInferior:
          333         return ("NotifyInferior");
          334 
          335     case NotifyVirtual:
          336         return ("NotifyVirtual");
          337 
          338     case NotifyNonlinear:
          339         return ("NotifyNonlinear");
          340 
          341     case NotifyNonlinearVirtual:
          342         return ("NotifyNonlinearVirtual");
          343 
          344     case NotifyPointer:
          345         return ("NotifyPointer");
          346 
          347     case NotifyPointerRoot:
          348         return ("NotifyPointerRoot");
          349 
          350     case NotifyDetailNone:
          351         return ("NotifyDetailNone");
          352 
          353     default:
          354         return ("?");
          355     }
          356 }
          357 
          358 /* Returns the string equivalent of a configure detail */
          359 static char *ConfigureDetail(detail)
          360 int detail;
          361 {
          362     switch (detail) {
          363     case Above:
          364         return ("Above");
          365 
          366     case Below:
          367         return ("Below");
          368 
          369     case TopIf:
          370         return ("TopIf");
          371 
          372     case BottomIf:
          373         return ("BottomIf");
          374 
          375     case Opposite:
          376         return ("Opposite");
          377 
          378     default:
          379         return ("?");
          380     }
          381 }
          382 
          383 /* Returns the string equivalent of a grab mode */
          384 static char *GrabMode(mode)
          385 int mode;
          386 {
          387     switch (mode) {
          388     case NotifyNormal:
          389         return ("NotifyNormal");
          390 
          391     case NotifyGrab:
          392         return ("NotifyGrab");
          393 
          394     case NotifyUngrab:
          395         return ("NotifyUngrab");
          396 
          397     case NotifyWhileGrabbed:
          398         return ("NotifyWhileGrabbed");
          399 
          400     default:
          401         return ("?");
          402     }
          403 }
          404 
          405 /* Returns the string equivalent of a mapping request */
          406 static char *MappingRequest(request)
          407 int request;
          408 {
          409     switch (request) {
          410     case MappingModifier:
          411         return ("MappingModifier");
          412 
          413     case MappingKeyboard:
          414         return ("MappingKeyboard");
          415 
          416     case MappingPointer:
          417         return ("MappingPointer");
          418 
          419     default:
          420         return ("?");
          421     }
          422 }
          423 
          424 /* Returns the string equivalent of a stacking order place */
          425 static char *Place(place)
          426 int place;
          427 {
          428     switch (place) {
          429     case PlaceOnTop:
          430         return ("PlaceOnTop");
          431 
          432     case PlaceOnBottom:
          433         return ("PlaceOnBottom");
          434 
          435     default:
          436         return ("?");
          437     }
          438 }
          439 
          440 /* Returns the string equivalent of a major code */
          441 static char *MajorCode(code)
          442 int code;
          443 {
          444     char buffer[32];
          445 
          446     switch (code) {
          447     case X_CopyArea:
          448         return ("X_CopyArea");
          449 
          450     case X_CopyPlane:
          451         return ("X_CopyPlane");
          452 
          453     default:
          454         sprintf(buffer, "0x%x", code);
          455         return (buffer);
          456     }
          457 }
          458 
          459 /* Returns the string equivalent the keycode contained in the key event */
          460 static char *Keycode(ev)
          461 XKeyEvent *ev;
          462 {
          463     char buffer[256];
          464     KeySym keysym_str;
          465     char *keysym_name;
          466     char string[256];
          467 
          468     XLookupString(ev, string, 64, &keysym_str, NULL);
          469 
          470     if (keysym_str == NoSymbol)
          471         keysym_name = "NoSymbol";
          472     else if (!(keysym_name = XKeysymToString(keysym_str)))
          473         keysym_name = "(no name)";
          474     sprintf(buffer, "%u (keysym 0x%x \"%s\")",
          475       ev->keycode, keysym_str, keysym_name);
          476     return (buffer);
          477 }
          478 
          479 /* Returns the string equivalent of an atom or "None"*/
          480 static char *AtomName(dpy, atom)
          481 Display *dpy;
          482 Atom atom;
          483 {
          484     char buffer[256];
          485     char *atom_name;
          486 
          487     if (atom == None)
          488         return ("None");
          489 
          490     atom_name = XGetAtomName(dpy, atom);
          491     strncpy(buffer, atom_name, 256);
          492     XFree(atom_name);
          493     return (buffer);
          494 }
          495 
          496 /******************************************************************************/
          497 /**** Routines to print out readable values for the field of various events ***/
          498 /******************************************************************************/
          499 
          500 static void VerbMotion(ev)
          501 XMotionEvent *ev;
          502 {
          503     printf("window=0x%x%s", ev->window, sep);
          504     printf("root=0x%x%s", ev->root, sep);
          505     printf("subwindow=0x%x%s", ev->subwindow, sep);
          506     printf("time=%s%s", ServerTime(ev->time), sep);
          507     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          508     printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
          509     printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
          510     printf("is_hint=%s%s", IsHint(ev->is_hint), sep);
          511     printf("same_screen=%s\n", TorF(ev->same_screen));
          512 }
          513 
          514 static void VerbButton(ev)
          515 XButtonEvent *ev;
          516 {
          517     printf("window=0x%x%s", ev->window, sep);
          518     printf("root=0x%x%s", ev->root, sep);
          519     printf("subwindow=0x%x%s", ev->subwindow, sep);
          520     printf("time=%s%s", ServerTime(ev->time), sep);
          521     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          522     printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
          523     printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
          524     printf("button=%s%s", ButtonAndOrModifierState(ev->button), sep);
          525     printf("same_screen=%s\n", TorF(ev->same_screen));
          526 }
          527 
          528 static void VerbColormap(ev)
          529 XColormapEvent *ev;
          530 {
          531     printf("window=0x%x%s", ev->window, sep);
          532     printf("colormap=%s%s", MaybeNone(ev->colormap), sep);
          533     printf("new=%s%s", TorF(ev->new), sep);
          534     printf("state=%s\n", ColormapState(ev->state));
          535 }
          536 
          537 static void VerbCrossing(ev)
          538 XCrossingEvent *ev;
          539 {
          540     printf("window=0x%x%s", ev->window, sep);
          541     printf("root=0x%x%s", ev->root, sep);
          542     printf("subwindow=0x%x%s", ev->subwindow, sep);
          543     printf("time=%s%s", ServerTime(ev->time), sep);
          544     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          545     printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
          546     printf("mode=%s%s", GrabMode(ev->mode), sep);
          547     printf("detail=%s%s", CrossingDetail(ev->detail), sep);
          548     printf("same_screen=%s%s", TorF(ev->same_screen), sep);
          549     printf("focus=%s%s", TorF(ev->focus), sep);
          550     printf("state=%s\n", ButtonAndOrModifierState(ev->state));
          551 }
          552 
          553 static void VerbExpose(ev)
          554 XExposeEvent *ev;
          555 {
          556     printf("window=0x%x%s", ev->window, sep);
          557     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          558     printf("width=%d height=%d%s", ev->width, ev->height, sep);
          559     printf("count=%d\n", ev->count);
          560 }
          561 
          562 static void VerbGraphicsExpose(ev)
          563 XGraphicsExposeEvent *ev;
          564 {
          565     printf("drawable=0x%x%s", ev->drawable, sep);
          566     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          567     printf("width=%d height=%d%s", ev->width, ev->height, sep);
          568     printf("major_code=%s%s", MajorCode(ev->major_code), sep);
          569     printf("minor_code=%d\n", ev->minor_code);
          570 }
          571 
          572 static void VerbNoExpose(ev)
          573 XNoExposeEvent *ev;
          574 {
          575     printf("drawable=0x%x%s", ev->drawable, sep);
          576     printf("major_code=%s%s", MajorCode(ev->major_code), sep);
          577     printf("minor_code=%d\n", ev->minor_code);
          578 }
          579 
          580 static void VerbFocus(ev)
          581 XFocusChangeEvent *ev;
          582 {
          583     printf("window=0x%x%s", ev->window, sep);
          584     printf("mode=%s%s", GrabMode(ev->mode), sep);
          585     printf("detail=%s\n", FocusChangeDetail(ev->detail));
          586 }
          587 
          588 static void VerbKeymap(ev)
          589 XKeymapEvent *ev;
          590 {
          591     int i;
          592 
          593     printf("window=0x%x%s", ev->window, sep);
          594     printf("key_vector=");
          595     for (i = 0; i < 32; i++)
          596         printf("%02x", ev->key_vector[i]);
          597     printf("\n");
          598 }
          599 
          600 static void VerbKey(ev)
          601 XKeyEvent *ev;
          602 {
          603     printf("window=0x%x%s", ev->window, sep);
          604     printf("root=0x%x%s", ev->root, sep);
          605     printf("subwindow=0x%x%s", ev->subwindow, sep);
          606     printf("time=%s%s", ServerTime(ev->time), sep);
          607     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          608     printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep);
          609     printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep);
          610     printf("keycode=%s%s", Keycode(ev), sep);
          611     printf("same_screen=%s\n", TorF(ev->same_screen));
          612 }
          613 
          614 static void VerbProperty(ev)
          615 XPropertyEvent *ev;
          616 {
          617     printf("window=0x%x%s", ev->window, sep);
          618     printf("atom=%s%s", AtomName(ev->display, ev->atom), sep);
          619     printf("time=%s%s", ServerTime(ev->time), sep);
          620     printf("state=%s\n", PropertyState(ev->state));
          621 }
          622 
          623 static void VerbResizeRequest(ev)
          624 XResizeRequestEvent *ev;
          625 {
          626     printf("window=0x%x%s", ev->window, sep);
          627     printf("width=%d height=%d\n", ev->width, ev->height);
          628 }
          629 
          630 static void VerbCirculate(ev)
          631 XCirculateEvent *ev;
          632 {
          633     printf("event=0x%x%s", ev->event, sep);
          634     printf("window=0x%x%s", ev->window, sep);
          635     printf("place=%s\n", Place(ev->place));
          636 }
          637 
          638 static void VerbConfigure(ev)
          639 XConfigureEvent *ev;
          640 {
          641     printf("event=0x%x%s", ev->event, sep);
          642     printf("window=0x%x%s", ev->window, sep);
          643     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          644     printf("width=%d height=%d%s", ev->width, ev->height, sep);
          645     printf("border_width=%d%s", ev->border_width, sep);
          646     printf("above=%s%s", MaybeNone(ev->above), sep);
          647     printf("override_redirect=%s\n", TorF(ev->override_redirect));
          648 }
          649 
          650 static void VerbCreateWindow(ev)
          651 XCreateWindowEvent *ev;
          652 {
          653     printf("parent=0x%x%s", ev->parent, sep);
          654     printf("window=0x%x%s", ev->window, sep);
          655     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          656     printf("width=%d height=%d%s", ev->width, ev->height, sep);
          657     printf("border_width=%d%s", ev->border_width, sep);
          658     printf("override_redirect=%s\n", TorF(ev->override_redirect));
          659 }
          660 
          661 static void VerbDestroyWindow(ev)
          662 XDestroyWindowEvent *ev;
          663 {
          664     printf("event=0x%x%s", ev->event, sep);
          665     printf("window=0x%x\n", ev->window);
          666 }
          667 
          668 static void VerbGravity(ev)
          669 XGravityEvent *ev;
          670 {
          671     printf("event=0x%x%s", ev->event, sep);
          672     printf("window=0x%x%s", ev->window, sep);
          673     printf("x=%d y=%d\n", ev->x, ev->y);
          674 }
          675 
          676 static void VerbMap(ev)
          677 XMapEvent *ev;
          678 {
          679     printf("event=0x%x%s", ev->event, sep);
          680     printf("window=0x%x%s", ev->window, sep);
          681     printf("override_redirect=%s\n", TorF(ev->override_redirect));
          682 }
          683 
          684 static void VerbReparent(ev)
          685 XReparentEvent *ev;
          686 {
          687     printf("event=0x%x%s", ev->event, sep);
          688     printf("window=0x%x%s", ev->window, sep);
          689     printf("parent=0x%x%s", ev->parent, sep);
          690     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          691     printf("override_redirect=%s\n", TorF(ev->override_redirect));
          692 }
          693 
          694 static void VerbUnmap(ev)
          695 XUnmapEvent *ev;
          696 {
          697     printf("event=0x%x%s", ev->event, sep);
          698     printf("window=0x%x%s", ev->window, sep);
          699     printf("from_configure=%s\n", TorF(ev->from_configure));
          700 }
          701 
          702 static void VerbCirculateRequest(ev)
          703 XCirculateRequestEvent *ev;
          704 {
          705     printf("parent=0x%x%s", ev->parent, sep);
          706     printf("window=0x%x%s", ev->window, sep);
          707     printf("place=%s\n", Place(ev->place));
          708 }
          709 
          710 static void VerbConfigureRequest(ev)
          711 XConfigureRequestEvent *ev;
          712 {
          713     printf("parent=0x%x%s", ev->parent, sep);
          714     printf("window=0x%x%s", ev->window, sep);
          715     printf("x=%d y=%d%s", ev->x, ev->y, sep);
          716     printf("width=%d height=%d%s", ev->width, ev->height, sep);
          717     printf("border_width=%d%s", ev->border_width, sep);
          718     printf("above=%s%s", MaybeNone(ev->above), sep);
          719     printf("detail=0x%x%s", ConfigureDetail(ev->detail), sep);
          720     printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask));
          721 }
          722 
          723 static void VerbMapRequest(ev)
          724 XMapRequestEvent *ev;
          725 {
          726     printf("parent=0x%x%s", ev->parent, sep);
          727     printf("window=0x%x\n", ev->window);
          728 }
          729 
          730 static void VerbClient(ev)
          731 XClientMessageEvent *ev;
          732 {
          733     int i;
          734 
          735     printf("window=0x%x%s", ev->window, sep);
          736     printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep);
          737     printf("format=%d\n", ev->format);
          738     printf("data (shown as longs)=");
          739     for (i = 0; i < 5; i++)
          740         printf(" 0x%08x", ev->data.l[i]);
          741     printf("\n");
          742 }
          743 
          744 static void VerbMapping(ev)
          745 XMappingEvent *ev;
          746 {
          747     printf("window=0x%x%s", ev->window, sep);
          748     printf("request=0x%x%s", MappingRequest(ev->request), sep);
          749     printf("first_keycode=0x%x%s", ev->first_keycode, sep);
          750     printf("count=0x%x\n", ev->count);
          751 }
          752 
          753 static void VerbSelectionClear(ev)
          754 XSelectionClearEvent *ev;
          755 {
          756     printf("window=0x%x%s", ev->window, sep);
          757     printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
          758     printf("time=%s\n", ServerTime(ev->time));
          759 }
          760 
          761 static void VerbSelection(ev)
          762 XSelectionEvent *ev;
          763 {
          764     printf("requestor=0x%x%s", ev->requestor, sep);
          765     printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
          766     printf("target=%s%s", AtomName(ev->display, ev->target), sep);
          767     printf("property=%s%s", AtomName(ev->display, ev->property), sep);
          768     printf("time=%s\n", ServerTime(ev->time));
          769 }
          770 
          771 static void VerbSelectionRequest(ev)
          772 XSelectionRequestEvent *ev;
          773 {
          774     printf("owner=0x%x%s", ev->owner, sep);
          775     printf("requestor=0x%x%s", ev->requestor, sep);
          776     printf("selection=%s%s", AtomName(ev->display, ev->selection), sep);
          777     printf("target=%s%s", AtomName(ev->display, ev->target), sep);
          778     printf("property=%s%s", AtomName(ev->display, ev->property), sep);
          779     printf("time=%s\n", ServerTime(ev->time));
          780 }
          781 
          782 static void VerbVisibility(ev)
          783 XVisibilityEvent *ev;
          784 {
          785     printf("window=0x%x%s", ev->window, sep);
          786     printf("state=%s\n", VisibilityState(ev->state));
          787 }
          788 
          789 /******************************************************************************/
          790 /************ Return the string representation for type of an event ***********/
          791 /******************************************************************************/
          792 
          793 char *GetType(ev)
          794 XEvent *ev;
          795 {
          796     switch (ev->type) {
          797     case KeyPress:
          798         return ("KeyPress");
          799     case KeyRelease:
          800         return ("KeyRelease");
          801     case ButtonPress:
          802         return ("ButtonPress");
          803     case ButtonRelease:
          804         return ("ButtonRelease");
          805     case MotionNotify:
          806         return ("MotionNotify");
          807     case EnterNotify:
          808         return ("EnterNotify");
          809     case LeaveNotify:
          810         return ("LeaveNotify");
          811     case FocusIn:
          812         return ("FocusIn");
          813     case FocusOut:
          814         return ("FocusOut");
          815     case KeymapNotify:
          816         return ("KeymapNotify");
          817     case Expose:
          818         return ("Expose");
          819     case GraphicsExpose:
          820         return ("GraphicsExpose");
          821     case NoExpose:
          822         return ("NoExpose");
          823     case VisibilityNotify:
          824         return ("VisibilityNotify");
          825     case CreateNotify:
          826         return ("CreateNotify");
          827     case DestroyNotify:
          828         return ("DestroyNotify");
          829     case UnmapNotify:
          830         return ("UnmapNotify");
          831     case MapNotify:
          832         return ("MapNotify");
          833     case MapRequest:
          834         return ("MapRequest");
          835     case ReparentNotify:
          836         return ("ReparentNotify");
          837     case ConfigureNotify:
          838         return ("ConfigureNotify");
          839     case ConfigureRequest:
          840         return ("ConfigureRequest");
          841     case GravityNotify:
          842         return ("GravityNotify");
          843     case ResizeRequest:
          844         return ("ResizeRequest");
          845     case CirculateNotify:
          846         return ("CirculateNotify");
          847     case CirculateRequest:
          848         return ("CirculateRequest");
          849     case PropertyNotify:
          850         return ("PropertyNotify");
          851     case SelectionClear:
          852         return ("SelectionClear");
          853     case SelectionRequest:
          854         return ("SelectionRequest");
          855     case SelectionNotify:
          856         return ("SelectionNotify");
          857     case ColormapNotify:
          858         return ("ColormapNotify");
          859     case ClientMessage:
          860         return ("ClientMessage");
          861     case MappingNotify:
          862         return ("MappingNotify");
          863     }
          864 }
          865 
          866 /******************************************************************************/
          867 /**************** Print the values of all fields for any event ****************/
          868 /******************************************************************************/
          869 
          870 void ShowEvent(ev)
          871 XAnyEvent *ev;
          872 {
          873     /* determine which field separator to use */
          874     if (use_separate_lines)
          875         sep = "\n";
          876     else
          877         sep = " ";
          878 
          879     printf("type=%s%s", GetType(ev), sep);
          880     printf("serial=%d%s", ev->serial, sep);
          881     printf("send_event=%s%s", TorF(ev->send_event), sep);
          882     printf("display=0x%x%s", ev->display, sep);
          883 
          884     switch (ev->type) {
          885     case MotionNotify:
          886         VerbMotion(ev);
          887         break;
          888 
          889     case ButtonPress:
          890     case ButtonRelease:
          891         VerbButton(ev);
          892         break;
          893 
          894     case ColormapNotify:
          895         VerbColormap(ev);
          896         break;
          897 
          898     case EnterNotify:
          899     case LeaveNotify:
          900         VerbCrossing(ev);
          901         break;
          902 
          903     case Expose:
          904         VerbExpose(ev);
          905         break;
          906 
          907     case GraphicsExpose:
          908         VerbGraphicsExpose(ev);
          909         break;
          910 
          911     case NoExpose:
          912         VerbNoExpose(ev);
          913         break;
          914 
          915     case FocusIn:
          916     case FocusOut:
          917         VerbFocus(ev);
          918         break;
          919 
          920     case KeymapNotify:
          921         VerbKeymap(ev);
          922         break;
          923 
          924     case KeyPress:
          925     case KeyRelease:
          926         VerbKey(ev);
          927         break;
          928 
          929     case PropertyNotify:
          930         VerbProperty(ev);
          931         break;
          932 
          933     case ResizeRequest:
          934         VerbResizeRequest(ev);
          935         break;
          936 
          937     case CirculateNotify:
          938         VerbCirculate(ev);
          939         break;
          940 
          941     case ConfigureNotify:
          942         VerbConfigure(ev);
          943         break;
          944 
          945     case CreateNotify:
          946         VerbCreateWindow(ev);
          947         break;
          948 
          949     case DestroyNotify:
          950         VerbDestroyWindow(ev);
          951         break;
          952 
          953     case GravityNotify:
          954         VerbGravity(ev);
          955         break;
          956 
          957     case MapNotify:
          958         VerbMap(ev);
          959         break;
          960 
          961     case ReparentNotify:
          962         VerbReparent(ev);
          963         break;
          964 
          965     case UnmapNotify:
          966         VerbUnmap(ev);
          967         break;
          968 
          969     case CirculateRequest:
          970         VerbCirculateRequest(ev);
          971         break;
          972 
          973     case ConfigureRequest:
          974         VerbConfigureRequest(ev);
          975         break;
          976 
          977     case MapRequest:
          978         VerbMapRequest(ev);
          979         break;
          980 
          981     case ClientMessage:
          982         VerbClient(ev);
          983         break;
          984 
          985     case MappingNotify:
          986         VerbMapping(ev);
          987         break;
          988 
          989     case SelectionClear:
          990         VerbSelectionClear(ev);
          991         break;
          992 
          993     case SelectionNotify:
          994         VerbSelection(ev);
          995         break;
          996 
          997     case SelectionRequest:
          998         VerbSelectionRequest(ev);
          999         break;
         1000 
         1001     case VisibilityNotify:
         1002         VerbVisibility(ev);
         1003         break;
         1004 
         1005     }
         1006 }
         1007 SHAR_EOF
         1008 fi # end of overwriting check
         1009 if test -f 'ShowEvent.man'
         1010 then
         1011         echo shar: will not over-write existing file "'ShowEvent.man'"
         1012 else
         1013 cat << \SHAR_EOF > 'ShowEvent.man'
         1014 .TH ShowEvent 3X11 "December 1988"
         1015 .SH NAME
         1016 .B ShowEvent \- display the fields of an event
         1017 .br
         1018 .B GetType - get a string representation of an event type
         1019 
         1020 .SH SYNOPSIS
         1021 .B void ShowEvent(event)
         1022 .br
         1023 .B XEvent *event;
         1024 .PP
         1025 .B char *GetType(event)
         1026 .br
         1027 .B XEvent *event;
         1028 
         1029 .SH DESCRIPTION
         1030 ShowEvent displays the fields of the specified event in a readable form.
         1031 .PP
         1032 GetType returns the string representation of the specified event type.
         1033 
         1034 SHAR_EOF
         1035 fi # end of overwriting check
         1036 if test -f 'patchlevel.h'
         1037 then
         1038         echo shar: will not over-write existing file "'patchlevel.h'"
         1039 else
         1040 cat << \SHAR_EOF > 'patchlevel.h'
         1041 #define PATCHLEVEL 0
         1042 SHAR_EOF
         1043 fi # end of overwriting check
         1044 if test -f 'sample.c'
         1045 then
         1046         echo shar: will not over-write existing file "'sample.c'"
         1047 else
         1048 cat << \SHAR_EOF > 'sample.c'
         1049 #include <X11/Intrinsic.h>
         1050 
         1051 /*
         1052  * Disclaimer: No I don't actually code like this but this is a simple,
         1053  * "Quick-n-Dirty", plain, vanilla, "No ups, No extras" piece of code.
         1054  */
         1055 
         1056 main(argc, argv)
         1057 int argc;
         1058 char **argv;
         1059 {
         1060     Display *dpy;
         1061     int screen;
         1062     Window window;
         1063     XEvent event;
         1064     extern Boolean use_separate_lines;
         1065 
         1066     if (!(dpy = XOpenDisplay(""))) {
         1067         printf("Failed to open display...\n");
         1068         exit(1);
         1069     }
         1070     screen = DefaultScreen(dpy);
         1071 
         1072     window = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), 100, 100,
         1073       300, 200, 2, BlackPixel(dpy, screen), WhitePixel(dpy, screen));
         1074 
         1075     XSelectInput(dpy, window, KeyPressMask | KeyReleaseMask | ButtonPressMask |
         1076       ButtonReleaseMask | EnterWindowMask | LeaveWindowMask |
         1077       PointerMotionMask | PointerMotionHintMask | Button1MotionMask |
         1078       Button2MotionMask | Button3MotionMask | Button4MotionMask |
         1079       Button5MotionMask | ButtonMotionMask | KeymapStateMask |
         1080       ExposureMask | VisibilityChangeMask | StructureNotifyMask |
         1081       SubstructureNotifyMask | SubstructureRedirectMask | FocusChangeMask |
         1082       PropertyChangeMask | ColormapChangeMask | OwnerGrabButtonMask);
         1083 
         1084     XMapWindow(dpy, window);
         1085 
         1086     /* set this to false to make ShowEvent take up less vertival space */
         1087     use_separate_lines = True;
         1088 
         1089     while (1) {
         1090         XNextEvent(dpy, &event);
         1091         printf("Detail of %s event:\n", GetType(&event));
         1092         ShowEvent(&event);
         1093         printf("\n\n");
         1094     }
         1095 }
         1096 
         1097 SHAR_EOF
         1098 fi # end of overwriting check
         1099 #        End of shell archive
         1100 exit 0
         1101 -- 
         1102 Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
         1103 Moderator of comp.sources.x