|  | /* | 
|  | * Original code posted to comp.sources.x | 
|  | * Modifications by Russ Cox <rsc@swtch.com>. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | Path: uunet!wyse!mikew | 
|  | From: mikew@wyse.wyse.com (Mike Wexler) | 
|  | Newsgroups: comp.sources.x | 
|  | Subject: v02i056:  subroutine to print events in human readable form, Part01/01 | 
|  | Message-ID: <1935@wyse.wyse.com> | 
|  | Date: 22 Dec 88 19:28:25 GMT | 
|  | Organization: Wyse Technology, San Jose | 
|  | Lines: 1093 | 
|  | Approved: mikew@wyse.com | 
|  |  | 
|  | Submitted-by: richsun!darkstar!ken | 
|  | Posting-number: Volume 2, Issue 56 | 
|  | Archive-name: showevent/part01 | 
|  |  | 
|  |  | 
|  | There are times during debugging when it would be real useful to be able to | 
|  | print the fields of an event in a human readable form.  Too many times I found | 
|  | myself scrounging around in section 8 of the Xlib manual looking for the valid | 
|  | fields for the events I wanted to see, then adding printf's to display the | 
|  | numeric values of the fields, and then scanning through X.h trying to decode | 
|  | the cryptic detail and state fields.  After playing with xev, I decided to | 
|  | write a couple of standard functions that I could keep in a library and call | 
|  | on whenever I needed a little debugging verbosity.  The first function, | 
|  | GetType(), is useful for returning the string representation of the type of | 
|  | an event.  The second function, ShowEvent(), is used to display all the fields | 
|  | of an event in a readable format.  The functions are not complicated, in fact, | 
|  | they are mind-numbingly boring - but that's just the point nobody wants to | 
|  | spend the time writing functions like this, they just want to have them when | 
|  | they need them. | 
|  |  | 
|  | A simple, sample program is included which does little else but to demonstrate | 
|  | the use of these two functions.  These functions have saved me many an hour | 
|  | during debugging and I hope you find some benefit to these.  If you have any | 
|  | comments, suggestions, improvements, or if you find any blithering errors you | 
|  | can get it touch with me at the following location: | 
|  |  | 
|  | ken@richsun.UUCP | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <X11/Intrinsic.h> | 
|  | #include <X11/Xproto.h> | 
|  | #include "printevent.h" | 
|  |  | 
|  | static char* sep = " "; | 
|  |  | 
|  | /******************************************************************************/ | 
|  | /**** Miscellaneous routines to convert values to their string equivalents ****/ | 
|  | /******************************************************************************/ | 
|  |  | 
|  | /* Returns the string equivalent of a boolean parameter */ | 
|  | static char* | 
|  | TorF(int bool) | 
|  | { | 
|  | switch (bool) { | 
|  | case True: | 
|  | return ("True"); | 
|  |  | 
|  | case False: | 
|  | return ("False"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a property notify state */ | 
|  | static char* | 
|  | PropertyState(int state) | 
|  | { | 
|  | switch (state) { | 
|  | case PropertyNewValue: | 
|  | return ("PropertyNewValue"); | 
|  |  | 
|  | case PropertyDelete: | 
|  | return ("PropertyDelete"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a visibility notify state */ | 
|  | static char* | 
|  | VisibilityState(int state) | 
|  | { | 
|  | switch (state) { | 
|  | case VisibilityUnobscured: | 
|  | return ("VisibilityUnobscured"); | 
|  |  | 
|  | case VisibilityPartiallyObscured: | 
|  | return ("VisibilityPartiallyObscured"); | 
|  |  | 
|  | case VisibilityFullyObscured: | 
|  | return ("VisibilityFullyObscured"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a timestamp */ | 
|  | static char* | 
|  | ServerTime(Time time) | 
|  | { | 
|  | unsigned long msec; | 
|  | unsigned long sec; | 
|  | unsigned long min; | 
|  | unsigned long hr; | 
|  | unsigned long day; | 
|  | static char buffer[32]; | 
|  |  | 
|  | msec = time % 1000; | 
|  | time /= 1000; | 
|  | sec = time % 60; | 
|  | time /= 60; | 
|  | min = time % 60; | 
|  | time /= 60; | 
|  | hr = time % 24; | 
|  | time /= 24; | 
|  | day = time; | 
|  |  | 
|  | if(0) | 
|  | sprintf(buffer, "%lu day%s %02lu:%02lu:%02lu.%03lu", | 
|  | day, day == 1 ? "" : "(s)", hr, min, sec, msec); | 
|  |  | 
|  | sprintf(buffer, "%lud%luh%lum%lu.%03lds", day, hr, min, sec, msec); | 
|  | return (buffer); | 
|  | } | 
|  |  | 
|  | /* Simple structure to ease the interpretation of masks */ | 
|  | typedef struct MaskType MaskType; | 
|  | struct MaskType | 
|  | { | 
|  | unsigned int value; | 
|  | char *string; | 
|  | }; | 
|  |  | 
|  | /* Returns the string equivalent of a mask of buttons and/or modifier keys */ | 
|  | static char* | 
|  | ButtonAndOrModifierState(unsigned int state) | 
|  | { | 
|  | static char buffer[256]; | 
|  | static MaskType masks[] = { | 
|  | {Button1Mask, "Button1Mask"}, | 
|  | {Button2Mask, "Button2Mask"}, | 
|  | {Button3Mask, "Button3Mask"}, | 
|  | {Button4Mask, "Button4Mask"}, | 
|  | {Button5Mask, "Button5Mask"}, | 
|  | {ShiftMask, "ShiftMask"}, | 
|  | {LockMask, "LockMask"}, | 
|  | {ControlMask, "ControlMask"}, | 
|  | {Mod1Mask, "Mod1Mask"}, | 
|  | {Mod2Mask, "Mod2Mask"}, | 
|  | {Mod3Mask, "Mod3Mask"}, | 
|  | {Mod4Mask, "Mod4Mask"}, | 
|  | {Mod5Mask, "Mod5Mask"}, | 
|  | }; | 
|  | int num_masks = sizeof(masks) / sizeof(MaskType); | 
|  | int i; | 
|  | Boolean first = True; | 
|  |  | 
|  | buffer[0] = 0; | 
|  |  | 
|  | for (i = 0; i < num_masks; i++) | 
|  | if (state & masks[i].value) | 
|  | if (first) { | 
|  | first = False; | 
|  | strcpy(buffer, masks[i].string); | 
|  | } else { | 
|  | strcat(buffer, " | "); | 
|  | strcat(buffer, masks[i].string); | 
|  | } | 
|  | return (buffer); | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a mask of configure window values */ | 
|  | static char* | 
|  | ConfigureValueMask(unsigned int valuemask) | 
|  | { | 
|  | static char buffer[256]; | 
|  | static MaskType masks[] = { | 
|  | {CWX, "CWX"}, | 
|  | {CWY, "CWY"}, | 
|  | {CWWidth, "CWWidth"}, | 
|  | {CWHeight, "CWHeight"}, | 
|  | {CWBorderWidth, "CWBorderWidth"}, | 
|  | {CWSibling, "CWSibling"}, | 
|  | {CWStackMode, "CWStackMode"}, | 
|  | }; | 
|  | int num_masks = sizeof(masks) / sizeof(MaskType); | 
|  | int i; | 
|  | Boolean first = True; | 
|  |  | 
|  | buffer[0] = 0; | 
|  |  | 
|  | for (i = 0; i < num_masks; i++) | 
|  | if (valuemask & masks[i].value) | 
|  | if (first) { | 
|  | first = False; | 
|  | strcpy(buffer, masks[i].string); | 
|  | } else { | 
|  | strcat(buffer, " | "); | 
|  | strcat(buffer, masks[i].string); | 
|  | } | 
|  |  | 
|  | return (buffer); | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a motion hint */ | 
|  | static char* | 
|  | IsHint(char is_hint) | 
|  | { | 
|  | switch (is_hint) { | 
|  | case NotifyNormal: | 
|  | return ("NotifyNormal"); | 
|  |  | 
|  | case NotifyHint: | 
|  | return ("NotifyHint"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of an id or the value "None" */ | 
|  | static char* | 
|  | MaybeNone(int value) | 
|  | { | 
|  | static char buffer[16]; | 
|  |  | 
|  | if (value == None) | 
|  | return ("None"); | 
|  | else { | 
|  | sprintf(buffer, "0x%x", value); | 
|  | return (buffer); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a colormap state */ | 
|  | static char* | 
|  | ColormapState(int state) | 
|  | { | 
|  | switch (state) { | 
|  | case ColormapInstalled: | 
|  | return ("ColormapInstalled"); | 
|  |  | 
|  | case ColormapUninstalled: | 
|  | return ("ColormapUninstalled"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a crossing detail */ | 
|  | static char* | 
|  | CrossingDetail(int detail) | 
|  | { | 
|  | switch (detail) { | 
|  | case NotifyAncestor: | 
|  | return ("NotifyAncestor"); | 
|  |  | 
|  | case NotifyInferior: | 
|  | return ("NotifyInferior"); | 
|  |  | 
|  | case NotifyVirtual: | 
|  | return ("NotifyVirtual"); | 
|  |  | 
|  | case NotifyNonlinear: | 
|  | return ("NotifyNonlinear"); | 
|  |  | 
|  | case NotifyNonlinearVirtual: | 
|  | return ("NotifyNonlinearVirtual"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a focus change detail */ | 
|  | static char* | 
|  | FocusChangeDetail(int detail) | 
|  | { | 
|  | switch (detail) { | 
|  | case NotifyAncestor: | 
|  | return ("NotifyAncestor"); | 
|  |  | 
|  | case NotifyInferior: | 
|  | return ("NotifyInferior"); | 
|  |  | 
|  | case NotifyVirtual: | 
|  | return ("NotifyVirtual"); | 
|  |  | 
|  | case NotifyNonlinear: | 
|  | return ("NotifyNonlinear"); | 
|  |  | 
|  | case NotifyNonlinearVirtual: | 
|  | return ("NotifyNonlinearVirtual"); | 
|  |  | 
|  | case NotifyPointer: | 
|  | return ("NotifyPointer"); | 
|  |  | 
|  | case NotifyPointerRoot: | 
|  | return ("NotifyPointerRoot"); | 
|  |  | 
|  | case NotifyDetailNone: | 
|  | return ("NotifyDetailNone"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a configure detail */ | 
|  | static char* | 
|  | ConfigureDetail(int detail) | 
|  | { | 
|  | switch (detail) { | 
|  | case Above: | 
|  | return ("Above"); | 
|  |  | 
|  | case Below: | 
|  | return ("Below"); | 
|  |  | 
|  | case TopIf: | 
|  | return ("TopIf"); | 
|  |  | 
|  | case BottomIf: | 
|  | return ("BottomIf"); | 
|  |  | 
|  | case Opposite: | 
|  | return ("Opposite"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a grab mode */ | 
|  | static char* | 
|  | GrabMode(int mode) | 
|  | { | 
|  | switch (mode) { | 
|  | case NotifyNormal: | 
|  | return ("NotifyNormal"); | 
|  |  | 
|  | case NotifyGrab: | 
|  | return ("NotifyGrab"); | 
|  |  | 
|  | case NotifyUngrab: | 
|  | return ("NotifyUngrab"); | 
|  |  | 
|  | case NotifyWhileGrabbed: | 
|  | return ("NotifyWhileGrabbed"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a mapping request */ | 
|  | static char* | 
|  | MappingRequest(int request) | 
|  | { | 
|  | switch (request) { | 
|  | case MappingModifier: | 
|  | return ("MappingModifier"); | 
|  |  | 
|  | case MappingKeyboard: | 
|  | return ("MappingKeyboard"); | 
|  |  | 
|  | case MappingPointer: | 
|  | return ("MappingPointer"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a stacking order place */ | 
|  | static char* | 
|  | Place(int place) | 
|  | { | 
|  | switch (place) { | 
|  | case PlaceOnTop: | 
|  | return ("PlaceOnTop"); | 
|  |  | 
|  | case PlaceOnBottom: | 
|  | return ("PlaceOnBottom"); | 
|  |  | 
|  | default: | 
|  | return ("?"); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of a major code */ | 
|  | static char* | 
|  | MajorCode(int code) | 
|  | { | 
|  | static char buffer[32]; | 
|  |  | 
|  | switch (code) { | 
|  | case X_CopyArea: | 
|  | return ("X_CopyArea"); | 
|  |  | 
|  | case X_CopyPlane: | 
|  | return ("X_CopyPlane"); | 
|  |  | 
|  | default: | 
|  | sprintf(buffer, "0x%x", code); | 
|  | return (buffer); | 
|  | } | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent the keycode contained in the key event */ | 
|  | static char* | 
|  | Keycode(XKeyEvent *ev) | 
|  | { | 
|  | static char buffer[256]; | 
|  | KeySym keysym_str; | 
|  | char *keysym_name; | 
|  | char string[256]; | 
|  |  | 
|  | XLookupString(ev, string, 64, &keysym_str, NULL); | 
|  |  | 
|  | if (keysym_str == NoSymbol) | 
|  | keysym_name = "NoSymbol"; | 
|  | else if (!(keysym_name = XKeysymToString(keysym_str))) | 
|  | keysym_name = "(no name)"; | 
|  | sprintf(buffer, "%u (keysym 0x%x \"%s\")", | 
|  | (int)ev->keycode, (int)keysym_str, keysym_name); | 
|  | return (buffer); | 
|  | } | 
|  |  | 
|  | /* Returns the string equivalent of an atom or "None"*/ | 
|  | static char* | 
|  | AtomName(Display *dpy, Atom atom) | 
|  | { | 
|  | static char buffer[256]; | 
|  | char *atom_name; | 
|  |  | 
|  | if (atom == None) | 
|  | return ("None"); | 
|  |  | 
|  | atom_name = XGetAtomName(dpy, atom); | 
|  | strncpy(buffer, atom_name, 256); | 
|  | XFree(atom_name); | 
|  | return (buffer); | 
|  | } | 
|  |  | 
|  | /******************************************************************************/ | 
|  | /**** Routines to print out readable values for the field of various events ***/ | 
|  | /******************************************************************************/ | 
|  |  | 
|  | static void | 
|  | VerbMotion(XMotionEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("root=0x%x%s", (int)ev->root, sep); | 
|  | printf("subwindow=0x%x%s", (int)ev->subwindow, sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); | 
|  | printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); | 
|  | printf("is_hint=%s%s", IsHint(ev->is_hint), sep); | 
|  | printf("same_screen=%s\n", TorF(ev->same_screen)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbButton(XButtonEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("root=0x%x%s", (int)ev->root, sep); | 
|  | printf("subwindow=0x%x%s", (int)ev->subwindow, sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); | 
|  | printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); | 
|  | printf("button=%s%s", ButtonAndOrModifierState(ev->button), sep); | 
|  | printf("same_screen=%s\n", TorF(ev->same_screen)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbColormap(XColormapEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("colormap=%s%s", MaybeNone(ev->colormap), sep); | 
|  | printf("new=%s%s", TorF(ev->new), sep); | 
|  | printf("state=%s\n", ColormapState(ev->state)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbCrossing(XCrossingEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("root=0x%x%s", (int)ev->root, sep); | 
|  | printf("subwindow=0x%x%s", (int)ev->subwindow, sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); | 
|  | printf("mode=%s%s", GrabMode(ev->mode), sep); | 
|  | printf("detail=%s%s", CrossingDetail(ev->detail), sep); | 
|  | printf("same_screen=%s%s", TorF(ev->same_screen), sep); | 
|  | printf("focus=%s%s", TorF(ev->focus), sep); | 
|  | printf("state=%s\n", ButtonAndOrModifierState(ev->state)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbExpose(XExposeEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("width=%d height=%d%s", ev->width, ev->height, sep); | 
|  | printf("count=%d\n", ev->count); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbGraphicsExpose(XGraphicsExposeEvent *ev) | 
|  | { | 
|  | printf("drawable=0x%x%s", (int)ev->drawable, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("width=%d height=%d%s", ev->width, ev->height, sep); | 
|  | printf("major_code=%s%s", MajorCode(ev->major_code), sep); | 
|  | printf("minor_code=%d\n", ev->minor_code); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbNoExpose(XNoExposeEvent *ev) | 
|  | { | 
|  | printf("drawable=0x%x%s", (int)ev->drawable, sep); | 
|  | printf("major_code=%s%s", MajorCode(ev->major_code), sep); | 
|  | printf("minor_code=%d\n", ev->minor_code); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbFocus(XFocusChangeEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("mode=%s%s", GrabMode(ev->mode), sep); | 
|  | printf("detail=%s\n", FocusChangeDetail(ev->detail)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbKeymap(XKeymapEvent *ev) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("key_vector="); | 
|  | for (i = 0; i < 32; i++) | 
|  | printf("%02x", ev->key_vector[i]); | 
|  | printf("\n"); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbKey(XKeyEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("root=0x%x%s", (int)ev->root, sep); | 
|  | if(ev->subwindow) | 
|  | printf("subwindow=0x%x%s", (int)ev->subwindow, sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("[%d,%d]%s", ev->x, ev->y, sep); | 
|  | printf("root=[%d,%d]%s", ev->x_root, ev->y_root, sep); | 
|  | if(ev->state) | 
|  | printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); | 
|  | printf("keycode=%s%s", Keycode(ev), sep); | 
|  | if(!ev->same_screen) | 
|  | printf("!same_screen", TorF(ev->same_screen)); | 
|  | printf("\n"); | 
|  | return; | 
|  |  | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("root=0x%x%s", (int)ev->root, sep); | 
|  | printf("subwindow=0x%x%s", (int)ev->subwindow, sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("x_root=%d y_root=%d%s", ev->x_root, ev->y_root, sep); | 
|  | printf("state=%s%s", ButtonAndOrModifierState(ev->state), sep); | 
|  | printf("keycode=%s%s", Keycode(ev), sep); | 
|  | printf("same_screen=%s\n", TorF(ev->same_screen)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbProperty(XPropertyEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("atom=%s%s", AtomName(ev->display, ev->atom), sep); | 
|  | printf("time=%s%s", ServerTime(ev->time), sep); | 
|  | printf("state=%s\n", PropertyState(ev->state)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbResizeRequest(XResizeRequestEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("width=%d height=%d\n", ev->width, ev->height); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbCirculate(XCirculateEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("place=%s\n", Place(ev->place)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbConfigure(XConfigureEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("width=%d height=%d%s", ev->width, ev->height, sep); | 
|  | printf("border_width=%d%s", ev->border_width, sep); | 
|  | printf("above=%s%s", MaybeNone(ev->above), sep); | 
|  | printf("override_redirect=%s\n", TorF(ev->override_redirect)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbCreateWindow(XCreateWindowEvent *ev) | 
|  | { | 
|  | printf("parent=0x%x%s", (int)ev->parent, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("width=%d height=%d%s", ev->width, ev->height, sep); | 
|  | printf("border_width=%d%s", ev->border_width, sep); | 
|  | printf("override_redirect=%s\n", TorF(ev->override_redirect)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbDestroyWindow(XDestroyWindowEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x\n", (int)ev->window); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbGravity(XGravityEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("x=%d y=%d\n", ev->x, ev->y); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbMap(XMapEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("override_redirect=%s\n", TorF(ev->override_redirect)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbReparent(XReparentEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("parent=0x%x%s", (int)ev->parent, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("override_redirect=%s\n", TorF(ev->override_redirect)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbUnmap(XUnmapEvent *ev) | 
|  | { | 
|  | printf("event=0x%x%s", (int)ev->event, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("from_configure=%s\n", TorF(ev->from_configure)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbCirculateRequest(XCirculateRequestEvent *ev) | 
|  | { | 
|  | printf("parent=0x%x%s", (int)ev->parent, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("place=%s\n", Place(ev->place)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbConfigureRequest(XConfigureRequestEvent *ev) | 
|  | { | 
|  | printf("parent=0x%x%s", (int)ev->parent, sep); | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("x=%d y=%d%s", ev->x, ev->y, sep); | 
|  | printf("width=%d height=%d%s", ev->width, ev->height, sep); | 
|  | printf("border_width=%d%s", ev->border_width, sep); | 
|  | printf("above=%s%s", MaybeNone(ev->above), sep); | 
|  | printf("detail=%s%s", ConfigureDetail(ev->detail), sep); | 
|  | printf("value_mask=%s\n", ConfigureValueMask(ev->value_mask)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbMapRequest(XMapRequestEvent *ev) | 
|  | { | 
|  | printf("parent=0x%x%s", (int)ev->parent, sep); | 
|  | printf("window=0x%x\n", (int)ev->window); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbClient(XClientMessageEvent *ev) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("message_type=%s%s", AtomName(ev->display, ev->message_type), sep); | 
|  | printf("format=%d\n", ev->format); | 
|  | printf("data (shown as longs)="); | 
|  | for (i = 0; i < 5; i++) | 
|  | printf(" 0x%08lx", ev->data.l[i]); | 
|  | printf("\n"); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbMapping(XMappingEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("request=%s%s", MappingRequest(ev->request), sep); | 
|  | printf("first_keycode=0x%x%s", ev->first_keycode, sep); | 
|  | printf("count=0x%x\n", ev->count); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbSelectionClear(XSelectionClearEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); | 
|  | printf("time=%s\n", ServerTime(ev->time)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbSelection(XSelectionEvent *ev) | 
|  | { | 
|  | printf("requestor=0x%x%s", (int)ev->requestor, sep); | 
|  | printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); | 
|  | printf("target=%s%s", AtomName(ev->display, ev->target), sep); | 
|  | printf("property=%s%s", AtomName(ev->display, ev->property), sep); | 
|  | printf("time=%s\n", ServerTime(ev->time)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbSelectionRequest(XSelectionRequestEvent *ev) | 
|  | { | 
|  | printf("owner=0x%x%s", (int)ev->owner, sep); | 
|  | printf("requestor=0x%x%s", (int)ev->requestor, sep); | 
|  | printf("selection=%s%s", AtomName(ev->display, ev->selection), sep); | 
|  | printf("target=%s%s", AtomName(ev->display, ev->target), sep); | 
|  | printf("property=%s%s", AtomName(ev->display, ev->property), sep); | 
|  | printf("time=%s\n", ServerTime(ev->time)); | 
|  | } | 
|  |  | 
|  | static void | 
|  | VerbVisibility(XVisibilityEvent *ev) | 
|  | { | 
|  | printf("window=0x%x%s", (int)ev->window, sep); | 
|  | printf("state=%s\n", VisibilityState(ev->state)); | 
|  | } | 
|  |  | 
|  | /******************************************************************************/ | 
|  | /************ Return the string representation for type of an event ***********/ | 
|  | /******************************************************************************/ | 
|  |  | 
|  | char *eventtype(XEvent *ev) | 
|  | { | 
|  | static char buffer[20]; | 
|  |  | 
|  | switch (ev->type) { | 
|  | case KeyPress: | 
|  | return ("KeyPress"); | 
|  | case KeyRelease: | 
|  | return ("KeyRelease"); | 
|  | case ButtonPress: | 
|  | return ("ButtonPress"); | 
|  | case ButtonRelease: | 
|  | return ("ButtonRelease"); | 
|  | case MotionNotify: | 
|  | return ("MotionNotify"); | 
|  | case EnterNotify: | 
|  | return ("EnterNotify"); | 
|  | case LeaveNotify: | 
|  | return ("LeaveNotify"); | 
|  | case FocusIn: | 
|  | return ("FocusIn"); | 
|  | case FocusOut: | 
|  | return ("FocusOut"); | 
|  | case KeymapNotify: | 
|  | return ("KeymapNotify"); | 
|  | case Expose: | 
|  | return ("Expose"); | 
|  | case GraphicsExpose: | 
|  | return ("GraphicsExpose"); | 
|  | case NoExpose: | 
|  | return ("NoExpose"); | 
|  | case VisibilityNotify: | 
|  | return ("VisibilityNotify"); | 
|  | case CreateNotify: | 
|  | return ("CreateNotify"); | 
|  | case DestroyNotify: | 
|  | return ("DestroyNotify"); | 
|  | case UnmapNotify: | 
|  | return ("UnmapNotify"); | 
|  | case MapNotify: | 
|  | return ("MapNotify"); | 
|  | case MapRequest: | 
|  | return ("MapRequest"); | 
|  | case ReparentNotify: | 
|  | return ("ReparentNotify"); | 
|  | case ConfigureNotify: | 
|  | return ("ConfigureNotify"); | 
|  | case ConfigureRequest: | 
|  | return ("ConfigureRequest"); | 
|  | case GravityNotify: | 
|  | return ("GravityNotify"); | 
|  | case ResizeRequest: | 
|  | return ("ResizeRequest"); | 
|  | case CirculateNotify: | 
|  | return ("CirculateNotify"); | 
|  | case CirculateRequest: | 
|  | return ("CirculateRequest"); | 
|  | case PropertyNotify: | 
|  | return ("PropertyNotify"); | 
|  | case SelectionClear: | 
|  | return ("SelectionClear"); | 
|  | case SelectionRequest: | 
|  | return ("SelectionRequest"); | 
|  | case SelectionNotify: | 
|  | return ("SelectionNotify"); | 
|  | case ColormapNotify: | 
|  | return ("ColormapNotify"); | 
|  | case ClientMessage: | 
|  | return ("ClientMessage"); | 
|  | case MappingNotify: | 
|  | return ("MappingNotify"); | 
|  | } | 
|  | sprintf(buffer, "%d", ev->type); | 
|  | return buffer; | 
|  | } | 
|  |  | 
|  | /******************************************************************************/ | 
|  | /**************** Print the values of all fields for any event ****************/ | 
|  | /******************************************************************************/ | 
|  |  | 
|  | void printevent(XEvent *e) | 
|  | { | 
|  | XAnyEvent *ev = (void*)e; | 
|  |  | 
|  | printf("%3ld %-20s ", ev->serial, eventtype(e)); | 
|  | if(ev->send_event) | 
|  | printf("(sendevent) "); | 
|  | if(0){ | 
|  | printf("type=%s%s", eventtype(e), sep); | 
|  | printf("serial=%lu%s", ev->serial, sep); | 
|  | printf("send_event=%s%s", TorF(ev->send_event), sep); | 
|  | printf("display=0x%p%s", ev->display, sep); | 
|  | } | 
|  |  | 
|  | switch (ev->type) { | 
|  | case MotionNotify: | 
|  | VerbMotion((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ButtonPress: | 
|  | case ButtonRelease: | 
|  | VerbButton((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ColormapNotify: | 
|  | VerbColormap((void*)ev); | 
|  | break; | 
|  |  | 
|  | case EnterNotify: | 
|  | case LeaveNotify: | 
|  | VerbCrossing((void*)ev); | 
|  | break; | 
|  |  | 
|  | case Expose: | 
|  | VerbExpose((void*)ev); | 
|  | break; | 
|  |  | 
|  | case GraphicsExpose: | 
|  | VerbGraphicsExpose((void*)ev); | 
|  | break; | 
|  |  | 
|  | case NoExpose: | 
|  | VerbNoExpose((void*)ev); | 
|  | break; | 
|  |  | 
|  | case FocusIn: | 
|  | case FocusOut: | 
|  | VerbFocus((void*)ev); | 
|  | break; | 
|  |  | 
|  | case KeymapNotify: | 
|  | VerbKeymap((void*)ev); | 
|  | break; | 
|  |  | 
|  | case KeyPress: | 
|  | case KeyRelease: | 
|  | VerbKey((void*)ev); | 
|  | break; | 
|  |  | 
|  | case PropertyNotify: | 
|  | VerbProperty((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ResizeRequest: | 
|  | VerbResizeRequest((void*)ev); | 
|  | break; | 
|  |  | 
|  | case CirculateNotify: | 
|  | VerbCirculate((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ConfigureNotify: | 
|  | VerbConfigure((void*)ev); | 
|  | break; | 
|  |  | 
|  | case CreateNotify: | 
|  | VerbCreateWindow((void*)ev); | 
|  | break; | 
|  |  | 
|  | case DestroyNotify: | 
|  | VerbDestroyWindow((void*)ev); | 
|  | break; | 
|  |  | 
|  | case GravityNotify: | 
|  | VerbGravity((void*)ev); | 
|  | break; | 
|  |  | 
|  | case MapNotify: | 
|  | VerbMap((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ReparentNotify: | 
|  | VerbReparent((void*)ev); | 
|  | break; | 
|  |  | 
|  | case UnmapNotify: | 
|  | VerbUnmap((void*)ev); | 
|  | break; | 
|  |  | 
|  | case CirculateRequest: | 
|  | VerbCirculateRequest((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ConfigureRequest: | 
|  | VerbConfigureRequest((void*)ev); | 
|  | break; | 
|  |  | 
|  | case MapRequest: | 
|  | VerbMapRequest((void*)ev); | 
|  | break; | 
|  |  | 
|  | case ClientMessage: | 
|  | VerbClient((void*)ev); | 
|  | break; | 
|  |  | 
|  | case MappingNotify: | 
|  | VerbMapping((void*)ev); | 
|  | break; | 
|  |  | 
|  | case SelectionClear: | 
|  | VerbSelectionClear((void*)ev); | 
|  | break; | 
|  |  | 
|  | case SelectionNotify: | 
|  | VerbSelection((void*)ev); | 
|  | break; | 
|  |  | 
|  | case SelectionRequest: | 
|  | VerbSelectionRequest((void*)ev); | 
|  | break; | 
|  |  | 
|  | case VisibilityNotify: | 
|  | VerbVisibility((void*)ev); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  |