|  |  | @ -10,6 +10,7 @@ | 
			
		
	
		
			
				
					|  |  |  | #include <sys/types.h> | 
			
		
	
		
			
				
					|  |  |  | #include <sys/wait.h> | 
			
		
	
		
			
				
					|  |  |  | #include <unistd.h> | 
			
		
	
		
			
				
					|  |  |  | #include <X11/Xatom.h> | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #include "util.h" | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
	
		
			
				
					|  |  | @ -147,3 +148,40 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | wait(0); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | unsigned char * | 
			
		
	
		
			
				
					|  |  |  | getselection(unsigned long offset, unsigned long *len, unsigned long *remain) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | Display *dpy; | 
			
		
	
		
			
				
					|  |  |  | Atom xa_clip_string; | 
			
		
	
		
			
				
					|  |  |  | Window w; | 
			
		
	
		
			
				
					|  |  |  | XEvent ev; | 
			
		
	
		
			
				
					|  |  |  | Atom typeret; | 
			
		
	
		
			
				
					|  |  |  | int format; | 
			
		
	
		
			
				
					|  |  |  | unsigned char *data; | 
			
		
	
		
			
				
					|  |  |  | unsigned char *result = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | dpy = XOpenDisplay(0); | 
			
		
	
		
			
				
					|  |  |  | if(!dpy) | 
			
		
	
		
			
				
					|  |  |  | return NULL; | 
			
		
	
		
			
				
					|  |  |  | xa_clip_string = XInternAtom(dpy, "_SEL_STRING", False); | 
			
		
	
		
			
				
					|  |  |  | w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 10, 10, 200, 200, | 
			
		
	
		
			
				
					|  |  |  | 1, CopyFromParent, CopyFromParent); | 
			
		
	
		
			
				
					|  |  |  | XConvertSelection(dpy, XA_PRIMARY, XA_STRING, xa_clip_string, | 
			
		
	
		
			
				
					|  |  |  | w, CurrentTime); | 
			
		
	
		
			
				
					|  |  |  | XFlush(dpy); | 
			
		
	
		
			
				
					|  |  |  | XNextEvent(dpy, &ev); | 
			
		
	
		
			
				
					|  |  |  | if(ev.type == SelectionNotify && ev.xselection.property != None) { | 
			
		
	
		
			
				
					|  |  |  | XGetWindowProperty(dpy, w, ev.xselection.property, offset, 4096L, False, | 
			
		
	
		
			
				
					|  |  |  | AnyPropertyType, &typeret, &format, len, remain, &data); | 
			
		
	
		
			
				
					|  |  |  | if(*len) { | 
			
		
	
		
			
				
					|  |  |  | result = emalloc(sizeof(unsigned char) * *len); | 
			
		
	
		
			
				
					|  |  |  | memcpy(result, data, *len); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | XDeleteProperty(dpy, w, ev.xselection.property); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | XDestroyWindow(dpy, w); | 
			
		
	
		
			
				
					|  |  |  | XCloseDisplay(dpy); | 
			
		
	
		
			
				
					|  |  |  | return result; | 
			
		
	
		
			
				
					|  |  |  | } |