diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2006-02-25 23:20:10 +0000 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2006-02-25 23:20:10 +0000 |
commit | 9ba8e10d9946be97282d6ba629cf26cd22676a61 (patch) | |
tree | 33293d21976e945b3090fb7fed6f15c7806febf7 /src/xterm.c | |
parent | f523e0c3c54c135e24284fe90d8e67120612ff99 (diff) | |
download | emacs-9ba8e10d9946be97282d6ba629cf26cd22676a61.tar.gz |
* xterm.h (x_catch_errors) Return value changed to void.
(x_uncatch_errors): Unused count argument deleted.
* xterm.c (x_catch_errors): Don't use record_unwind_protect, since
it can be called in a signal handler.
(x_catch_errors_unwind): Function deleted.
(x_uncatch_errors): Deallocate last x_error_message_stack struct.
(x_check_errors): Call x_uncatch_errors before signalling error.
(x_load_font, x_term_init, XTmouse_position, handle_one_xevent)
(x_connection_closed, x_list_fonts): Use new versions of
x_catch_errors and x_uncatch_errors.
* xselect.c (x_own_selection, x_decline_selection_request)
(x_reply_selection_request, x_get_foreign_selection)
(Fx_get_atom_name, Fx_send_client_event): Likewise.
* xfns.c (x_real_positions, x_set_mouse_color, Fx_focus_frame):
Likewise.
* eval.c (record_unwind_protect): Add an assertion.
Diffstat (limited to 'src/xterm.c')
-rw-r--r-- | src/xterm.c | 96 |
1 files changed, 36 insertions, 60 deletions
diff --git a/src/xterm.c b/src/xterm.c index ec5f657ab31..b7c1ba14caf 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -324,8 +324,8 @@ static void x_update_window_end P_ ((struct window *, int, int)); void x_delete_display P_ ((struct x_display_info *)); static int x_io_error_quitter P_ ((Display *)); -int x_catch_errors P_ ((Display *)); -void x_uncatch_errors P_ ((Display *, int)); +void x_catch_errors P_ ((Display *)); +void x_uncatch_errors P_ ((Display *)); void x_lower_frame P_ ((struct frame *)); void x_scroll_bar_clear P_ ((struct frame *)); int x_had_errors_p P_ ((Display *)); @@ -3719,7 +3719,6 @@ XTmouse_position (fp, insist, bar_window, part, x, y, time) Window win, child; int win_x, win_y; int parent_x = 0, parent_y = 0; - int count; win = root; @@ -3727,7 +3726,7 @@ XTmouse_position (fp, insist, bar_window, part, x, y, time) structure is changing at the same time this function is running. So at least we must not crash from them. */ - count = x_catch_errors (FRAME_X_DISPLAY (*fp)); + x_catch_errors (FRAME_X_DISPLAY (*fp)); if (FRAME_X_DISPLAY_INFO (*fp)->grabbed && last_mouse_frame && FRAME_LIVE_P (last_mouse_frame)) @@ -3796,7 +3795,7 @@ XTmouse_position (fp, insist, bar_window, part, x, y, time) if (x_had_errors_p (FRAME_X_DISPLAY (*fp))) f1 = 0; - x_uncatch_errors (FRAME_X_DISPLAY (*fp), count); + x_uncatch_errors (FRAME_X_DISPLAY (*fp)); /* If not, is it one of our scroll bars? */ if (! f1) @@ -5713,7 +5712,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit) Display *d = event.xclient.display; /* Catch and ignore errors, in case window has been iconified by a window manager such as GWM. */ - int count = x_catch_errors (d); + x_catch_errors (d); XSetInputFocus (d, event.xclient.window, /* The ICCCM says this is the only valid choice. */ @@ -5722,7 +5721,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit) /* This is needed to detect the error if there is an error. */ XSync (d, False); - x_uncatch_errors (d, count); + x_uncatch_errors (d); } /* Not certain about handling scroll bars here */ #endif /* 0 */ @@ -7469,7 +7468,11 @@ x_text_icon (f, icon_name) #define X_ERROR_MESSAGE_SIZE 200 /* If non-nil, this should be a string. - It means catch X errors and store the error message in this string. */ + It means catch X errors and store the error message in this string. + + The reason we use a stack is that x_catch_error/x_uncatch_error can + be called from a signal handler. +*/ struct x_error_message_stack { char string[X_ERROR_MESSAGE_SIZE]; @@ -7506,20 +7509,12 @@ x_error_catcher (display, error) Calling x_uncatch_errors resumes the normal error handling. */ void x_check_errors (); -static Lisp_Object x_catch_errors_unwind (); -int +void x_catch_errors (dpy) Display *dpy; { - int count = SPECPDL_INDEX (); struct x_error_message_stack *data = xmalloc (sizeof (*data)); - Lisp_Object dummy; -#ifdef ENABLE_CHECKING - dummy = make_number ((EMACS_INT)dpy + (EMACS_INT)x_error_message); -#else - dummy = Qnil; -#endif /* Make sure any errors from previous requests have been dealt with. */ XSync (dpy, False); @@ -7528,21 +7523,19 @@ x_catch_errors (dpy) data->string[0] = 0; data->prev = x_error_message; x_error_message = data; - - record_unwind_protect (x_catch_errors_unwind, dummy); - - return count; } -/* Unbind the binding that we made to check for X errors. */ +/* Undo the last x_catch_errors call. + DPY should be the display that was passed to x_catch_errors. */ -static Lisp_Object -x_catch_errors_unwind (dummy) - Lisp_Object dummy; +void +x_uncatch_errors (dpy) + Display *dpy; { - Display *dpy = x_error_message->dpy; struct x_error_message_stack *tmp; + eassert (x_error_message && dpy == x_error_message->dpy); + /* The display may have been closed before this function is called. Check if it is still open before calling XSync. */ if (x_display_info_for_display (dpy) != 0) @@ -7554,12 +7547,7 @@ x_catch_errors_unwind (dummy) tmp = x_error_message; x_error_message = x_error_message->prev; - free (tmp); - - eassert (EQ (dummy, - make_number ((EMACS_INT)dpy + (EMACS_INT)x_error_message))); - - return Qnil; + xfree (tmp); } /* If any X protocol errors have arrived since the last call to @@ -7575,7 +7563,12 @@ x_check_errors (dpy, format) XSync (dpy, False); if (x_error_message->string[0]) - error (format, x_error_message->string); + { + char string[X_ERROR_MESSAGE_SIZE]; + bcopy (x_error_message->string, string, X_ERROR_MESSAGE_SIZE); + x_uncatch_errors (dpy); + error (format, string); + } } /* Nonzero if we had any X protocol errors @@ -7600,19 +7593,6 @@ x_clear_errors (dpy) x_error_message->string[0] = 0; } -/* Stop catching X protocol errors and let them make Emacs die. - DPY should be the display that was passed to x_catch_errors. - COUNT should be the value that was returned by - the corresponding call to x_catch_errors. */ - -void -x_uncatch_errors (dpy, count) - Display *dpy; - int count; -{ - unbind_to (count, Qnil); -} - #if 0 static unsigned int x_wire_count; x_trace_wire () @@ -7669,7 +7649,6 @@ x_connection_closed (dpy, error_message) { struct x_display_info *dpyinfo = x_display_info_for_display (dpy); Lisp_Object frame, tail; - int count; error_msg = (char *) alloca (strlen (error_message) + 1); strcpy (error_msg, error_message); @@ -7679,7 +7658,7 @@ x_connection_closed (dpy, error_message) below. Otherwise, we might end up with printing ``can't find per display information'' in the recursive call instead of printing the original message here. */ - count = x_catch_errors (dpy); + x_catch_errors (dpy); /* We have to close the display to inform Xt that it doesn't exist anymore. If we don't, Xt will continue to wait for @@ -7747,7 +7726,7 @@ x_connection_closed (dpy, error_message) if (dpyinfo) x_delete_display (dpyinfo); - x_uncatch_errors (dpy, count); + x_uncatch_errors (dpy); if (x_display_list == 0) { @@ -9353,7 +9332,6 @@ x_list_fonts (f, pattern, size, maxnames) = f ? FRAME_X_DISPLAY_INFO (f) : x_display_list; Display *dpy = dpyinfo->display; int try_XLoadQueryFont = 0; - int count; int allow_auto_scaled_font = 0; if (size < 0) @@ -9393,7 +9371,7 @@ x_list_fonts (f, pattern, size, maxnames) /* At first, put PATTERN in the cache. */ BLOCK_INPUT; - count = x_catch_errors (dpy); + x_catch_errors (dpy); if (try_XLoadQueryFont) { @@ -9474,7 +9452,7 @@ x_list_fonts (f, pattern, size, maxnames) } } - x_uncatch_errors (dpy, count); + x_uncatch_errors (dpy); UNBLOCK_INPUT; if (names) @@ -9565,7 +9543,7 @@ x_list_fonts (f, pattern, size, maxnames) XFontStruct *thisinfo; BLOCK_INPUT; - count = x_catch_errors (dpy); + x_catch_errors (dpy); thisinfo = XLoadQueryFont (dpy, SDATA (XCAR (tem))); if (x_had_errors_p (dpy)) @@ -9575,7 +9553,7 @@ x_list_fonts (f, pattern, size, maxnames) thisinfo = NULL; x_clear_errors (dpy); } - x_uncatch_errors (dpy, count); + x_uncatch_errors (dpy); UNBLOCK_INPUT; if (thisinfo) @@ -9731,7 +9709,6 @@ x_load_font (f, fontname, size) { struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); Lisp_Object font_names; - int count; /* Get a list of all the fonts that match this name. Once we have a list of matching fonts, we compare them against the fonts @@ -9770,7 +9747,7 @@ x_load_font (f, fontname, size) fontname = (char *) SDATA (XCAR (font_names)); BLOCK_INPUT; - count = x_catch_errors (FRAME_X_DISPLAY (f)); + x_catch_errors (FRAME_X_DISPLAY (f)); font = (XFontStruct *) XLoadQueryFont (FRAME_X_DISPLAY (f), fontname); if (x_had_errors_p (FRAME_X_DISPLAY (f))) { @@ -9779,7 +9756,7 @@ x_load_font (f, fontname, size) font = NULL; x_clear_errors (FRAME_X_DISPLAY (f)); } - x_uncatch_errors (FRAME_X_DISPLAY (f), count); + x_uncatch_errors (FRAME_X_DISPLAY (f)); UNBLOCK_INPUT; if (!font) return NULL; @@ -10552,7 +10529,6 @@ x_term_init (display_name, xrm_option, resource_name) Display *dpy = dpyinfo->display; XrmValue d, fr, to; Font font; - int count; d.addr = (XPointer)&dpy; d.size = sizeof (Display *); @@ -10560,12 +10536,12 @@ x_term_init (display_name, xrm_option, resource_name) fr.size = sizeof (XtDefaultFont); to.size = sizeof (Font *); to.addr = (XPointer)&font; - count = x_catch_errors (dpy); + x_catch_errors (dpy); if (!XtCallConverter (dpy, XtCvtStringToFont, &d, 1, &fr, &to, NULL)) abort (); if (x_had_errors_p (dpy) || !XQueryFont (dpy, font)) XrmPutLineResource (&xrdb, "Emacs.dialog.*.font: 9x15"); - x_uncatch_errors (dpy, count); + x_uncatch_errors (dpy); } #endif #endif |