chiark / gitweb /
keystroke injection attempts
[ypp-sc-tools.db-test.git] / pctb / x-manip-window.c
1 /**/
2
3 #include <assert.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include <X11/Xlib.h>
8
9 #define eassert assert
10
11 static Display *disp;
12 static long id;
13
14 static void kmevent(XEvent *ev) {
15   int r;
16   r= XSendEvent(disp,id,False,0,ev);  assert(r);
17 }
18
19 static KeyCode keycode(const char *s) {
20   KeySym sym= XStringToKeysym(s);
21   return XKeysymToKeycode(disp,sym);
22 }
23
24 int main(int argc, const char *const *argv) {
25   char *ep;
26   XWindowAttributes attr;
27   XEvent ev;
28   int r;
29
30   id= strtoul(*++argv,&ep,0);
31   disp= XOpenDisplay(0);  eassert(disp);
32
33   r= XGetWindowAttributes(disp, id, &attr);  eassert(r);
34
35   while (*++argv) {
36     
37     memset(&ev,0,sizeof(ev));
38 #define KE ev.xkey
39 #define ME ev.xbutton
40
41     switch (**argv) {
42     case 'r':
43       r= XRaiseWindow(disp, id);  eassert(r);
44       break;
45
46 #define KMEVENT(e,t)                            \
47       e.type= t;                                \
48       e.window= id;                             \
49       e.root= attr.root;                        \
50       e.x= atoi(*++argv);                       \
51       e.y= atoi(*++argv);                       \
52       e.x_root= e.x;                            \
53       e.y_root= e.y;                            \
54       e.same_screen= True;                      \
55       kmevent(&ev);                             \
56       break;
57
58     case 'K': KE.keycode= keycode(*++argv);      KMEVENT(KE,KeyPress);
59     case 'k': KE.keycode= keycode(*++argv);      KMEVENT(KE,KeyRelease);
60     case 'M': ME.button=1;                       KMEVENT(ME,ButtonPress);
61     case 'm': ME.button=1; ME.state=Button1Mask; KMEVENT(ME,ButtonRelease);
62     default:
63       abort();
64     }
65   }
66       
67   r= XSync(disp, False);  eassert(r);
68   exit(0);
69 }