aboutsummaryrefslogtreecommitdiffstats
path: root/src/xselect.c
diff options
context:
space:
mode:
authorChong Yidong2006-02-28 14:52:46 +0000
committerChong Yidong2006-02-28 14:52:46 +0000
commitc525d842f8a75a19c870971c176ce7fd50cc21c9 (patch)
tree8dce8420691c4d932c8d9dc6cf602af00d39699e /src/xselect.c
parent29ecdb2212662dd0c73f9338aea8ea8dd0de2df3 (diff)
downloademacs-c525d842f8a75a19c870971c176ce7fd50cc21c9.tar.gz
emacs-c525d842f8a75a19c870971c176ce7fd50cc21c9.zip
* xselect.c (x_catch_errors_unwind): New function.
(x_reply_selection_request): Put x_uncatch_errors in an unwind. (Fx_get_atom_name): Call x_uncatch_errors earlier. * window.c (Qscroll_up, Qscroll_down): New syms. (window_scroll_pixel_based): Make preserve_y static to avoid getting point stuck when scrolling 1 line.
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 a0b4b091805..30739c74331 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -55,6 +55,7 @@ static void x_decline_selection_request P_ ((struct input_event *));
55static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object)); 55static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object));
56static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object)); 56static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object));
57static Lisp_Object some_frame_on_display P_ ((struct x_display_info *)); 57static Lisp_Object some_frame_on_display P_ ((struct x_display_info *));
58static Lisp_Object x_catch_errors_unwind P_ ((Lisp_Object));
58static void x_reply_selection_request P_ ((struct input_event *, int, 59static void x_reply_selection_request P_ ((struct input_event *, int,
59 unsigned char *, int, Atom)); 60 unsigned char *, int, Atom));
60static int waiting_for_other_props_on_window P_ ((Display *, Window)); 61static int waiting_for_other_props_on_window P_ ((Display *, Window));
@@ -611,6 +612,15 @@ x_selection_request_lisp_error (ignore)
611 x_decline_selection_request (x_selection_current_request); 612 x_decline_selection_request (x_selection_current_request);
612 return Qnil; 613 return Qnil;
613} 614}
615
616static Lisp_Object
617x_catch_errors_unwind (dummy)
618 Lisp_Object dummy;
619{
620 BLOCK_INPUT;
621 x_uncatch_errors ();
622 UNBLOCK_INPUT;
623}
614 624
615 625
616/* This stuff is so that INCR selections are reentrant (that is, so we can 626/* This stuff is so that INCR selections are reentrant (that is, so we can
@@ -703,8 +713,11 @@ x_reply_selection_request (event, format, data, size, type)
703 if (reply.property == None) 713 if (reply.property == None)
704 reply.property = reply.target; 714 reply.property = reply.target;
705 715
706 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
707 BLOCK_INPUT; 716 BLOCK_INPUT;
717 /* The protected block contains wait_for_property_change, which can
718 run random lisp code (process handlers) or signal. Therefore, we
719 put the x_uncatch_errors call in an unwind. */
720 record_unwind_protect (x_catch_errors_unwind, Qnil);
708 x_catch_errors (display); 721 x_catch_errors (display);
709 722
710#ifdef TRACE_SELECTION 723#ifdef TRACE_SELECTION
@@ -858,9 +871,8 @@ x_reply_selection_request (event, format, data, size, type)
858 UNBLOCK to enter the event loop and get possible errors delivered, 871 UNBLOCK to enter the event loop and get possible errors delivered,
859 and then BLOCK again because x_uncatch_errors requires it. */ 872 and then BLOCK again because x_uncatch_errors requires it. */
860 BLOCK_INPUT; 873 BLOCK_INPUT;
861 874 /* This calls x_uncatch_errors. */
862 unbind_to (count, Qnil); 875 unbind_to (count, Qnil);
863 x_uncatch_errors ();
864 UNBLOCK_INPUT; 876 UNBLOCK_INPUT;
865} 877}
866 878
@@ -1370,7 +1382,7 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1370 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol); 1382 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
1371 Atom type_atom; 1383 Atom type_atom;
1372 int secs, usecs; 1384 int secs, usecs;
1373 int count; 1385 int count = SPECPDL_INDEX ();
1374 Lisp_Object frame; 1386 Lisp_Object frame;
1375 1387
1376 if (CONSP (target_type)) 1388 if (CONSP (target_type))
@@ -1392,6 +1404,10 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1392 1404
1393 BLOCK_INPUT; 1405 BLOCK_INPUT;
1394 1406
1407 /* The protected block contains wait_reading_process_output, which
1408 can run random lisp code (process handlers) or signal.
1409 Therefore, we put the x_uncatch_errors call in an unwind. */
1410 record_unwind_protect (x_catch_errors_unwind, Qnil);
1395 x_catch_errors (display); 1411 x_catch_errors (display);
1396 1412
1397 TRACE2 ("Get selection %s, type %s", 1413 TRACE2 ("Get selection %s, type %s",
@@ -1409,8 +1425,6 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1409 1425
1410 frame = some_frame_on_display (dpyinfo); 1426 frame = some_frame_on_display (dpyinfo);
1411 1427
1412 count = SPECPDL_INDEX ();
1413
1414 /* If the display no longer has frames, we can't expect 1428 /* If the display no longer has frames, we can't expect
1415 to get many more selection requests from it, so don't 1429 to get many more selection requests from it, so don't
1416 bother trying to queue them. */ 1430 bother trying to queue them. */
@@ -1432,9 +1446,10 @@ x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1432 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply))); 1446 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
1433 1447
1434 BLOCK_INPUT; 1448 BLOCK_INPUT;
1449 if (x_had_errors_p (display))
1450 error ("Cannot get selection");
1451 /* This calls x_uncatch_errors. */
1435 unbind_to (count, Qnil); 1452 unbind_to (count, Qnil);
1436 x_check_errors (display, "Cannot get selection: %s");
1437 x_uncatch_errors ();
1438 UNBLOCK_INPUT; 1453 UNBLOCK_INPUT;
1439 1454
1440 if (NILP (XCAR (reading_selection_reply))) 1455 if (NILP (XCAR (reading_selection_reply)))
@@ -2655,6 +2670,7 @@ If the value is 0 or the atom is not known, return the empty string. */)
2655 Lisp_Object ret = Qnil; 2670 Lisp_Object ret = Qnil;
2656 Display *dpy = FRAME_X_DISPLAY (f); 2671 Display *dpy = FRAME_X_DISPLAY (f);
2657 Atom atom; 2672 Atom atom;
2673 int had_errors;
2658 2674
2659 if (INTEGERP (value)) 2675 if (INTEGERP (value))
2660 atom = (Atom) XUINT (value); 2676 atom = (Atom) XUINT (value);
@@ -2667,14 +2683,13 @@ If the value is 0 or the atom is not known, return the empty string. */)
2667 2683
2668 BLOCK_INPUT; 2684 BLOCK_INPUT;
2669 x_catch_errors (dpy); 2685 x_catch_errors (dpy);
2670
2671 name = atom ? XGetAtomName (dpy, atom) : ""; 2686 name = atom ? XGetAtomName (dpy, atom) : "";
2687 had_errors = x_had_errors_p (dpy);
2688 x_uncatch_errors ();
2672 2689
2673 if (! x_had_errors_p (dpy)) 2690 if (!had_errors)
2674 ret = make_string (name, strlen (name)); 2691 ret = make_string (name, strlen (name));
2675 2692
2676 x_uncatch_errors ();
2677
2678 if (atom && name) XFree (name); 2693 if (atom && name) XFree (name);
2679 if (NILP (ret)) ret = make_string ("", 0); 2694 if (NILP (ret)) ret = make_string ("", 0);
2680 2695