#include #include #include #include #include #include #include #include #include static int print_key_event (XEvent *ev) { XKeyEvent *key_ev; char buffer[20]; int bufsize = 19; KeySym key; XComposeStatus compose; int char_count; key_ev = (XKeyEvent *)ev; printf (" State: %x KeyCode: %x\n", key_ev->state & ShiftMask, key_ev->keycode); char_count = XLookupString(key_ev, buffer, bufsize, &key, &compose); buffer[char_count] = '\0'; printf (" Char Count: %d KeySym: %x char: |%c|\n", char_count, key, buffer[0]); return 0; } int main(int argc, char **argv) { Display *dpy; int major, minor; XEvent event; XEvent save_event; XClientMessageEvent *xcme; int count = 0; long delay = 0; int ret; if (argc > 2) { printf ("Usage: xeviedemo delay (in milliseconds)\n"); exit(1); } else if (argc == 2) { delay = strtol(argv[1], 0, 0); } printf("Delay is %d milliseconds\n", delay); delay *= 1000; dpy = XOpenDisplay(NULL); XevieQueryVersion(dpy, &major, &minor); printf("major = %d, minor = %d\n", major, minor); if(XevieStart(dpy)) printf("XevieStart(dpy) finished \n"); else { printf("XevieStart(dpy) failed, only one client is allowed to do event interception\n"); exit(1); } XevieSelectInput(dpy, KeyPressMask | KeyReleaseMask); while(1) { ret = 0; XNextEvent(dpy, &event); xcme = (XClientMessageEvent *)&event; /* for readOnly users, send events back to Xserver immediately */ printf("(%4d)", count++); switch(event.type) { case KeyPress: usleep(delay); printf(" KeyPress\n"); ret = print_key_event (&event); break; case KeyRelease: printf(" KeyRelease\n"); ret = print_key_event (&event); break; default: printf(" unknown event %x\n", event.type); break; } if (!ret) { printf ("Call XevieSendEvent\n"); XevieSendEvent(dpy, &event, XEVIE_UNMODIFIED); save_event.type = 0; } else { if (save_event.type == event.type) printf ("Event should be ignored\n"); memcpy (&save_event, &event, sizeof (XEvent)); } if(count > 10000) { break; } } XevieEnd(dpy); printf("XevieEnd(dpy) finished \n"); exit(0); }