/* X Selection processing for Emacs.
- Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation.
+ Copyright (C) 1993, 1994, 1995, 1996, 1997, 2000 Free Software Foundation.
This file is part of GNU Emacs.
#include "buffer.h"
#include "charset.h"
#include "coding.h"
+#include "process.h"
+#include "composite.h"
#define CUT_BUFFER_SUPPORT
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;
+static Lisp_Object Vselection_coding_system;
+
+/* Coding system for the next communicating with other X clients. */
+static Lisp_Object Vnext_selection_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
x_own_selection (selection_name, selection_value)
Lisp_Object selection_name, selection_value;
{
- Window selecting_window = FRAME_X_WINDOW (selected_frame);
- Display *display = FRAME_X_DISPLAY (selected_frame);
+ struct frame *sf = SELECTED_FRAME ();
+ Window selecting_window = FRAME_X_WINDOW (sf);
+ Display *display = FRAME_X_DISPLAY (sf);
Time time = last_event_timestamp;
Atom selection_atom;
- struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
+ struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (sf);
int count;
CHECK_SYMBOL (selection_name, 0);
selection_data = Fcons (selection_name,
Fcons (selection_value,
Fcons (selection_time,
- Fcons (Fselected_frame (), Qnil))));
+ Fcons (selected_frame, Qnil))));
prev_value = assq_no_quit (selection_name, Vselection_alist);
Vselection_alist = Fcons (selection_data, Vselection_alist);
{
Lisp_Object rest; /* we know it's not the CAR, so it's easy. */
for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
- if (EQ (prev_value, Fcar (XCONS (rest)->cdr)))
+ if (EQ (prev_value, Fcar (XCDR (rest))))
{
- XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
+ XCDR (rest) = Fcdr (XCDR (rest));
break;
}
}
if (EQ (target_type, QTIMESTAMP))
{
handler_fn = Qnil;
- value = XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car;
+ value = XCAR (XCDR (XCDR (local_value)));
}
#if 0
else if (EQ (target_type, QDELETE))
handler_fn = Qnil;
Fx_disown_selection_internal
(selection_symbol,
- XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car);
+ XCAR (XCDR (XCDR (local_value))));
value = QNULL;
}
#endif
#if 0 /* #### MULTIPLE doesn't work yet */
else if (CONSP (target_type)
- && XCONS (target_type)->car == QMULTIPLE)
+ && XCAR (target_type) == QMULTIPLE)
{
Lisp_Object pairs;
int size;
int i;
- pairs = XCONS (target_type)->cdr;
+ pairs = XCDR (target_type);
size = XVECTOR (pairs)->size;
/* If the target is MULTIPLE, then target_type looks like
(MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
if (!NILP (handler_fn))
value = call3 (handler_fn,
selection_symbol, target_type,
- XCONS (XCONS (local_value)->cdr)->car);
+ XCAR (XCDR (local_value)));
else
value = Qnil;
unbind_to (count, Qnil);
check = value;
if (CONSP (value)
- && SYMBOLP (XCONS (value)->car))
- type = XCONS (value)->car,
- check = XCONS (value)->cdr;
+ && SYMBOLP (XCAR (value)))
+ type = XCAR (value),
+ check = XCDR (value);
if (STRINGP (check)
|| VECTORP (check)
return value;
/* Check for a value that cons_to_long could handle. */
else if (CONSP (check)
- && INTEGERP (XCONS (check)->car)
- && (INTEGERP (XCONS (check)->cdr)
+ && INTEGERP (XCAR (check))
+ && (INTEGERP (XCDR (check))
||
- (CONSP (XCONS (check)->cdr)
- && INTEGERP (XCONS (XCONS (check)->cdr)->car)
- && NILP (XCONS (XCONS (check)->cdr)->cdr))))
+ (CONSP (XCDR (check))
+ && INTEGERP (XCAR (XCDR (check)))
+ && NILP (XCDR (XCDR (check))))))
return value;
else
return
It is set to zero when the request is fully processed. */
static struct input_event *x_selection_current_request;
+/* Display info in x_selection_request. */
+
+static struct x_display_info *selection_request_dpyinfo;
+
/* Used as an unwind-protect clause so that, if a selection-converter signals
an error, we tell the requester that we were unable to do what they wanted
before we throw to top-level or go into the debugger or whatever. */
x_selection_request_lisp_error (ignore)
Lisp_Object ignore;
{
- if (x_selection_current_request != 0)
+ if (x_selection_current_request != 0
+ && selection_request_dpyinfo->display)
x_decline_selection_request (x_selection_current_request);
return Qnil;
}
PropModeReplace, data, 0);
}
+ /* The window we're communicating with may have been deleted
+ in the meantime (that's a real situation from a bug report).
+ In this case, there may be events in the event queue still
+ refering to the deleted window, and we'll get a BadWindow error
+ in XTread_socket when processing the events. I don't have
+ an idea how to fix that. gerd, 2001-01-98. */
XFlush (display);
x_uncatch_errors (display, count);
UNBLOCK_INPUT;
}
local_selection_time = (Time)
- cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car);
+ cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
if (SELECTION_EVENT_TIME (event) != CurrentTime
&& local_selection_time > SELECTION_EVENT_TIME (event))
goto DONE;
}
- count = specpdl_ptr - specpdl;
x_selection_current_request = event;
+ count = BINDING_STACK_SIZE ();
+ selection_request_dpyinfo = dpyinfo;
record_unwind_protect (x_selection_request_lisp_error, Qnil);
target_symbol = x_atom_to_symbol (dpyinfo, SELECTION_EVENT_DISPLAY (event),
}
}
\f
-/* Handle a SelectionClear event EVENT, which indicates that some other
+/* Handle a SelectionClear event EVENT, which indicates that some
client cleared out our previously asserted selection.
This is called from keyboard.c when such an event is found in the queue. */
Lisp_Object selection_symbol, local_selection_data;
Time local_selection_time;
struct x_display_info *dpyinfo = x_display_info_for_display (display);
+ struct x_display_info *t_dpyinfo;
+
+ /* If the new selection owner is also Emacs,
+ don't clear the new selection. */
+ BLOCK_INPUT;
+ /* Check each display on the same terminal,
+ to see if this Emacs job now owns the selection
+ through that display. */
+ for (t_dpyinfo = x_display_list; t_dpyinfo; t_dpyinfo = t_dpyinfo->next)
+ if (t_dpyinfo->kboard == dpyinfo->kboard)
+ {
+ Window owner_window
+ = XGetSelectionOwner (t_dpyinfo->display, selection);
+ if (x_window_to_frame (t_dpyinfo, owner_window) != 0)
+ {
+ UNBLOCK_INPUT;
+ return;
+ }
+ }
+ UNBLOCK_INPUT;
selection_symbol = x_atom_to_symbol (dpyinfo, display, selection);
if (NILP (local_selection_data)) return;
local_selection_time = (Time)
- cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car);
+ cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
/* This SelectionClear is for a selection that we no longer own, so we can
disregard it. (That is, we have reasserted the selection since this
{
Lisp_Object rest;
for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
- if (EQ (local_selection_data, Fcar (XCONS (rest)->cdr)))
+ if (EQ (local_selection_data, Fcar (XCDR (rest))))
{
- XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
+ XCDR (rest) = Fcdr (XCDR (rest));
break;
}
}
for (; CONSP (rest); rest = Fcdr (rest))
call1 (Fcar (rest), selection_symbol);
prepare_menu_bars ();
- redisplay_preserve_echo_area ();
+ redisplay_preserve_echo_area (20);
}
}
}
#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 ();
+ redisplay_preserve_echo_area (21);
#endif
}
/* Delete elements after the beginning of Vselection_alist. */
for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
- if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCONS (rest)->cdr)))))))
+ if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest))))))))
{
/* Let random Lisp code notice that the selection has been stolen. */
Lisp_Object hooks, selection_symbol;
hooks = Vx_lost_selection_hooks;
- selection_symbol = Fcar (Fcar (XCONS (rest)->cdr));
+ selection_symbol = Fcar (Fcar (XCDR (rest)));
if (!EQ (hooks, Qunbound))
{
for (; CONSP (hooks); hooks = Fcdr (hooks))
call1 (Fcar (hooks), selection_symbol);
#if 0 /* See above */
- redisplay_preserve_echo_area ();
+ redisplay_preserve_echo_area (22);
#endif
}
- XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
+ XCDR (rest) = Fcdr (XCDR (rest));
break;
}
}
Lisp_Object identifierval;
{
unexpect_property_change ((struct prop_location *)
- (XFASTINT (XCONS (identifierval)->car) << 16
- | XFASTINT (XCONS (identifierval)->cdr)));
+ (XFASTINT (XCAR (identifierval)) << 16
+ | XFASTINT (XCDR (identifierval))));
return Qnil;
}
Lisp_Object tem;
tem = Fcons (Qnil, Qnil);
- XSETFASTINT (XCONS (tem)->car, (EMACS_UINT)location >> 16);
- XSETFASTINT (XCONS (tem)->cdr, (EMACS_UINT)location & 0xffff);
+ XSETFASTINT (XCAR (tem), (EMACS_UINT)location >> 16);
+ XSETFASTINT (XCDR (tem), (EMACS_UINT)location & 0xffff);
/* Make sure to do unexpect_property_change if we quit or err. */
record_unwind_protect (wait_for_property_change_unwind, tem);
- XCONS (property_change_reply)->car = Qnil;
+ XCAR (property_change_reply) = Qnil;
property_change_reply_object = location;
/* If the event we are waiting for arrives beyond here, it will set
usecs = (x_selection_timeout % 1000) * 1000;
wait_reading_process_input (secs, usecs, property_change_reply, 0);
- if (NILP (XCONS (property_change_reply)->car))
+ if (NILP (XCAR (property_change_reply)))
error ("Timed out waiting for property-notify event");
}
/* If this is the one wait_for_property_change is waiting for,
tell it to wake up. */
if (rest == property_change_reply_object)
- XCONS (property_change_reply)->car = Qt;
+ XCAR (property_change_reply) = Qt;
if (prev)
prev->next = rest->next;
int i;
int size;
if (CONSP (obj))
- return Fcons (XCONS (obj)->car, copy_multiple_data (XCONS (obj)->cdr));
+ return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
CHECK_VECTOR (obj, 0);
vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil);
x_get_foreign_selection (selection_symbol, target_type)
Lisp_Object selection_symbol, target_type;
{
- 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);
+ struct frame *sf = SELECTED_FRAME ();
+ Window requestor_window = FRAME_X_WINDOW (sf);
+ Display *display = FRAME_X_DISPLAY (sf);
+ struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (sf);
Time requestor_time = last_event_timestamp;
Atom target_property = dpyinfo->Xatom_EMACS_TMP;
Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
Lisp_Object frame;
if (CONSP (target_type))
- type_atom = symbol_to_x_atom (dpyinfo, display, XCONS (target_type)->car);
+ type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type));
else
type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
/* Prepare to block until the reply has been read. */
reading_selection_window = requestor_window;
reading_which_selection = selection_atom;
- XCONS (reading_selection_reply)->car = Qnil;
+ XCAR (reading_selection_reply) = Qnil;
frame = some_frame_on_display (dpyinfo);
x_uncatch_errors (display, count);
UNBLOCK_INPUT;
- if (NILP (XCONS (reading_selection_reply)->car))
+ if (NILP (XCAR (reading_selection_reply)))
error ("Timed out waiting for reply from selection owner");
- if (EQ (XCONS (reading_selection_reply)->car, Qlambda))
+ if (EQ (XCAR (reading_selection_reply), Qlambda))
error ("No `%s' selection", XSYMBOL (selection_symbol)->name->data);
/* Otherwise, the selection is waiting for us on the requested property. */
Lisp_Object str;
int require_encoding = 0;
- if (! NILP (buffer_defaults.enable_multibyte_characters))
+ if (
+#if 1
+ 1
+#else
+ ! NILP (buffer_defaults.enable_multibyte_characters)
+#endif
+ )
{
/* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode
DATA to Emacs internal format because DATA may be encoded
}
}
if (!require_encoding)
- str = make_unibyte_string ((char *) data, size);
+ {
+ str = make_unibyte_string ((char *) data, size);
+ Vlast_coding_system_used = Qraw_text;
+ }
else
{
int bufsize;
unsigned char *buf;
struct coding_system coding;
+ if (NILP (Vnext_selection_coding_system))
+ Vnext_selection_coding_system = Vselection_coding_system;
setup_coding_system
- (Fcheck_coding_system(Vclipboard_coding_system), &coding);
+ (Fcheck_coding_system(Vnext_selection_coding_system), &coding);
+ coding.src_multibyte = 0;
+ coding.dst_multibyte = 1;
+ Vnext_selection_coding_system = Qnil;
coding.mode |= CODING_MODE_LAST_BLOCK;
bufsize = decoding_buffer_size (&coding, size);
buf = (unsigned char *) xmalloc (bufsize);
decode_coding (&coding, data, buf, size, bufsize);
- str = make_multibyte_string ((char *) buf,
- coding.produced_char, coding.produced);
+ str = make_string_from_bytes ((char *) buf,
+ coding.produced_char, coding.produced);
xfree (buf);
+ Vlast_coding_system_used = coding.symbol;
}
+ compose_chars_in_text (0, XSTRING (str)->size, str);
return str;
}
/* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
*nofree_ret = 0;
- if (CONSP (obj) && SYMBOLP (XCONS (obj)->car))
+ if (CONSP (obj) && SYMBOLP (XCAR (obj)))
{
- type = XCONS (obj)->car;
- obj = XCONS (obj)->cdr;
- if (CONSP (obj) && NILP (XCONS (obj)->cdr))
- obj = XCONS (obj)->car;
+ type = XCAR (obj);
+ obj = XCDR (obj);
+ if (CONSP (obj) && NILP (XCDR (obj)))
+ obj = XCAR (obj);
}
if (EQ (obj, QNULL) || (EQ (type, QNULL)))
{
/* Since we are now handling multilingual text, we must consider
sending back compound text. */
- int charsets[MAX_CHARSET + 1];
- int num;
+ int stringp;
- *format_ret = 8;
- *size_ret = XSTRING (obj)->size_byte;
- *data_ret = XSTRING (obj)->data;
- 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));
-
- if (!num || (num == 1 && charsets[CHARSET_ASCII]))
- {
- /* No multibyte character in OBJ. We need not encode it. */
- *nofree_ret = 1;
- if (NILP (type)) type = QSTRING;
- }
- else
- {
- /* We must encode contents of OBJ to compound text format.
- The format is compatible with what the target `STRING'
- expects if OBJ contains only ASCII and Latin-1
- characters. */
- int bufsize;
- unsigned char *buf;
- struct coding_system coding;
+ if (NILP (Vnext_selection_coding_system))
+ Vnext_selection_coding_system = Vselection_coding_system;
- setup_coding_system
- (Fcheck_coding_system (Vclipboard_coding_system), &coding);
- coding.mode |= CODING_MODE_LAST_BLOCK;
- bufsize = encoding_buffer_size (&coding, *size_ret);
- buf = (unsigned char *) xmalloc (bufsize);
- encode_coding (&coding, *data_ret, buf, *size_ret, bufsize);
- *size_ret = coding.produced;
- *data_ret = buf;
- if (charsets[charset_latin_iso8859_1]
- && (num == 1 || (num == 2 && charsets[CHARSET_ASCII])))
- {
- /* Ok, we can return it as `STRING'. */
- if (NILP (type)) type = QSTRING;
- }
- else
- {
- /* We must return it as `COMPOUND_TEXT'. */
- if (NILP (type)) type = QCOMPOUND_TEXT;
- }
- }
+ *format_ret = 8;
+ *data_ret = x_encode_text (obj, Vnext_selection_coding_system,
+ (int *) size_ret, &stringp);
+ *nofree_ret = (*data_ret == XSTRING (obj)->data);
+ if (NILP (type))
+ type = (stringp ? QSTRING : QCOMPOUND_TEXT);
+ Vlast_coding_system_used = (*nofree_ret
+ ? Qraw_text
+ : Vnext_selection_coding_system);
+ Vnext_selection_coding_system = Qnil;
}
else if (SYMBOLP (obj))
{
if (NILP (type)) type = QINTEGER;
}
else if (INTEGERP (obj)
- || (CONSP (obj) && INTEGERP (XCONS (obj)->car)
- && (INTEGERP (XCONS (obj)->cdr)
- || (CONSP (XCONS (obj)->cdr)
- && INTEGERP (XCONS (XCONS (obj)->cdr)->car)))))
+ || (CONSP (obj) && INTEGERP (XCAR (obj))
+ && (INTEGERP (XCDR (obj))
+ || (CONSP (XCDR (obj))
+ && INTEGERP (XCAR (XCDR (obj)))))))
{
*format_ret = 32;
*size_ret = 1;
Lisp_Object obj;
{
if (CONSP (obj)
- && INTEGERP (XCONS (obj)->car)
- && CONSP (XCONS (obj)->cdr)
- && INTEGERP (XCONS (XCONS (obj)->cdr)->car)
- && NILP (XCONS (XCONS (obj)->cdr)->cdr))
- obj = Fcons (XCONS (obj)->car, XCONS (obj)->cdr);
+ && INTEGERP (XCAR (obj))
+ && CONSP (XCDR (obj))
+ && INTEGERP (XCAR (XCDR (obj)))
+ && NILP (XCDR (XCDR (obj))))
+ obj = Fcons (XCAR (obj), XCDR (obj));
if (CONSP (obj)
- && INTEGERP (XCONS (obj)->car)
- && INTEGERP (XCONS (obj)->cdr))
+ && INTEGERP (XCAR (obj))
+ && INTEGERP (XCDR (obj)))
{
- if (XINT (XCONS (obj)->car) == 0)
- return XCONS (obj)->cdr;
- if (XINT (XCONS (obj)->car) == -1)
- return make_number (- XINT (XCONS (obj)->cdr));
+ if (XINT (XCAR (obj)) == 0)
+ return XCDR (obj);
+ if (XINT (XCAR (obj)) == -1)
+ return make_number (- XINT (XCDR (obj)));
}
if (VECTORP (obj))
{
if (event->selection != reading_which_selection)
return;
- XCONS (reading_selection_reply)->car
+ XCAR (reading_selection_reply)
= (event->property != 0 ? Qt : Qlambda);
}
#if 0 /* #### MULTIPLE doesn't work yet */
if (CONSP (target_type)
- && XCONS (target_type)->car == QMULTIPLE)
+ && XCAR (target_type) == QMULTIPLE)
{
- CHECK_VECTOR (XCONS (target_type)->cdr, 0);
+ CHECK_VECTOR (XCDR (target_type), 0);
/* So we don't destructively modify this... */
target_type = copy_multiple_data (target_type);
}
}
if (CONSP (val)
- && SYMBOLP (XCONS (val)->car))
+ && SYMBOLP (XCAR (val)))
{
- val = XCONS (val)->cdr;
- if (CONSP (val) && NILP (XCONS (val)->cdr))
- val = XCONS (val)->car;
+ val = XCDR (val);
+ if (CONSP (val) && NILP (XCDR (val)))
+ val = XCAR (val);
}
val = clean_local_selection_data (val);
DONE:
struct selection_input_event event;
Display *display;
struct x_display_info *dpyinfo;
+ struct frame *sf = SELECTED_FRAME ();
check_x ();
- display = FRAME_X_DISPLAY (selected_frame);
- dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
+ display = FRAME_X_DISPLAY (sf);
+ dpyinfo = FRAME_X_DISPLAY_INFO (sf);
CHECK_SYMBOL (selection, 0);
if (NILP (time))
timestamp = last_event_timestamp;
Lisp_Object tail;
struct buffer *buf = XBUFFER (buffer);
- for (tail = Vselection_alist; CONSP (tail); tail = XCONS (tail)->cdr)
+ for (tail = Vselection_alist; CONSP (tail); tail = XCDR (tail))
{
Lisp_Object elt, value;
- elt = XCONS (tail)->car;
- value = XCONS (elt)->cdr;
- if (CONSP (value) && MARKERP (XCONS (value)->car)
- && XMARKER (XCONS (value)->car)->buffer == buf)
- Fx_disown_selection_internal (XCONS (elt)->car, Qnil);
+ elt = XCAR (tail);
+ value = XCDR (elt);
+ if (CONSP (value) && MARKERP (XCAR (value))
+ && XMARKER (XCAR (value))->buffer == buf)
+ Fx_disown_selection_internal (XCAR (elt), Qnil);
}
}
Window owner;
Atom atom;
Display *dpy;
+ struct frame *sf = SELECTED_FRAME ();
/* It should be safe to call this before we have an X frame. */
- if (! FRAME_X_P (selected_frame))
+ if (! FRAME_X_P (sf))
return Qnil;
- dpy = FRAME_X_DISPLAY (selected_frame);
+ dpy = FRAME_X_DISPLAY (sf);
CHECK_SYMBOL (selection, 0);
if (!NILP (Fx_selection_owner_p (selection)))
return Qt;
if (EQ (selection, Qnil)) selection = QPRIMARY;
if (EQ (selection, Qt)) selection = QSECONDARY;
- atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame),
- dpy, selection);
+ atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection);
if (atom == 0)
return Qnil;
BLOCK_INPUT;
Lisp_Object ret;
Display *display;
struct x_display_info *dpyinfo;
+ struct frame *sf = SELECTED_FRAME ();
check_x ();
- display = FRAME_X_DISPLAY (selected_frame);
- dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
+ display = FRAME_X_DISPLAY (sf);
+ dpyinfo = FRAME_X_DISPLAY_INFO (sf);
window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
CHECK_CUT_BUFFER (buffer, 0);
buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer);
x_get_window_property (display, window, buffer_atom, &data, &bytes,
&type, &format, &size, 0);
- if (!data) return Qnil;
+ if (!data || !format)
+ return Qnil;
if (format != 8 || type != XA_STRING)
Fsignal (Qerror,
int bytes_remaining;
int max_bytes;
Display *display;
+ struct frame *sf = SELECTED_FRAME ();
check_x ();
- display = FRAME_X_DISPLAY (selected_frame);
+ display = FRAME_X_DISPLAY (sf);
window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
max_bytes = SELECTION_QUANTUM (display);
CHECK_CUT_BUFFER (buffer, 0);
CHECK_STRING (string, 0);
- buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame),
+ buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf),
display, buffer);
data = (unsigned char *) XSTRING (string)->data;
- bytes = XSTRING (string)->size_byte;
+ bytes = STRING_BYTES (XSTRING (string));
bytes_remaining = bytes;
- if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized)
+ if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
{
initialize_cut_buffers (display, window);
- FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1;
+ FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
}
BLOCK_INPUT;
Window window;
Atom props[8];
Display *display;
+ struct frame *sf = SELECTED_FRAME ();
check_x ();
- display = FRAME_X_DISPLAY (selected_frame);
+ display = FRAME_X_DISPLAY (sf);
window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
CHECK_NUMBER (n, 0);
if (XINT (n) == 0)
return n;
- if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized)
+ if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
{
initialize_cut_buffers (display, window);
- FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1;
+ FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
}
props[0] = XA_CUT_BUFFER0;
it merely informs you that they have happened.");
Vx_sent_selection_hooks = Qnil;
- DEFVAR_LISP ("clipboard-coding-system", &Vclipboard_coding_system,
+ DEFVAR_LISP ("selection-coding-system", &Vselection_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 `compound-text'");
- Vclipboard_coding_system=intern ("compound-text");
- staticpro(&Vclipboard_coding_system);
+The default value is `compound-text'.");
+ Vselection_coding_system = intern ("compound-text");
+
+ DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system,
+ "Coding system for the next communication with other X clients.\n\
+Usually, `selection-coding-system' is used for communicating with\n\
+other X clients. But, if this variable is set, it is used for the\n\
+next communication only. After the communication, this variable is\n\
+set to nil.");
+ Vnext_selection_coding_system = Qnil;
DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
"Number of milliseconds to wait for a selection reply.\n\