Move X-specific selection info into XSelection
Data about PRIMARY/CLIPBOARD and clicks are part of the front-end, not the terminal. Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
This commit is contained in:
		
							
								
								
									
										4
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								st.c
									
									
									
									
									
								
							| @ -365,13 +365,9 @@ base64dec(const char *src) | |||||||
| void | void | ||||||
| selinit(void) | selinit(void) | ||||||
| { | { | ||||||
| 	clock_gettime(CLOCK_MONOTONIC, &sel.tclick1); |  | ||||||
| 	clock_gettime(CLOCK_MONOTONIC, &sel.tclick2); |  | ||||||
| 	sel.mode = SEL_IDLE; | 	sel.mode = SEL_IDLE; | ||||||
| 	sel.snap = 0; | 	sel.snap = 0; | ||||||
| 	sel.ob.x = -1; | 	sel.ob.x = -1; | ||||||
| 	sel.primary = NULL; |  | ||||||
| 	sel.clipboard = NULL; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								st.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								st.h
									
									
									
									
									
								
							| @ -149,12 +149,7 @@ typedef struct { | |||||||
| 		int x, y; | 		int x, y; | ||||||
| 	} nb, ne, ob, oe; | 	} nb, ne, ob, oe; | ||||||
|  |  | ||||||
| 	char *primary, *clipboard; |  | ||||||
| 	int alt; | 	int alt; | ||||||
| 	struct timespec tclick1; |  | ||||||
| 	struct timespec tclick2; |  | ||||||
|  |  | ||||||
| 	//Atom xtarget; |  | ||||||
| } Selection; | } Selection; | ||||||
|  |  | ||||||
| typedef union { | typedef union { | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								x.c
									
									
									
									
									
								
							| @ -94,6 +94,9 @@ typedef struct { | |||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
| 	Atom xtarget; | 	Atom xtarget; | ||||||
|  | 	char *primary, *clipboard; | ||||||
|  | 	struct timespec tclick1; | ||||||
|  | 	struct timespec tclick2; | ||||||
| } XSelection; | } XSelection; | ||||||
|  |  | ||||||
| /* Font structure */ | /* Font structure */ | ||||||
| @ -234,11 +237,11 @@ clipcopy(const Arg *dummy) | |||||||
| { | { | ||||||
| 	Atom clipboard; | 	Atom clipboard; | ||||||
|  |  | ||||||
| 	if (sel.clipboard != NULL) | 	if (xsel.clipboard != NULL) | ||||||
| 		free(sel.clipboard); | 		free(xsel.clipboard); | ||||||
|  |  | ||||||
| 	if (sel.primary != NULL) { | 	if (xsel.primary != NULL) { | ||||||
| 		sel.clipboard = xstrdup(sel.primary); | 		xsel.clipboard = xstrdup(xsel.primary); | ||||||
| 		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); | 		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); | ||||||
| 		XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); | 		XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); | ||||||
| 	} | 	} | ||||||
| @ -427,9 +430,9 @@ bpress(XEvent *e) | |||||||
| 		 * If the user clicks below predefined timeouts specific | 		 * If the user clicks below predefined timeouts specific | ||||||
| 		 * snapping behaviour is exposed. | 		 * snapping behaviour is exposed. | ||||||
| 		 */ | 		 */ | ||||||
| 		if (TIMEDIFF(now, sel.tclick2) <= tripleclicktimeout) { | 		if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { | ||||||
| 			sel.snap = SNAP_LINE; | 			sel.snap = SNAP_LINE; | ||||||
| 		} else if (TIMEDIFF(now, sel.tclick1) <= doubleclicktimeout) { | 		} else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { | ||||||
| 			sel.snap = SNAP_WORD; | 			sel.snap = SNAP_WORD; | ||||||
| 		} else { | 		} else { | ||||||
| 			sel.snap = 0; | 			sel.snap = 0; | ||||||
| @ -439,8 +442,8 @@ bpress(XEvent *e) | |||||||
| 		if (sel.snap != 0) | 		if (sel.snap != 0) | ||||||
| 			sel.mode = SEL_READY; | 			sel.mode = SEL_READY; | ||||||
| 		tsetdirt(sel.nb.y, sel.ne.y); | 		tsetdirt(sel.nb.y, sel.ne.y); | ||||||
| 		sel.tclick2 = sel.tclick1; | 		xsel.tclick2 = xsel.tclick1; | ||||||
| 		sel.tclick1 = now; | 		xsel.tclick1 = now; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -594,9 +597,9 @@ selrequest(XEvent *e) | |||||||
| 		 */ | 		 */ | ||||||
| 		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); | 		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); | ||||||
| 		if (xsre->selection == XA_PRIMARY) { | 		if (xsre->selection == XA_PRIMARY) { | ||||||
| 			seltext = sel.primary; | 			seltext = xsel.primary; | ||||||
| 		} else if (xsre->selection == clipboard) { | 		} else if (xsre->selection == clipboard) { | ||||||
| 			seltext = sel.clipboard; | 			seltext = xsel.clipboard; | ||||||
| 		} else { | 		} else { | ||||||
| 			fprintf(stderr, | 			fprintf(stderr, | ||||||
| 				"Unhandled clipboard selection 0x%lx\n", | 				"Unhandled clipboard selection 0x%lx\n", | ||||||
| @ -620,8 +623,8 @@ selrequest(XEvent *e) | |||||||
| void | void | ||||||
| setsel(char *str, Time t) | setsel(char *str, Time t) | ||||||
| { | { | ||||||
| 	free(sel.primary); | 	free(xsel.primary); | ||||||
| 	sel.primary = str; | 	xsel.primary = str; | ||||||
|  |  | ||||||
| 	XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); | 	XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); | ||||||
| 	if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) | 	if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) | ||||||
| @ -1127,6 +1130,10 @@ xinit(void) | |||||||
| 	xhints(); | 	xhints(); | ||||||
| 	XSync(xw.dpy, False); | 	XSync(xw.dpy, False); | ||||||
|  |  | ||||||
|  | 	clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); | ||||||
|  | 	clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); | ||||||
|  | 	xsel.primary = NULL; | ||||||
|  | 	xsel.clipboard = NULL; | ||||||
| 	xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); | 	xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); | ||||||
| 	if (xsel.xtarget == None) | 	if (xsel.xtarget == None) | ||||||
| 		xsel.xtarget = XA_STRING; | 		xsel.xtarget = XA_STRING; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user