diff src/xselect.c @ 4278:889d81e3f507

(lisp_data_to_selection_data): New arg NOFREE_RET. For a string, just return its data's address. (x_handle_selection_request): Pass new arg. If value comes back 1, don't call xfree.
author Richard M. Stallman <rms@gnu.org>
date Sun, 25 Jul 1993 22:00:25 +0000
parents 507f64624555
children 02a515f35abc
line wrap: on
line diff
--- a/src/xselect.c	Sun Jul 25 21:50:16 1993 +0000
+++ b/src/xselect.c	Sun Jul 25 22:00:25 1993 +0000
@@ -640,8 +640,10 @@
       unsigned int size;
       int format;
       Atom type;
+      int nofree;
+
       lisp_data_to_selection_data (reply.display, converted_selection,
-				   &data, &type, &size, &format);
+				   &data, &type, &size, &format, &nofree);
       
       x_reply_selection_request (event, format, data, size, type);
       successful_p = Qt;
@@ -649,7 +651,8 @@
       /* Indicate we have successfully processed this event.  */
       x_selection_current_request = 0;
 
-      xfree (data);
+      if (!nofree)
+	xfree (data);
     }
   unbind_to (count, Qnil);
 
@@ -1310,15 +1313,20 @@
 
 static void
 lisp_data_to_selection_data (display, obj,
-			     data_ret, type_ret, size_ret, format_ret)
+			     data_ret, type_ret, size_ret,
+			     format_ret, nofree_ret)
      Display *display;
      Lisp_Object obj;
      unsigned char **data_ret;
      Atom *type_ret;
      unsigned int *size_ret;
      int *format_ret;
+     int *nofree_ret;
 {
   Lisp_Object type = Qnil;
+
+  *nofree_ret = 0;
+
   if (CONSP (obj) && SYMBOLP (XCONS (obj)->car))
     {
       type = XCONS (obj)->car;
@@ -1338,8 +1346,8 @@
     {
       *format_ret = 8;
       *size_ret = XSTRING (obj)->size;
-      *data_ret = (unsigned char *) xmalloc (*size_ret);
-      memcpy (*data_ret, (char *) XSTRING (obj)->data, *size_ret);
+      *data_ret = XSTRING (obj)->data;
+      *nofree_ret = 1;
       if (NILP (type)) type = QSTRING;
     }
   else if (SYMBOLP (obj))