]> code.delx.au - gnu-emacs/blobdiff - src/xselect.c
(x_connection_closed): Add newline when printing error message on stderr.
[gnu-emacs] / src / xselect.c
index da22c715af233d2ac322422a37fbf980b5f22055..9e4681f5dc4b3ace3f25c933b74de903eb4dd9e6 100644 (file)
@@ -1,5 +1,5 @@
 /* X Selection processing for Emacs.
-   Copyright (C) 1993, 1994, 1995 Free Software Foundation.
+   Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation.
 
 This file is part of GNU Emacs.
 
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
 /* Rewritten by jwz */
@@ -27,8 +28,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "frame.h"     /* Need this to get the X window of selected_frame */
 #include "blockinput.h"
 
-#define xfree free
-
 #define CUT_BUFFER_SUPPORT
 
 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
@@ -210,6 +209,7 @@ x_atom_to_symbol (dpyinfo, display, atom)
   if (! str) return Qnil;
   val = intern (str);
   BLOCK_INPUT;
+  /* This was allocated by Xlib, so use XFree.  */
   XFree (str);
   UNBLOCK_INPUT;
   return val;
@@ -384,7 +384,7 @@ x_get_local_selection (selection_symbol, target_type)
 \f
 /* Subroutines of x_reply_selection_request.  */
 
-/* Send a SelectionNotify event to the requester with property=None,
+/* Send a SelectionNotify event to the requestor with property=None,
    meaning we were unable to do what they wanted.  */
 
 static void
@@ -394,14 +394,14 @@ x_decline_selection_request (event)
   XSelectionEvent reply;
   reply.type = SelectionNotify;
   reply.display = SELECTION_EVENT_DISPLAY (event);
-  reply.requester = SELECTION_EVENT_REQUESTER (event);
+  reply.requestor = SELECTION_EVENT_REQUESTOR (event);
   reply.selection = SELECTION_EVENT_SELECTION (event);
   reply.time = SELECTION_EVENT_TIME (event);
   reply.target = SELECTION_EVENT_TARGET (event);
   reply.property = None;
 
   BLOCK_INPUT;
-  XSendEvent (reply.display, reply.requester, False, 0L,
+  XSendEvent (reply.display, reply.requestor, False, 0L,
              (XEvent *) &reply);
   XFlush (reply.display);
   UNBLOCK_INPUT;
@@ -498,7 +498,7 @@ x_reply_selection_request (event, format, data, size, type)
 {
   XSelectionEvent reply;
   Display *display = SELECTION_EVENT_DISPLAY (event);
-  Window window = SELECTION_EVENT_REQUESTER (event);
+  Window window = SELECTION_EVENT_REQUESTOR (event);
   int bytes_remaining;
   int format_bytes = format/8;
   int max_bytes = SELECTION_QUANTUM (display);
@@ -509,7 +509,7 @@ x_reply_selection_request (event, format, data, size, type)
 
   reply.type = SelectionNotify;
   reply.display = display;
-  reply.requester = window;
+  reply.requestor = window;
   reply.selection = SELECTION_EVENT_SELECTION (event);
   reply.time = SELECTION_EVENT_TIME (event);
   reply.target = SELECTION_EVENT_TARGET (event);
@@ -558,7 +558,7 @@ x_reply_selection_request (event, format, data, size, type)
        }
 
       if (x_window_to_frame (dpyinfo, window)) /* #### debug */
-       error ("attempt to transfer an INCR to ourself!");
+       error ("Attempt to transfer an INCR to ourself!");
 #if 0
       fprintf (stderr, "\nINCR %d\n", bytes_remaining);
 #endif
@@ -719,8 +719,10 @@ x_handle_selection_request (event)
       /* Indicate we have successfully processed this event.  */
       x_selection_current_request = 0;
 
+      /* Use free, not XFree, because lisp_data_to_selection_data
+        calls xmalloc itself.  */
       if (!nofree)
-       xfree (data);
+       free (data);
     }
   unbind_to (count, Qnil);
 
@@ -917,7 +919,7 @@ unexpect_property_change (location)
            prev->next = rest->next;
          else
            property_change_wait_list = rest->next;
-         xfree (rest);
+         free (rest);
          return;
        }
       prev = rest;
@@ -967,7 +969,7 @@ wait_for_property_change (location)
       wait_reading_process_input (secs, usecs, property_change_reply, 0);
 
       if (NILP (XCONS (property_change_reply)->car))
-       error ("timed out waiting for property-notify event");
+       error ("Timed out waiting for property-notify event");
     }
 
   unbind_to (count, Qnil);
@@ -1006,7 +1008,7 @@ x_handle_property_notify (event)
            prev->next = rest->next;
          else
            property_change_wait_list = rest->next;
-         xfree (rest);
+         free (rest);
          return;
        }
       prev = rest;
@@ -1030,7 +1032,7 @@ fetch_multiple_target (event)
      XSelectionRequestEvent *event;
 {
   Display *display = event->display;
-  Window window = event->requester;
+  Window window = event->requestor;
   Atom target = event->target;
   Atom selection_atom = event->selection;
   int result;
@@ -1085,10 +1087,10 @@ static Lisp_Object
 x_get_foreign_selection (selection_symbol, target_type)
      Lisp_Object selection_symbol, target_type;
 {
-  Window requester_window = FRAME_X_WINDOW (selected_frame);
+  Window requestor_window = FRAME_X_WINDOW (selected_frame);
   Display *display = FRAME_X_DISPLAY (selected_frame);
   struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
-  Time requester_time = last_event_timestamp;
+  Time requestor_time = last_event_timestamp;
   Atom target_property = dpyinfo->Xatom_EMACS_TMP;
   Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
   Atom type_atom;
@@ -1104,11 +1106,11 @@ x_get_foreign_selection (selection_symbol, target_type)
   BLOCK_INPUT;
   x_catch_errors (display);
   XConvertSelection (display, selection_atom, type_atom, target_property,
-                    requester_window, requester_time);
+                    requestor_window, requestor_time);
   XFlush (display);
 
   /* Prepare to block until the reply has been read.  */
-  reading_selection_window = requester_window;
+  reading_selection_window = requestor_window;
   reading_which_selection = selection_atom;
   XCONS (reading_selection_reply)->car = Qnil;
 
@@ -1138,17 +1140,21 @@ x_get_foreign_selection (selection_symbol, target_type)
   UNBLOCK_INPUT;
 
   if (NILP (XCONS (reading_selection_reply)->car))
-    error ("timed out waiting for reply from selection owner");
+    error ("Timed out waiting for reply from selection owner");
+  if (EQ (XCONS (reading_selection_reply)->car, Qlambda))
+    error ("No `%s' selection", XSYMBOL (selection_symbol)->name->data);
 
   /* Otherwise, the selection is waiting for us on the requested property.  */
   return
-    x_get_window_property_as_lisp_data (display, requester_window,
+    x_get_window_property_as_lisp_data (display, requestor_window,
                                        target_property, target_type,
                                        selection_atom);
 }
 \f
 /* Subroutines of x_get_window_property_as_lisp_data */
 
+/* Use free, not XFree, to free the data obtained with this function.  */
+
 static void
 x_get_window_property (display, window, property, data_ret, bytes_ret,
                       actual_type_ret, actual_format_ret, actual_size_ret,
@@ -1185,7 +1191,8 @@ x_get_window_property (display, window, property, data_ret, bytes_ret,
       *bytes_ret = 0;
       return;
     }
-  xfree ((char *) tmp_data);
+  /* This was allocated by Xlib, so use XFree.  */
+  XFree ((char *) tmp_data);
   
   if (*actual_type_ret == None || *actual_format_ret == 0)
     {
@@ -1220,7 +1227,8 @@ x_get_window_property (display, window, property, data_ret, bytes_ret,
       *actual_size_ret *= *actual_format_ret / 8;
       bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
       offset += *actual_size_ret;
-      xfree ((char *) tmp_data);
+      /* This was allocated by Xlib, so use XFree.  */
+      XFree ((char *) tmp_data);
     }
 
   XFlush (display);
@@ -1228,6 +1236,8 @@ x_get_window_property (display, window, property, data_ret, bytes_ret,
   *bytes_ret = offset;
 }
 \f
+/* Use free, not XFree, to free the data obtained with this function.  */
+
 static void
 receive_incremental_selection (display, window, property, target_type,
                               min_size_bytes, data_ret, size_bytes_ret,
@@ -1288,7 +1298,9 @@ receive_incremental_selection (display, window, property, target_type,
          if (! waiting_for_other_props_on_window (display, window))
            XSelectInput (display, window, STANDARD_EVENT_SET);
          unexpect_property_change (wait_object);
-         if (tmp_data) xfree (tmp_data);
+         /* Use free, not XFree, because x_get_window_property
+            calls xmalloc itself.  */
+         if (tmp_data) free (tmp_data);
          break;
        }
 
@@ -1313,7 +1325,9 @@ receive_incremental_selection (display, window, property, target_type,
        }
       bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
       offset += tmp_size_bytes;
-      xfree (tmp_data);
+      /* Use free, not XFree, because x_get_window_property
+        calls xmalloc itself.  */
+      free (tmp_data);
     }
 }
 \f
@@ -1369,7 +1383,9 @@ x_get_window_property_as_lisp_data (display, window, property, target_type,
 
       unsigned int min_size_bytes = * ((unsigned int *) data);
       BLOCK_INPUT;
-      XFree ((char *) data);
+      /* Use free, not XFree, because x_get_window_property
+        calls xmalloc itself.  */
+      free ((char *) data);
       UNBLOCK_INPUT;
       receive_incremental_selection (display, window, property, target_type,
                                     min_size_bytes, &data, &bytes,
@@ -1387,7 +1403,9 @@ x_get_window_property_as_lisp_data (display, window, property, target_type,
   val = selection_data_to_lisp_data (display, data, bytes,
                                     actual_type, actual_format);
   
-  xfree ((char *) data);
+  /* Use free, not XFree, because x_get_window_property
+     calls xmalloc itself.  */
+  free ((char *) data);
   return val;
 }
 \f
@@ -1489,6 +1507,8 @@ selection_data_to_lisp_data (display, data, size, type, format)
 }
 
 
+/* Use free, not XFree, to free the data obtained with this function.  */
+
 static void
 lisp_data_to_selection_data (display, obj,
                             data_ret, type_ret, size_ret,
@@ -1691,18 +1711,21 @@ clean_local_selection_data (obj)
 }
 \f
 /* Called from XTread_socket to handle SelectionNotify events.
-   If it's the selection we are waiting for, stop waiting.  */
+   If it's the selection we are waiting for, stop waiting
+   by setting the car of reading_selection_reply to non-nil.
+   We store t there if the reply is successful, lambda if not.  */
 
 void
 x_handle_selection_notify (event)
      XSelectionEvent *event;
 {
-  if (event->requester != reading_selection_window)
+  if (event->requestor != reading_selection_window)
     return;
   if (event->selection != reading_which_selection)
     return;
 
-  XCONS (reading_selection_reply)->car = Qt;
+  XCONS (reading_selection_reply)->car
+    = (event->property != 0 ? Qt : Qlambda);
 }
 
 \f
@@ -1719,7 +1742,7 @@ anything that the functions on `selection-converter-alist' know about.")
 {
   check_x ();
   CHECK_SYMBOL (selection_name, 0);
-  if (NILP (selection_value)) error ("selection-value may not be nil.");
+  if (NILP (selection_value)) error ("selection-value may not be nil");
   x_own_selection (selection_name, selection_value);
   return selection_value;
 }
@@ -1971,7 +1994,9 @@ DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
                           Fcons (make_number (format), Qnil))));
 
   ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
-  xfree (data);
+  /* Use free, not XFree, because x_get_window_property
+     calls xmalloc itself.  */
+  free (data);
   return ret;
 }