chiark / gitweb /
keystroke injection attempts
[ypp-sc-tools.db-test.git] / pctb / x-manip-window.c
diff --git a/pctb/x-manip-window.c b/pctb/x-manip-window.c
new file mode 100644 (file)
index 0000000..2ff1135
--- /dev/null
@@ -0,0 +1,69 @@
+/**/
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xlib.h>
+
+#define eassert assert
+
+static Display *disp;
+static long id;
+
+static void kmevent(XEvent *ev) {
+  int r;
+  r= XSendEvent(disp,id,False,0,ev);  assert(r);
+}
+
+static KeyCode keycode(const char *s) {
+  KeySym sym= XStringToKeysym(s);
+  return XKeysymToKeycode(disp,sym);
+}
+
+int main(int argc, const char *const *argv) {
+  char *ep;
+  XWindowAttributes attr;
+  XEvent ev;
+  int r;
+
+  id= strtoul(*++argv,&ep,0);
+  disp= XOpenDisplay(0);  eassert(disp);
+
+  r= XGetWindowAttributes(disp, id, &attr);  eassert(r);
+
+  while (*++argv) {
+    
+    memset(&ev,0,sizeof(ev));
+#define KE ev.xkey
+#define ME ev.xbutton
+
+    switch (**argv) {
+    case 'r':
+      r= XRaiseWindow(disp, id);  eassert(r);
+      break;
+
+#define KMEVENT(e,t)                           \
+      e.type= t;                               \
+      e.window= id;                            \
+      e.root= attr.root;                       \
+      e.x= atoi(*++argv);                      \
+      e.y= atoi(*++argv);                      \
+      e.x_root= e.x;                           \
+      e.y_root= e.y;                           \
+      e.same_screen= True;                     \
+      kmevent(&ev);                            \
+      break;
+
+    case 'K': KE.keycode= keycode(*++argv);      KMEVENT(KE,KeyPress);
+    case 'k': KE.keycode= keycode(*++argv);      KMEVENT(KE,KeyRelease);
+    case 'M': ME.button=1;                       KMEVENT(ME,ButtonPress);
+    case 'm': ME.button=1; ME.state=Button1Mask; KMEVENT(ME,ButtonRelease);
+    default:
+      abort();
+    }
+  }
+      
+  r= XSync(disp, False);  eassert(r);
+  exit(0);
+}