aboutsummaryrefslogtreecommitdiffstats
path: root/src/xselect.c
diff options
context:
space:
mode:
authorKaroly Lorentey <[email protected]>2006-03-04 23:07:13 +0000
committerKaroly Lorentey <[email protected]>2006-03-04 23:07:13 +0000
commit00bc10dab1f80e3fcf1b8e67dd7618c32ae3926d (patch)
tree875ed4fe8e87a4a52d5ea46140b3c70487847c81 /src/xselect.c
parentbdf36482bbea390390ae7ab1461b14b807c4fb1f (diff)
parent5e9edb94b78ef77981213fca9319d591c7362855 (diff)
Merged from [email protected]
Patches applied: * [email protected]/emacs--devo--0--patch-128 Update from CVS * [email protected]/emacs--devo--0--patch-129 Update from CVS * [email protected]/emacs--devo--0--patch-130 Update from CVS * [email protected]/emacs--devo--0--patch-131 Update from CVS * [email protected]/emacs--devo--0--patch-132 Update from CVS * [email protected]/emacs--devo--0--patch-133 Update from CVS * [email protected]/emacs--devo--0--patch-134 Merge from gnus--rel--5.10 * [email protected]/emacs--devo--0--patch-135 Update from CVS * [email protected]/gnus--rel--5.10--patch-43 Munge arch explicit ids in etc/images to match Emacs * [email protected]/gnus--rel--5.10--patch-44 Update from CVS * [email protected]/gnus--rel--5.10--patch-45 Update from CVS * [email protected]/gnus--rel--5.10--patch-46 Update from CVS * [email protected]/gnus--rel--5.10--patch-47 Update from CVS * [email protected]/gnus--rel--5.10--patch-48 Update from CVS git-archimport-id: [email protected]/emacs--multi-tty--0--patch-524
Diffstat (limited to 'src/xselect.c')
-rw-r--r--src/xselect.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/src/xselect.c b/src/xselect.c
index 8c82a4b85d..6776e73273 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -55,6 +55,7 @@ static void x_decline_selection_request P_ ((struct input_event *));
static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object));
static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object));
static Lisp_Object some_frame_on_display P_ ((struct x_display_info *));
+static Lisp_Object x_catch_errors_unwind P_ ((Lisp_Object));
static void x_reply_selection_request P_ ((struct input_event *, int,
unsigned char *, int, Atom));
static int waiting_for_other_props_on_window P_ ((Display *, Window));
@@ -618,6 +619,15 @@ x_selection_request_lisp_error (ignore)
x_decline_selection_request (x_selection_current_request);
return Qnil;
}
+
+static Lisp_Object
+x_catch_errors_unwind (dummy)
+ Lisp_Object dummy;
+{
+ BLOCK_INPUT;
+ x_uncatch_errors ();
+ UNBLOCK_INPUT;
+}
/* This stuff is so that INCR selections are reentrant (that is, so we can
@@ -711,8 +721,11 @@ x_reply_selection_request (event, format, data, size, type)
if (reply.property == None)
reply.property = reply.target;
- /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
BLOCK_INPUT;
+ /* The protected block contains wait_for_property_change, which can
+ run random lisp code (process handlers) or signal. Therefore, we
+ put the x_uncatch_errors call in an unwind. */
+ record_unwind_protect (x_catch_errors_unwind, Qnil);
x_catch_errors (display);
#ifdef TRACE_SELECTION
@@ -866,9 +879,8 @@ x_reply_selection_request (event, format, data, size, type)
UNBLOCK to enter the event loop and get possible errors delivered,
and then BLOCK again because x_uncatch_errors requires it. */
BLOCK_INPUT;
-
+ /* This calls x_uncatch_errors. */
unbind_to (count, Qnil);
- x_uncatch_errors ();
UNBLOCK_INPUT;
}
@@ -1378,7 +1390,7 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
Atom selection_atom;
Atom type_atom;
int secs, usecs;
- int count;
+ int count = SPECPDL_INDEX ();
Lisp_Object frame;
if (! FRAME_X_P (sf))
@@ -1409,6 +1421,10 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
BLOCK_INPUT;
+ /* The protected block contains wait_reading_process_output, which
+ can run random lisp code (process handlers) or signal.
+ Therefore, we put the x_uncatch_errors call in an unwind. */
+ record_unwind_protect (x_catch_errors_unwind, Qnil);
x_catch_errors (display);
TRACE2 ("Get selection %s, type %s",
@@ -1426,8 +1442,6 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
frame = some_frame_on_display (dpyinfo);
- count = SPECPDL_INDEX ();
-
/* If the display no longer has frames, we can't expect
to get many more selection requests from it, so don't
bother trying to queue them. */
@@ -1449,9 +1463,10 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
BLOCK_INPUT;
+ if (x_had_errors_p (display))
+ error ("Cannot get selection");
+ /* This calls x_uncatch_errors. */
unbind_to (count, Qnil);
- x_check_errors (display, "Cannot get selection: %s");
- x_uncatch_errors ();
UNBLOCK_INPUT;
if (NILP (XCAR (reading_selection_reply)))
@@ -2687,6 +2702,7 @@ If the value is 0 or the atom is not known, return the empty string. */)
Lisp_Object ret = Qnil;
Display *dpy = FRAME_X_DISPLAY (f);
Atom atom;
+ int had_errors;
if (INTEGERP (value))
atom = (Atom) XUINT (value);
@@ -2699,14 +2715,13 @@ If the value is 0 or the atom is not known, return the empty string. */)
BLOCK_INPUT;
x_catch_errors (dpy);
-
name = atom ? XGetAtomName (dpy, atom) : "";
+ had_errors = x_had_errors_p (dpy);
+ x_uncatch_errors ();
- if (! x_had_errors_p (dpy))
+ if (!had_errors)
ret = make_string (name, strlen (name));
- x_uncatch_errors ();
-
if (atom && name) XFree (name);
if (NILP (ret)) ret = make_string ("", 0);