X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fx-manip-window.c;fp=pctb%2Fx-manip-window.c;h=2ff1135e4d854633bce16bc305e31e16ecf4f24d;hb=d9d0cf7585c008aafe1d2de5365b772cda30ff13;hp=0000000000000000000000000000000000000000;hpb=d3eaa28d304c5b0639bc0f7e29b3285317d5c1e7;p=ypp-sc-tools.db-test.git diff --git a/pctb/x-manip-window.c b/pctb/x-manip-window.c new file mode 100644 index 0000000..2ff1135 --- /dev/null +++ b/pctb/x-manip-window.c @@ -0,0 +1,69 @@ +/**/ + +#include +#include +#include + +#include + +#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); +}