X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/f78da51e8dc0b1f8e7756e6b12954d79f1cd3d1c..4a2f9c6aefdb14ce8c34ace4d7573b89d1cc13b7:/src/xselect.c diff --git a/src/xselect.c b/src/xselect.c index cf2fe19a4a..648d060797 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1,5 +1,5 @@ /* X Selection processing for Emacs. - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation. + Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation. This file is part of GNU Emacs. @@ -27,6 +27,7 @@ Boston, MA 02111-1307, USA. */ #include "dispextern.h" /* frame.h seems to want this */ #include "frame.h" /* Need this to get the X window of selected_frame */ #include "blockinput.h" +#include "buffer.h" #include "charset.h" #include "coding.h" @@ -45,6 +46,9 @@ Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3, static Lisp_Object Vx_lost_selection_hooks; static Lisp_Object Vx_sent_selection_hooks; +/* Coding system for communicating with other X clients via cutbuffer, + selection, and clipboard. */ +static Lisp_Object Vclipboard_coding_system; /* If this is a smaller number than the max-request-size of the display, emacs will use INCR selection transfer when the selection is larger @@ -726,10 +730,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 + /* Use xfree, not XFree, because lisp_data_to_selection_data calls xmalloc itself. */ if (!nofree) - free (data); + xfree (data); } unbind_to (count, Qnil); @@ -932,7 +936,7 @@ unexpect_property_change (location) prev->next = rest->next; else property_change_wait_list = rest->next; - free (rest); + xfree (rest); return; } prev = rest; @@ -1021,7 +1025,7 @@ x_handle_property_notify (event) prev->next = rest->next; else property_change_wait_list = rest->next; - free (rest); + xfree (rest); return; } prev = rest; @@ -1165,7 +1169,7 @@ 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. */ +/* Use xfree, not XFree, to free the data obtained with this function. */ static void x_get_window_property (display, window, property, data_ret, bytes_ret, @@ -1248,7 +1252,7 @@ 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. */ +/* Use xfree, not XFree, to free the data obtained with this function. */ static void receive_incremental_selection (display, window, property, target_type, @@ -1310,9 +1314,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); - /* Use free, not XFree, because x_get_window_property + /* Use xfree, not XFree, because x_get_window_property calls xmalloc itself. */ - if (tmp_data) free (tmp_data); + if (tmp_data) xfree (tmp_data); break; } @@ -1337,9 +1341,9 @@ receive_incremental_selection (display, window, property, target_type, } bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes); offset += tmp_size_bytes; - /* Use free, not XFree, because x_get_window_property + /* Use xfree, not XFree, because x_get_window_property calls xmalloc itself. */ - free (tmp_data); + xfree (tmp_data); } } @@ -1394,9 +1398,9 @@ x_get_window_property_as_lisp_data (display, window, property, target_type, unsigned int min_size_bytes = * ((unsigned int *) data); BLOCK_INPUT; - /* Use free, not XFree, because x_get_window_property + /* Use xfree, not XFree, because x_get_window_property calls xmalloc itself. */ - free ((char *) data); + xfree ((char *) data); UNBLOCK_INPUT; receive_incremental_selection (display, window, property, target_type, min_size_bytes, &data, &bytes, @@ -1414,9 +1418,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); - /* Use free, not XFree, because x_get_window_property + /* Use xfree, not XFree, because x_get_window_property calls xmalloc itself. */ - free ((char *) data); + xfree ((char *) data); return val; } @@ -1465,22 +1469,26 @@ selection_data_to_lisp_data (display, data, size, type, format) Lisp_Object str; int require_encoding = 0; - /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode DATA - to Emacs internal format because DATA may be encoded in - compound text format. In addtion, if TYPE is `STRING' and - DATA contains any 8-bit Latin-1 code, we should also decode - it. */ - if (type == dpyinfo->Xatom_TEXT || type == dpyinfo->Xatom_COMPOUND_TEXT) - require_encoding = 1; - else if (type == XA_STRING) + if (! NILP (buffer_defaults.enable_multibyte_characters)) { - int i; - for (i = 0; i < size; i++) + /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode + DATA to Emacs internal format because DATA may be encoded + in compound text format. In addtion, if TYPE is `STRING' + and DATA contains any 8-bit Latin-1 code, we should also + decode it. */ + if (type == dpyinfo->Xatom_TEXT + || type == dpyinfo->Xatom_COMPOUND_TEXT) + require_encoding = 1; + else if (type == XA_STRING) { - if (data[i] >= 0x80) + int i; + for (i = 0; i < size; i++) { - require_encoding = 1; - break; + if (data[i] >= 0x80) + { + require_encoding = 1; + break; + } } } } @@ -1491,10 +1499,10 @@ selection_data_to_lisp_data (display, data, size, type, format) int bufsize, dummy; unsigned char *buf; struct coding_system coding; - Lisp_Object sym = intern ("iso-8859-1"); - setup_coding_system (Fcheck_coding_system (sym), &coding); - coding.last_block = 1; + setup_coding_system + (Fcheck_coding_system(Vclipboard_coding_system), &coding); + coding.last_block = 1; bufsize = decoding_buffer_size (&coding, size); buf = (unsigned char *) xmalloc (bufsize); size = decode_coding (&coding, data, buf, size, bufsize, &dummy); @@ -1513,10 +1521,11 @@ selection_data_to_lisp_data (display, data, size, type, format) return x_atom_to_symbol (dpyinfo, display, *((Atom *) data)); else { - Lisp_Object v = Fmake_vector (size / sizeof (Atom), 0); + Lisp_Object v = Fmake_vector (make_number (size / sizeof (Atom)), + make_number (0)); for (i = 0; i < size / sizeof (Atom); i++) - Faset (v, i, x_atom_to_symbol (dpyinfo, display, - ((Atom *) data) [i])); + Faset (v, make_number (i), + x_atom_to_symbol (dpyinfo, display, ((Atom *) data) [i])); return v; } } @@ -1536,29 +1545,30 @@ selection_data_to_lisp_data (display, data, size, type, format) else if (format == 16) { int i; - Lisp_Object v = Fmake_vector (size / 4, 0); - for (i = 0; i < size / 4; i++) + Lisp_Object v; + v = Fmake_vector (make_number (size / 2), make_number (0)); + for (i = 0; i < size / 2; i++) { int j = (int) ((unsigned short *) data) [i]; - Faset (v, i, make_number (j)); + Faset (v, make_number (i), make_number (j)); } return v; } else { int i; - Lisp_Object v = Fmake_vector (size / 4, 0); + Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0)); for (i = 0; i < size / 4; i++) { unsigned long j = ((unsigned long *) data) [i]; - Faset (v, i, long_to_cons (j)); + Faset (v, make_number (i), long_to_cons (j)); } return v; } } -/* Use free, not XFree, to free the data obtained with this function. */ +/* Use xfree, not XFree, to free the data obtained with this function. */ static void lisp_data_to_selection_data (display, obj, @@ -1596,14 +1606,15 @@ lisp_data_to_selection_data (display, obj, { /* Since we are now handling multilingual text, we must consider sending back compound text. */ - char charsets[MAX_CHARSET + 1]; + int charsets[MAX_CHARSET + 1]; int num; *format_ret = 8; - *size_ret = XSTRING (obj)->size; + *size_ret = XSTRING (obj)->size_byte; *data_ret = XSTRING (obj)->data; - bzero (charsets, MAX_CHARSET + 1); - num = ((*size_ret <= 1) /* Check the possibility of short cut. */ + bzero (charsets, (MAX_CHARSET + 1) * sizeof (int)); + num = ((*size_ret <= 1 /* Check the possibility of short cut. */ + || NILP (buffer_defaults.enable_multibyte_characters)) ? 0 : find_charset_in_str (*data_ret, *size_ret, charsets, Qnil)); @@ -1622,16 +1633,16 @@ lisp_data_to_selection_data (display, obj, int bufsize, dummy; unsigned char *buf; struct coding_system coding; - Lisp_Object sym = intern ("iso-8859-1"); - setup_coding_system (Fcheck_coding_system (sym), &coding); + setup_coding_system + (Fcheck_coding_system (Vclipboard_coding_system), &coding); coding.last_block = 1; bufsize = encoding_buffer_size (&coding, *size_ret); buf = (unsigned char *) xmalloc (bufsize); *size_ret = encode_coding (&coding, *data_ret, buf, *size_ret, bufsize, &dummy); *data_ret = buf; - if (charsets[charset_latin_iso8859_1] + if (charsets[charset_latin_iso8859_1] && (num == 1 || (num == 2 && charsets[CHARSET_ASCII]))) { /* Ok, we can return it as `STRING'. */ @@ -1796,7 +1807,7 @@ clean_local_selection_data (obj) Lisp_Object copy; if (size == 1) return clean_local_selection_data (XVECTOR (obj)->contents [0]); - copy = Fmake_vector (size, Qnil); + copy = Fmake_vector (make_number (size), Qnil); for (i = 0; i < size; i++) XVECTOR (copy)->contents [i] = clean_local_selection_data (XVECTOR (obj)->contents [i]); @@ -1904,7 +1915,7 @@ Disowning it means there is no such selection.") { Time timestamp; Atom selection_atom; - XSelectionClearEvent event; + struct selection_input_event event; Display *display; struct x_display_info *dpyinfo; @@ -1934,7 +1945,7 @@ Disowning it means there is no such selection.") SELECTION_EVENT_DISPLAY (&event) = display; SELECTION_EVENT_SELECTION (&event) = selection_atom; SELECTION_EVENT_TIME (&event) = timestamp; - x_handle_selection_clear (&event); + x_handle_selection_clear ((struct input_event *) &event); return Qt; } @@ -2088,9 +2099,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); - /* Use free, not XFree, because x_get_window_property + /* Use xfree, not XFree, because x_get_window_property calls xmalloc itself. */ - free (data); + xfree (data); return ret; } @@ -2122,7 +2133,7 @@ DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal, buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame), display, buffer); data = (unsigned char *) XSTRING (string)->data; - bytes = XSTRING (string)->size; + bytes = XSTRING (string)->size_byte; bytes_remaining = bytes; if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized) @@ -2157,8 +2168,8 @@ DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal, DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal, Sx_rotate_cut_buffers_internal, 1, 1, 0, - "Rotate the values of the cut buffers by the given number of steps;\n\ -positive means move values forward, negative means backward.") + "Rotate the values of the cut buffers by the given number of step.\n\ +Positive means shift the values forward, negative means backward.") (n) Lisp_Object n; { @@ -2223,7 +2234,7 @@ syms_of_xselect () staticpro (&Vselection_alist); DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist, - "An alist associating X Windows selection-types with functions.\n\ + "An alist associating X Windows selection-types with functions.\n\ These functions are called to convert the selection, with three args:\n\ the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\ a desired type to which the selection should be converted;\n\ @@ -2238,7 +2249,7 @@ and there is no meaningful selection value."); Vselection_converter_alist = Qnil; DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks, - "A list of functions to be called when Emacs loses an X selection.\n\ + "A list of functions to be called when Emacs loses an X selection.\n\ \(This happens when some other X client makes its own selection\n\ or when a Lisp program explicitly clears the selection.)\n\ The functions are called with one argument, the selection type\n\ @@ -2246,7 +2257,7 @@ The functions are called with one argument, the selection type\n\ Vx_lost_selection_hooks = Qnil; DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks, - "A list of functions to be called when Emacs answers a selection request.\n\ + "A list of functions to be called when Emacs answers a selection request.\n\ The functions are called with four arguments:\n\ - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\ - the selection-type which Emacs was asked to convert the\n\ @@ -2259,8 +2270,16 @@ This hook doesn't let you change the behavior of Emacs's selection replies,\n\ it merely informs you that they have happened."); Vx_sent_selection_hooks = Qnil; + DEFVAR_LISP ("clipboard-coding-system", &Vclipboard_coding_system, + "Coding system for communicating with other X clients.\n\ +When sending or receiving text via cut_buffer, selection, and clipboard,\n\ +the text is encoded or decoded by this coding system.\n\ +A default value is `iso-latin-1'"); + Vclipboard_coding_system=intern ("iso-latin-1"); + staticpro(&Vclipboard_coding_system); + DEFVAR_INT ("x-selection-timeout", &x_selection_timeout, - "Number of milliseconds to wait for a selection reply.\n\ + "Number of milliseconds to wait for a selection reply.\n\ If the selection owner doesn't reply in this time, we give up.\n\ A value of 0 means wait as long as necessary. This is initialized from the\n\ \"*selectionTimeout\" resource.");