From 5b1fa7873cab719ae31351ffaf01766e2f55511f Mon Sep 17 00:00:00 2001
From: nehalmistry <>
Date: Tue, 18 Feb 2003 21:34:58 +0000
Subject: [PATCH] middle click pasting now works in X11 (J Pablo)

---
 src/ui/menu_proc.cpp | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/ui/menu_proc.cpp b/src/ui/menu_proc.cpp
index 0e55d1a53..0d37f4bf3 100644
--- a/src/ui/menu_proc.cpp
+++ b/src/ui/menu_proc.cpp
@@ -1642,13 +1642,11 @@ local void MenuHandleButtonDown(unsigned b __attribute__((unused)))
 #ifdef USE_WIN32
     HGLOBAL handle;
 #elif defined(_XLIB_H_)
-/*
     Display *display;
-    Window w;
+    Window window;
     Atom rettype;
-    unsigned long nitem, bytes;
+    unsigned long nitem, bytes, dummy;
     int retform, ret;
-*/
 #endif
 #endif
 
@@ -1743,23 +1741,32 @@ local void MenuHandleButtonDown(unsigned b __attribute__((unused)))
 			    break;
 			}
 #elif defined(_XLIB_H_)
-
-/*
 			if (!(display = XOpenDisplay(NULL)))
-			    break;			
-//			if ((w = XGetSelectionOwner(display, XA_PRIMARY)) == None)
-			if ((w = DefaultRootWindow(display)) == None)
-			    break;
+				break;
 
-			ret = XGetWindowProperty(display, w, XA_CUT_BUFFER0,
-					   0, 1024, False, AnyPropertyType,
-					   &rettype, &retform, &nitem, &bytes,
-					   (unsigned char **)&clipboard);
+			if ((window = XGetSelectionOwner(display, XA_PRIMARY)) == None) {
+				XCloseDisplay(display);
+				break;
+			}
+
+			XConvertSelection(display, XA_PRIMARY, XA_STRING, XA_STRING,
+					  window, CurrentTime);
+
+			XFlush(display);
+
+			XGetWindowProperty(display, window, XA_STRING, 0, 0, 0,
+					   AnyPropertyType, &rettype, &retform,
+					   &nitem, &bytes, (unsigned char **)&clipboard);
+
+			if (bytes > 0) {
+			    ret = XGetWindowProperty(display, window, XA_STRING, 0, bytes, False, 
+						     AnyPropertyType, &rettype, &retform, &nitem, 
+						     &dummy, (unsigned char **)&clipboard);
+			} else {
+			    break;
+			}
 
 			XCloseDisplay(display);
-*/
-			clipboard = "";
-
 #endif
 			for (i = 0; mi->d.input.nch < mi->d.input.maxch && clipboard[i]; ++i) {
 			    if (clipboard[i] != '\r' && clipboard[i] != '\n') {
@@ -1771,6 +1778,9 @@ local void MenuHandleButtonDown(unsigned b __attribute__((unused)))
 #ifdef USE_WIN32
 			GlobalUnlock(handle);
 			CloseClipboard();
+#elif defined(_XLIB_H_)
+			if (clipboard != NULL)
+				XFree(clipboard);
 #endif
 			MustRedraw |= RedrawMenu;
 #endif