commit 74750219dad22e4d1ca96f74bf7e2ce1cb05e0b1
parent 2ade835740cf73b4cdec5ee790b973ce3e8835a2
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Tue, 4 Jul 2006 13:22:59 +0200
added wmiikgrab tool to cmd/ (don't invoke it unless you don't want to restart X), I search for a way to exploit the synthetic flag of key events in X atm
Diffstat:
3 files changed, 123 insertions(+), 3 deletions(-)
diff --git a/cmd/Makefile b/cmd/Makefile
@@ -7,7 +7,7 @@ CFLAGS += -I../liblitz -I../libixp -I../libcext
LDFLAGS += -L../libixp -lixp -L../libcext -lcext
X11LDFLAGS += -L../liblitz -llitz
-X11SRC = wmiimenu.c wmiipsel.c wmiiwarp.c
+X11SRC = wmiimenu.c wmiipsel.c wmiiwarp.c wmiikgrab.c
SRC = wmiir.c wmiisetsid.c
ALLSRC = ${SRC} ${X11SRC}
diff --git a/cmd/wm/key.c b/cmd/wm/key.c
@@ -134,7 +134,7 @@ get_key(const char *name)
}
static void
-next_keystroke(unsigned long *mod, KeyCode *keyCode)
+next_keystroke(unsigned long *mod, KeyCode *code)
{
XEvent e;
KeySym sym;
@@ -142,7 +142,7 @@ next_keystroke(unsigned long *mod, KeyCode *keyCode)
do {
XMaskEvent(blz.dpy, KeyPressMask, &e);
*mod |= e.xkey.state & valid_mask;
- *keyCode = (KeyCode) e.xkey.keycode;
+ *code = (KeyCode) e.xkey.keycode;
sym = XKeycodeToKeysym(blz.dpy, e.xkey.keycode, 0);
} while(IsModifierKey(sym));
}
diff --git a/cmd/wmiikgrab.c b/cmd/wmiikgrab.c
@@ -0,0 +1,120 @@
+/*
+ * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
+ * See LICENSE file for license details.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <cext.h>
+
+#include <X11/keysym.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+static char version[] = "wmiikgrab - " VERSION ", (C)opyright MMIV-MMVI Anselm R. Garbe\n";
+static Window root;
+static Display *dpy;
+
+static void
+usage()
+{
+ fprintf(stderr, "%s\n", "usage: wmiikgrab [-v]\n");
+ exit(1);
+}
+
+static void
+emulate_key_press(unsigned long mod, KeyCode key)
+{
+ XEvent e;
+ Window win;
+ int revert;
+
+ XGetInputFocus(dpy, &win, &revert);
+
+ e.xkey.type = KeyPress;
+ e.xkey.time = CurrentTime;
+ e.xkey.window = win;
+ e.xkey.display = dpy;
+ e.xkey.state = mod;
+ e.xkey.keycode = key;
+ XSendEvent(dpy, win, True, KeyPressMask, &e);
+ e.xkey.type = KeyRelease;
+ XSendEvent(dpy, win, True, KeyReleaseMask, &e);
+ XSync(dpy, False);
+}
+
+static void
+next_keystroke(unsigned long *mod, KeyCode *code)
+{
+ XEvent e;
+ KeySym sym;
+ *mod = 0;
+ do {
+ XMaskEvent(dpy, KeyPressMask, &e);
+ *mod |= e.xkey.state;
+ *code = (KeyCode) e.xkey.keycode;
+ sym = XKeycodeToKeysym(dpy, e.xkey.keycode, 0);
+ } while(IsModifierKey(sym));
+}
+
+static void
+print_key(unsigned long mod, KeyCode code)
+{
+ char buf[256];
+
+ buf[0] = 0;
+ if(mod & ShiftMask)
+ cext_strlcat(buf, "Shift-", sizeof(buf));
+ if(mod & ControlMask)
+ cext_strlcat(buf, "Control-", sizeof(buf));
+ if(mod & Mod1Mask)
+ cext_strlcat(buf, "Mod1-", sizeof(buf));
+ if(mod & Mod2Mask)
+ cext_strlcat(buf, "Mod2-", sizeof(buf));
+ if(mod & Mod3Mask)
+ cext_strlcat(buf, "Mod3-", sizeof(buf));
+ if(mod & Mod4Mask)
+ cext_strlcat(buf, "Mod4-", sizeof(buf));
+ if(mod & Mod5Mask)
+ cext_strlcat(buf, "Mod5-", sizeof(buf));
+
+ cext_strlcat(buf,
+ XKeysymToString(XKeycodeToKeysym(dpy, code, 0)), sizeof(buf));
+
+ fprintf(stdout, "EventType=Key;EventValue='%s'\n", buf);
+}
+
+int
+main(int argc, char **argv)
+{
+ unsigned long mod;
+ KeyCode code;
+
+ /* command line args */
+ if(argc > 1) {
+ if(!strncmp(argv[1], "-v", 3)) {
+ fprintf(stdout, "%s", version);
+ exit(0);
+ } else
+ usage();
+ }
+ dpy = XOpenDisplay(0);
+ if(!dpy) {
+ fprintf(stderr, "%s", "wmiikgrab: cannot open display\n");
+ exit(1);
+ }
+ root = DefaultRootWindow(dpy);
+
+ XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ for(;;) {
+ next_keystroke(&mod, &code);
+ print_key(mod, code);
+ emulate_key_press(mod, code);
+ }
+ XUngrabKeyboard(dpy, CurrentTime);
+ XSync(dpy, False);
+
+ return 0;
+}