X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3b7ad313e0d7b351c55cf999474b61cdc18ecad1..645280b72c54063bedc239469f013dd1749f689d:/src/xselect.c diff --git a/src/xselect.c b/src/xselect.c index 3254753953..053d7f0fa3 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -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. @@ -28,8 +28,6 @@ Boston, MA 02111-1307, 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, @@ -59,7 +57,8 @@ static Lisp_Object Vx_sent_selection_hooks; #endif /* The timestamp of the last input event Emacs received from the X server. */ -unsigned long last_event_timestamp; +/* Defined in keyboard.c. */ +extern unsigned long last_event_timestamp; /* This is an association list whose elements are of the form ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME) @@ -211,6 +210,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; @@ -720,8 +720,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); @@ -833,7 +835,11 @@ x_clear_frame_selections (f) { for (; CONSP (hooks); hooks = Fcdr (hooks)) call1 (Fcar (hooks), selection_symbol); +#if 0 /* This can crash when deleting a frame + from x_connection_closed. Anyway, it seems unnecessary; + something else should cause a redisplay. */ redisplay_preserve_echo_area (); +#endif } Vselection_alist = Fcdr (Vselection_alist); @@ -853,7 +859,9 @@ x_clear_frame_selections (f) { for (; CONSP (hooks); hooks = Fcdr (hooks)) call1 (Fcar (hooks), selection_symbol); +#if 0 /* See above */ redisplay_preserve_echo_area (); +#endif } XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr); break; @@ -918,7 +926,7 @@ unexpect_property_change (location) prev->next = rest->next; else property_change_wait_list = rest->next; - xfree (rest); + free (rest); return; } prev = rest; @@ -1007,7 +1015,7 @@ x_handle_property_notify (event) prev->next = rest->next; else property_change_wait_list = rest->next; - xfree (rest); + free (rest); return; } prev = rest; @@ -1152,6 +1160,8 @@ x_get_foreign_selection (selection_symbol, target_type) /* 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, @@ -1188,7 +1198,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) { @@ -1223,7 +1234,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); @@ -1231,6 +1243,8 @@ x_get_window_property (display, window, property, data_ret, bytes_ret, *bytes_ret = offset; } +/* 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, @@ -1291,7 +1305,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; } @@ -1316,7 +1332,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); } } @@ -1372,7 +1390,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, @@ -1390,7 +1410,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; } @@ -1492,6 +1514,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, @@ -1977,7 +2001,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; }