commit 96dadee572e298d5003b3f37fc71ca561a70cd4e
parent 9ed72446583db1f9fc64ef6cd4b00a1f24679488
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Tue, 4 Jul 2006 14:30:47 +0200
found a working way for completely grabbing the keyboard and using XTestFakeKeyEvent() from XTEST extension which would work with all kind of clients (only local clients)
Diffstat:
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/cmd/wmiikgrab.c b/cmd/wmiikgrab.c
@@ -8,6 +8,7 @@
#include <string.h>
#include <cext.h>
+#include <X11/extensions/XTest.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -28,25 +29,17 @@ static void
next_keystroke(unsigned long *mod, KeyCode *code)
{
XEvent e;
- KeySym sym;
- Window win;
- int revert;
+ while(XGrabKeyboard(dpy, root, True,
+ GrabModeAsync, GrabModeAsync, CurrentTime) != Success);
*mod = 0;
- XGetInputFocus(dpy, &win, &revert);
- XGrabKeyboard(dpy, win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
-/* do {*/
- XMaskEvent(dpy, KeyPressMask, &e);
- XSendEvent(dpy, win, True, KeyPressMask, &e);
- *mod |= e.xkey.state;/* & valid_mask;*/
- *code = (KeyCode) e.xkey.keycode;
- sym = XKeycodeToKeysym(dpy, e.xkey.keycode, 0);
-/* } while(IsModifierKey(sym));*/
+ XMaskEvent(dpy, KeyPressMask, &e);
+ *mod |= e.xkey.state;/* & valid_mask;*/
+ *code = (KeyCode) e.xkey.keycode;
XUngrabKeyboard(dpy, CurrentTime);
- XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
}
-static Bool
+static void
print_key(unsigned long mod, KeyCode code)
{
char buf[256], *k;
@@ -71,8 +64,6 @@ print_key(unsigned long mod, KeyCode code)
cext_strlcat(buf, k, sizeof(buf));
fprintf(stdout, "EventType=Key;EventValue='%s'\n", buf);
-
- return strncmp(buf, "Escape", 7);
}
int
@@ -96,11 +87,11 @@ main(int argc, char **argv)
}
root = DefaultRootWindow(dpy);
- do {
+ for(;;) {
next_keystroke(&mod, &code);
- XAllowEvents(dpy, AsyncKeyboard, CurrentTime);
- } while (print_key(mod, code));
- XSync(dpy, False);
+ print_key(mod, code);
+ XTestFakeKeyEvent(dpy, code, True, CurrentTime);
+ }
return 0;
}