From 84ec8f14274814b66ce8762cfe7acb7ed3665da8 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 24 Jan 2005 01:34:53 +0000
Subject: [PATCH] When pasting, if you're the primary selection owner, do not
 go through the X server.

---
 src/conio/console.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/src/conio/console.c b/src/conio/console.c
index ae4d1d6ecb..5e8883b180 100644
--- a/src/conio/console.c
+++ b/src/conio/console.c
@@ -1014,23 +1014,34 @@ video_async_event(void *crap)
 					x11.XSetSelectionOwner(dpy, XA_PRIMARY, win, CurrentTime);
 				}
 				if(!sem_trywait(&pastebuf_request)) {
-					Window sowner;
+					Window sowner=None;
 					int format;
 					unsigned long len, bytes_left, dummy;
 					Atom type;
 
 					sowner=x11.XGetSelectionOwner(dpy, XA_PRIMARY);
 					if(sowner != None) {
-						x11.XConvertSelection(dpy, XA_PRIMARY, XA_STRING, None, sowner, CurrentTime);
-						x11.XFlush(dpy);
-						x11.XGetWindowProperty(dpy, sowner, XA_STRING, 0, 0, 0, AnyPropertyType, &type, &format, &len, &bytes_left, (unsigned char **)(&pastebuf));
-						if(bytes_left > 0)
-							x11.XGetWindowProperty(dpy,sowner,XA_STRING,0,bytes_left,0,AnyPropertyType,&type,&format,&len,&dummy,(unsigned char **)&pastebuf);
+						if(sowner==win) {
+							/* Get your own primary selection */
+							pastebuf=(unsigned char *)malloc(strlen(copybuf)+1);
+							if(pastebuf!=NULL)
+								strcpy(pastebuf,copybuf);
+						}
+						else {
+							x11.XConvertSelection(dpy, XA_PRIMARY, XA_STRING, None, sowner, CurrentTime);
+							x11.XFlush(dpy);
+							x11.XGetWindowProperty(dpy, sowner, XA_STRING, 0, 0, 0, AnyPropertyType, &type, &format, &len, &bytes_left, (unsigned char **)(&pastebuf));
+							if(bytes_left > 0)
+								x11.XGetWindowProperty(dpy,sowner,XA_STRING,0,bytes_left,0,AnyPropertyType,&type,&format,&len,&dummy,(unsigned char **)&pastebuf);
+						}
 					}
 					/* Set paste buffer */
 					sem_post(&pastebuf_set);
 					sem_wait(&pastebuf_request);
-					x11.XFree(pastebuf);
+					if(sowner==win)
+						free(pastebuf);
+					else
+						x11.XFree(pastebuf);
 				}
 				break;
 			default:
-- 
GitLab