#include #include Boolean use_separate_lines = True; static char *sep; /******************************************************************************/ /**** Miscellaneous routines to convert values to their string equivalents ****/ /******************************************************************************/ /* Returns the string equivalent of a boolean parameter */ static char *TorF(bool) 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(state) 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(state) 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 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; sprintf(buffer, "%ld day%s %02ld:%02ld:%02ld.%03ld", day, day == 1 ? "" : "(s)", hr, min, sec, msec); return (buffer); } /* Simple structure to ease the interpretation of masks */ typedef struct _MaskType { unsigned int value; char *string; } MaskType; /* Returns the string equivalent of a mask of buttons and/or modifier keys */ static char *ButtonAndOrModifierState(state) 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(valuemask) 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(is_hint) 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(value) 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(state) 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(detail) 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(detail) 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(detail) 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(mode) 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(request) 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(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(code) 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(ev) 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\")", ev->keycode, (unsigned)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", (unsigned)ev->window, sep); printf("root=0x%x%s", (unsigned)ev->root, sep); printf("subwindow=0x%x%s", (unsigned)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", (unsigned)ev->window, sep); printf("root=0x%x%s", (unsigned)ev->root, sep); printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep); printf("root=0x%x%s", (unsigned)ev->root, sep); printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep); printf("root=0x%x%s", (unsigned)ev->root, sep); printf("subwindow=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)ev->window, sep); printf("width=%d height=%d\n", ev->width, ev->height); } static void VerbCirculate(XCirculateEvent *ev) { printf("event=0x%x%s", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("place=%s\n", Place(ev->place)); } static void VerbConfigure(XConfigureEvent *ev) { printf("event=0x%x%s", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)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", (unsigned)ev->parent, sep); printf("window=0x%x%s", (unsigned)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", (unsigned)ev->event, sep); printf("window=0x%x\n", (unsigned)ev->window); } static void VerbGravity(XGravityEvent *ev) { printf("event=0x%x%s", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("x=%d y=%d\n", ev->x, ev->y); } static void VerbMap(XMapEvent *ev) { printf("event=0x%x%s", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("override_redirect=%s\n", TorF(ev->override_redirect)); } static void VerbReparent(XReparentEvent *ev) { printf("event=0x%x%s", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("parent=0x%x%s", (unsigned)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", (unsigned)ev->event, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("from_configure=%s\n", TorF(ev->from_configure)); } static void VerbCirculateRequest(XCirculateRequestEvent *ev) { printf("parent=0x%x%s", (unsigned)ev->parent, sep); printf("window=0x%x%s", (unsigned)ev->window, sep); printf("place=%s\n", Place(ev->place)); } static void VerbConfigureRequest(XConfigureRequestEvent *ev) { printf("parent=0x%x%s", (unsigned)ev->parent, sep); printf("window=0x%x%s", (unsigned)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", (unsigned)ev->parent, sep); printf("window=0x%x\n", (unsigned)ev->window); } static void VerbClient(XClientMessageEvent *ev) { int i; printf("window=0x%x%s", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)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", (unsigned)ev->owner, sep); printf("requestor=0x%x%s", (unsigned)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", (unsigned)ev->window, sep); printf("state=%s\n", VisibilityState(ev->state)); } /******************************************************************************/ /************ Return the string representation for type of an event ***********/ /******************************************************************************/ char *GetType(ev) XEvent *ev; { 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"); } return "???"; } /******************************************************************************/ /**************** Print the values of all fields for any event ****************/ /******************************************************************************/ void ShowEvent(XEvent *eev) { XAnyEvent *ev = (XAnyEvent*)eev; /* determine which field separator to use */ if (use_separate_lines) sep = "\n"; else sep = " "; printf("type=%s%s", GetType((XEvent*)ev), sep); printf("serial=%ld%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; } }