|  | #include <u.h> | 
|  | #include <sys/select.h> | 
|  | #include <errno.h> | 
|  | #include "x11-inc.h" | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <memdraw.h> | 
|  | #include <memlayer.h> | 
|  | #include <keyboard.h> | 
|  | #include <mouse.h> | 
|  | #include <cursor.h> | 
|  | #include <drawfcall.h> | 
|  | #include "x11-memdraw.h" | 
|  | #include "devdraw.h" | 
|  |  | 
|  | #undef time | 
|  |  | 
|  | #define MouseMask (\ | 
|  | ButtonPressMask|\ | 
|  | ButtonReleaseMask|\ | 
|  | PointerMotionMask|\ | 
|  | Button1MotionMask|\ | 
|  | Button2MotionMask|\ | 
|  | Button3MotionMask) | 
|  |  | 
|  | #define Mask MouseMask|ExposureMask|StructureNotifyMask|KeyPressMask|EnterWindowMask|LeaveWindowMask | 
|  |  | 
|  | void runxevent(XEvent*); | 
|  |  | 
|  | void | 
|  | usage(void) | 
|  | { | 
|  | fprint(2, "usage: snarf [-a] [-o | text]\n"); | 
|  | exits("usage"); | 
|  | } | 
|  |  | 
|  | void | 
|  | main(int argc, char **argv) | 
|  | { | 
|  | int apple; | 
|  | int out; | 
|  |  | 
|  | apple = 0; | 
|  | out = 0; | 
|  |  | 
|  | ARGBEGIN{ | 
|  | case 'a': | 
|  | apple = 1; | 
|  | break; | 
|  | case 'o': | 
|  | out = 1; | 
|  | break; | 
|  | default: | 
|  | usage(); | 
|  | }ARGEND | 
|  |  | 
|  | if(out && argc != 0) | 
|  | usage(); | 
|  | if(!out && argc != 1) | 
|  | usage(); | 
|  |  | 
|  | _x.fd = -1; | 
|  |  | 
|  | memimageinit(); | 
|  | _xattach("snarf", "20x20"); | 
|  |  | 
|  | XSelectInput(_x.display, _x.drawable, Mask); | 
|  | XFlush(_x.display); | 
|  |  | 
|  | if(out){ | 
|  | char *s; | 
|  | if(apple) | 
|  | s = _applegetsnarf(); | 
|  | else | 
|  | s = _xgetsnarf(); | 
|  | write(1, s, strlen(s)); | 
|  | write(1, "\n", 1); | 
|  | exits(0); | 
|  | }else{ | 
|  | _xputsnarf(argv[0]); | 
|  | for(;;){ | 
|  | XEvent event; | 
|  | XNextEvent(_x.display, &event); | 
|  | runxevent(&event); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Handle an incoming X event. | 
|  | */ | 
|  | void | 
|  | runxevent(XEvent *xev) | 
|  | { | 
|  | switch(xev->type){ | 
|  | case Expose: | 
|  | _xexpose(xev); | 
|  | break; | 
|  |  | 
|  | case DestroyNotify: | 
|  | if(_xdestroy(xev)) | 
|  | exits(0); | 
|  | break; | 
|  |  | 
|  | case SelectionRequest: | 
|  | _xselect(xev); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  |