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:
		
							parent
							
								
									138caf294e
								
							
						
					
					
						commit
						5683b1f80c
					
				
							
								
								
									
										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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue