summaryrefslogtreecommitdiff
path: root/src/xselect.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-03-14 20:19:28 +0000
committerRichard M. Stallman <rms@gnu.org>1993-03-14 20:19:28 +0000
commita87ed99c5b3fd6bf546e60f507cea013d78c0f88 (patch)
treec09b2c8949eb450e6b423b9ee06a4e928638c5b1 /src/xselect.c
parent3e6580d01d4ce6f5942254a5136f3741d78bd998 (diff)
entered into RCS
Diffstat (limited to 'src/xselect.c')
-rw-r--r--src/xselect.c85
1 files changed, 57 insertions, 28 deletions
diff --git a/src/xselect.c b/src/xselect.c
index 99c59cf27f2..20aa5a9ba0e 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -379,7 +379,10 @@ x_get_local_selection (selection_symbol, target_type)
CHECK_SYMBOL (target_type, 0);
handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
- if (NILP (handler_fn)) return Qnil;
+ if (NILP (handler_fn))
+ Fsignal (Qerror,
+ Fcons (build_string ("missing selection-conversion function"),
+ Fcons (target_type, Fcons (value, Qnil))));
value = call3 (handler_fn,
selection_symbol, target_type,
XCONS (XCONS (local_value)->cdr)->car);
@@ -388,6 +391,7 @@ x_get_local_selection (selection_symbol, target_type)
/* Make sure this value is of a type that we could transmit
to another X client. */
+
check = value;
if (CONSP (value)
&& SYMBOLP (XCONS (value)->car))
@@ -400,6 +404,7 @@ x_get_local_selection (selection_symbol, target_type)
|| INTEGERP (check)
|| NILP (value))
return value;
+ /* Check for a value that cons_to_long could handle. */
else if (CONSP (check)
&& INTEGERP (XCONS (check)->car)
&& (INTEGERP (XCONS (check)->cdr)
@@ -411,7 +416,7 @@ x_get_local_selection (selection_symbol, target_type)
else
return
Fsignal (Qerror,
- Fcons (build_string ("unrecognised selection-conversion type"),
+ Fcons (build_string ("invalid data returned by selection-conversion function"),
Fcons (handler_fn, Fcons (value, Qnil))));
}
@@ -984,6 +989,7 @@ x_get_foreign_selection (selection_symbol, target_type)
BLOCK_INPUT;
XConvertSelection (display, selection_atom, type_atom, target_property,
requestor_window, requestor_time);
+ XFlushQueue ();
/* Prepare to block until the reply has been read. */
reading_selection_window = requestor_window;
@@ -1377,7 +1383,11 @@ lisp_data_to_selection_data (display, obj,
(*(short **) data_ret) [0] = (short) XINT (obj);
if (NILP (type)) type = QINTEGER;
}
- else if (INTEGERP (obj) || CONSP (obj))
+ else if (INTEGERP (obj)
+ || (CONSP (obj) && INTEGERP (XCONS (obj)->car)
+ && (INTEGERP (XCONS (obj)->cdr)
+ || (CONSP (XCONS (obj)->cdr)
+ && INTEGERP (XCONS (XCONS (obj)->cdr)->car)))))
{
*format_ret = 32;
*size_ret = 1;
@@ -1535,7 +1545,7 @@ DEFUN ("x-own-selection-internal",
TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
\(Those are literal upper-case symbol names, since that's what X expects.)\n\
VALUE is typically a string, or a cons of two markers, but may be\n\
-anything that the functions on selection-converter-alist know about.")
+anything that the functions on `selection-converter-alist' know about.")
(selection_name, selection_value)
Lisp_Object selection_name, selection_value;
{
@@ -1555,7 +1565,7 @@ DEFUN ("x-get-selection-internal",
"Return text selected from some X window.\n\
SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
\(Those are literal upper-case symbol names, since that's what X expects.)\n\
-TYPE is the type of data desired, typically STRING.")
+TYPE is the type of data desired, typically `STRING'.")
(selection_symbol, target_type)
Lisp_Object selection_symbol, target_type;
{
@@ -1599,7 +1609,8 @@ TYPE is the type of data desired, typically STRING.")
DEFUN ("x-disown-selection-internal",
Fx_disown_selection_internal, Sx_disown_selection_internal, 1, 2, 0,
- "If we own the named selection, then disown it (make there be no selection).")
+ "If we own the selection SELECTION, disown it.\n\
+Disowning it means there is no such selection.")
(selection, time)
Lisp_Object selection;
Lisp_Object time;
@@ -1637,10 +1648,30 @@ DEFUN ("x-disown-selection-internal",
return Qt;
}
+/* Get rid of all the selections in buffer BUFFER.
+ This is used when we kill a buffer. */
+
+void
+x_disown_buffer_selections (buffer)
+ Lisp_Object buffer;
+{
+ Lisp_Object tail;
+ struct buffer *buf = XBUFFER (buffer);
+
+ for (tail = Vselection_alist; CONSP (tail); tail = XCONS (tail)->cdr)
+ {
+ 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);
+ }
+}
DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
0, 1, 0,
- "Whether the current emacs process owns the given X Selection.\n\
+ "Whether the current Emacs process owns the given X Selection.\n\
The arg should be the name of the selection in question, typically one of\n\
the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
\(Those are literal upper-case symbol names, since that's what X expects.)\n\
@@ -1709,25 +1740,25 @@ initialize_cut_buffers (display, window)
}
-#define CHECK_CUTBUFFER(symbol,n) \
+#define CHECK_CUT_BUFFER(symbol,n) \
{ CHECK_SYMBOL ((symbol), (n)); \
if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
&& !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
&& !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
&& !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
Fsignal (Qerror, \
- Fcons (build_string ("doesn't name a cutbuffer"), \
+ Fcons (build_string ("doesn't name a cut buffer"), \
Fcons ((symbol), Qnil))); \
}
-DEFUN ("x-get-cutbuffer-internal", Fx_get_cutbuffer_internal,
- Sx_get_cutbuffer_internal, 1, 1, 0,
- "Returns the value of the named cutbuffer (typically CUT_BUFFER0).")
+DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
+ Sx_get_cut_buffer_internal, 1, 1, 0,
+ "Returns the value of the named cut buffer (typically CUT_BUFFER0).")
(buffer)
Lisp_Object buffer;
{
Display *display = x_current_display;
- Window window = RootWindow (display, 0); /* Cutbuffers are on screen 0 */
+ Window window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
Atom buffer_atom;
unsigned char *data;
int bytes;
@@ -1736,7 +1767,7 @@ DEFUN ("x-get-cutbuffer-internal", Fx_get_cutbuffer_internal,
unsigned long size;
Lisp_Object ret;
- CHECK_CUTBUFFER (buffer, 0);
+ CHECK_CUT_BUFFER (buffer, 0);
buffer_atom = symbol_to_x_atom (display, buffer);
x_get_window_property (display, window, buffer_atom, &data, &bytes,
@@ -1755,14 +1786,14 @@ DEFUN ("x-get-cutbuffer-internal", Fx_get_cutbuffer_internal,
}
-DEFUN ("x-store-cutbuffer-internal", Fx_store_cutbuffer_internal,
- Sx_store_cutbuffer_internal, 2, 2, 0,
- "Sets the value of the named cutbuffer (typically CUT_BUFFER0).")
+DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal,
+ Sx_store_cut_buffer_internal, 2, 2, 0,
+ "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
(buffer, string)
Lisp_Object buffer, string;
{
Display *display = x_current_display;
- Window window = RootWindow (display, 0); /* Cutbuffers are on screen 0 */
+ Window window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
Atom buffer_atom;
unsigned char *data;
int bytes;
@@ -1770,7 +1801,7 @@ DEFUN ("x-store-cutbuffer-internal", Fx_store_cutbuffer_internal,
int max_bytes = SELECTION_QUANTUM (display);
if (max_bytes > MAX_SELECTION_QUANTUM) max_bytes = MAX_SELECTION_QUANTUM;
- CHECK_CUTBUFFER (buffer, 0);
+ CHECK_CUT_BUFFER (buffer, 0);
CHECK_STRING (string, 0);
buffer_atom = symbol_to_x_atom (display, buffer);
data = (unsigned char *) XSTRING (string)->data;
@@ -1797,15 +1828,15 @@ DEFUN ("x-store-cutbuffer-internal", Fx_store_cutbuffer_internal,
}
-DEFUN ("x-rotate-cutbuffers-internal", Fx_rotate_cutbuffers_internal,
- Sx_rotate_cutbuffers_internal, 1, 1, 0,
- "Rotate the values of the cutbuffers by the given number of steps;\n\
+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.")
(n)
Lisp_Object n;
{
Display *display = x_current_display;
- Window window = RootWindow (display, 0); /* Cutbuffers are on screen 0 */
+ Window window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
Atom props [8];
CHECK_NUMBER (n, 0);
@@ -1850,8 +1881,6 @@ Xatoms_of_xselect ()
void
syms_of_xselect ()
{
- atoms_of_xselect ();
-
defsubr (&Sx_get_selection_internal);
defsubr (&Sx_own_selection_internal);
defsubr (&Sx_disown_selection_internal);
@@ -1859,9 +1888,9 @@ syms_of_xselect ()
defsubr (&Sx_selection_exists_p);
#ifdef CUT_BUFFER_SUPPORT
- defsubr (&Sx_get_cutbuffer_internal);
- defsubr (&Sx_store_cutbuffer_internal);
- defsubr (&Sx_rotate_cutbuffers_internal);
+ defsubr (&Sx_get_cut_buffer_internal);
+ defsubr (&Sx_store_cut_buffer_internal);
+ defsubr (&Sx_rotate_cut_buffers_internal);
cut_buffers_initialized = 0;
#endif