14 static void kmevent(XEvent *ev) {
16 r= XSendEvent(disp,id,False,0,ev); assert(r);
19 static KeyCode keycode(const char *s) {
20 KeySym sym= XStringToKeysym(s);
21 return XKeysymToKeycode(disp,sym);
24 int main(int argc, const char *const *argv) {
26 XWindowAttributes attr;
30 id= strtoul(*++argv,&ep,0);
31 disp= XOpenDisplay(0); eassert(disp);
33 r= XGetWindowAttributes(disp, id, &attr); eassert(r);
37 memset(&ev,0,sizeof(ev));
43 r= XRaiseWindow(disp, id); eassert(r);
46 #define KMEVENT(e,t) \
54 e.same_screen= True; \
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);
67 r= XSync(disp, False); eassert(r);