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