plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

printevent.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 }