ryudo/showevent/ShowEvent.c

734 lines
21 KiB
C
Raw Normal View History

2019-12-02 18:23:00 +00:00
#include <X11/Intrinsic.h>
#include <X11/Xproto.h>
Boolean use_separate_lines = True;
2021-02-26 18:01:22 +00:00
static char* sep;
2019-12-02 18:23:00 +00:00
/******************************************************************************/
/**** Miscellaneous routines to convert values to their string equivalents ****/
/******************************************************************************/
/* Returns the string equivalent of a boolean parameter */
2021-02-26 18:01:22 +00:00
static char* TorF(bool) int bool;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (bool) {
case True: return ("True");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case False: return ("False");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a property notify state */
2021-02-26 18:01:22 +00:00
static char* PropertyState(state) int state;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (state) {
case PropertyNewValue: return ("PropertyNewValue");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case PropertyDelete: return ("PropertyDelete");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a visibility notify state */
2021-02-26 18:01:22 +00:00
static char* VisibilityState(state) int state;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (state) {
case VisibilityUnobscured: return ("VisibilityUnobscured");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case VisibilityPartiallyObscured: return ("VisibilityPartiallyObscured");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case VisibilityFullyObscured: return ("VisibilityFullyObscured");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a timestamp */
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
/* Simple structure to ease the interpretation of masks */
typedef struct _MaskType {
2021-02-26 18:01:22 +00:00
unsigned int value;
char* string;
2019-12-02 18:23:00 +00:00
} MaskType;
/* Returns the string equivalent of a mask of buttons and/or modifier keys */
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a mask of configure window values */
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a motion hint */
2021-02-26 18:01:22 +00:00
static char* IsHint(is_hint) char is_hint;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (is_hint) {
case NotifyNormal: return ("NotifyNormal");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyHint: return ("NotifyHint");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of an id or the value "None" */
2021-02-26 18:01:22 +00:00
static char* MaybeNone(value) int value;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
static char buffer[16];
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
if (value == None)
return ("None");
else {
sprintf(buffer, "0x%x", value);
return (buffer);
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a colormap state */
2021-02-26 18:01:22 +00:00
static char* ColormapState(state) int state;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (state) {
case ColormapInstalled: return ("ColormapInstalled");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case ColormapUninstalled: return ("ColormapUninstalled");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a crossing detail */
2021-02-26 18:01:22 +00:00
static char* CrossingDetail(detail) int detail;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (detail) {
case NotifyAncestor: return ("NotifyAncestor");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyInferior: return ("NotifyInferior");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyVirtual: return ("NotifyVirtual");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyNonlinear: return ("NotifyNonlinear");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a focus change detail */
2021-02-26 18:01:22 +00:00
static char* FocusChangeDetail(detail) int detail;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (detail) {
case NotifyAncestor: return ("NotifyAncestor");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyInferior: return ("NotifyInferior");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyVirtual: return ("NotifyVirtual");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyNonlinear: return ("NotifyNonlinear");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyNonlinearVirtual: return ("NotifyNonlinearVirtual");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyPointer: return ("NotifyPointer");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyPointerRoot: return ("NotifyPointerRoot");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyDetailNone: return ("NotifyDetailNone");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a configure detail */
2021-02-26 18:01:22 +00:00
static char* ConfigureDetail(detail) int detail;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (detail) {
case Above: return ("Above");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case Below: return ("Below");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case TopIf: return ("TopIf");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case BottomIf: return ("BottomIf");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case Opposite: return ("Opposite");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a grab mode */
2021-02-26 18:01:22 +00:00
static char* GrabMode(mode) int mode;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (mode) {
case NotifyNormal: return ("NotifyNormal");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyGrab: return ("NotifyGrab");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyUngrab: return ("NotifyUngrab");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NotifyWhileGrabbed: return ("NotifyWhileGrabbed");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a mapping request */
2021-02-26 18:01:22 +00:00
static char* MappingRequest(request) int request;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (request) {
case MappingModifier: return ("MappingModifier");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case MappingKeyboard: return ("MappingKeyboard");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case MappingPointer: return ("MappingPointer");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a stacking order place */
2021-02-26 18:01:22 +00:00
static char* Place(place) int place;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
switch (place) {
case PlaceOnTop: return ("PlaceOnTop");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case PlaceOnBottom: return ("PlaceOnBottom");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: return ("?");
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of a major code */
2021-02-26 18:01:22 +00:00
static char* MajorCode(code) int code;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
static char buffer[32];
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
switch (code) {
case X_CopyArea: return ("X_CopyArea");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case X_CopyPlane: return ("X_CopyPlane");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
default: sprintf(buffer, "0x%x", code); return (buffer);
}
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent the keycode contained in the key event */
2021-02-26 18:01:22 +00:00
static char* Keycode(ev) XKeyEvent* ev;
2019-12-02 18:23:00 +00:00
{
2021-02-26 18:01:22 +00:00
static char buffer[256];
KeySym keysym_str;
char* keysym_name;
char string[256];
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
XLookupString(ev, string, 64, &keysym_str, NULL);
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
/* Returns the string equivalent of an atom or "None"*/
2021-02-26 18:01:22 +00:00
static char*
AtomName(Display* dpy, Atom atom) {
static char buffer[256];
char* atom_name;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
if (atom == None) return ("None");
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
atom_name = XGetAtomName(dpy, atom);
strncpy(buffer, atom_name, 256);
XFree(atom_name);
return (buffer);
2019-12-02 18:23:00 +00:00
}
/******************************************************************************/
/**** Routines to print out readable values for the field of various events ***/
/******************************************************************************/
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
static void
VerbMapRequest(XMapRequestEvent* ev) {
printf("parent=0x%x%s", (unsigned)ev->parent, sep);
printf("window=0x%x\n", (unsigned)ev->window);
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
static void
VerbClient(XClientMessageEvent* ev) {
int i;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
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");
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
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));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
static void
VerbVisibility(XVisibilityEvent* ev) {
printf("window=0x%x%s", (unsigned)ev->window, sep);
printf("state=%s\n", VisibilityState(ev->state));
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
/******************************************************************************/
/************ Return the string representation for type of an event ***********/
/******************************************************************************/
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
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 "???";
2019-12-02 18:23:00 +00:00
}
2021-02-26 18:01:22 +00:00
/******************************************************************************/
/**************** Print the values of all fields for any event ****************/
/******************************************************************************/
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
void
ShowEvent(XEvent* eev) {
XAnyEvent* ev = (XAnyEvent*)eev;
/* determine which field separator to use */
if (use_separate_lines)
sep = "\n";
else
sep = " ";
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
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);
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
switch (ev->type) {
case MotionNotify: VerbMotion((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case ButtonPress:
case ButtonRelease: VerbButton((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case ColormapNotify: VerbColormap((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case EnterNotify:
case LeaveNotify: VerbCrossing((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case Expose: VerbExpose((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case GraphicsExpose: VerbGraphicsExpose((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case NoExpose: VerbNoExpose((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case FocusIn:
case FocusOut: VerbFocus((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case KeymapNotify: VerbKeymap((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
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;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case MappingNotify: VerbMapping((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case SelectionClear: VerbSelectionClear((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case SelectionNotify: VerbSelection((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case SelectionRequest: VerbSelectionRequest((void*)ev); break;
2019-12-02 18:23:00 +00:00
2021-02-26 18:01:22 +00:00
case VisibilityNotify: VerbVisibility((void*)ev); break;
}
2019-12-02 18:23:00 +00:00
}