summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2006-02-25 23:20:10 +0000
committerChong Yidong <cyd@stupidchicken.com>2006-02-25 23:20:10 +0000
commit9ba8e10d9946be97282d6ba629cf26cd22676a61 (patch)
tree33293d21976e945b3090fb7fed6f15c7806febf7 /src/xterm.c
parentf523e0c3c54c135e24284fe90d8e67120612ff99 (diff)
downloademacs-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.c96
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