[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master fcb5d3e 2/5: Add x_catch_errors_with_handler.
From: |
Ken Raeburn |
Subject: |
[Emacs-diffs] master fcb5d3e 2/5: Add x_catch_errors_with_handler. |
Date: |
Sun, 11 Oct 2015 05:24:53 +0000 |
branch: master
commit fcb5d3e8b158f7ea8492aa14f79804fae18e76f9
Author: Ken Raeburn <address@hidden>
Commit: Ken Raeburn <address@hidden>
Add x_catch_errors_with_handler.
* src/xterm.c (struct x_error_message_stack): Add new fields for a
callback function and associated data pointer.
(x_error_catcher): If the callback function is set, call it after
saving the error message string.
(x_catch_errors_with_handler): Renamed from x_catch_errors but now
accepts a callback function and data pointer.
(x_catch_errors): Now a wrapper function.
* src/xterm.h (x_special_error_handler): New typedef.
(x_catch_errors_with_handler): Declare.
---
src/xterm.c | 16 +++++++++++++++-
src/xterm.h | 5 +++++
2 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index 6e870c5..7ff6b17 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -9190,6 +9190,8 @@ x_text_icon (struct frame *f, const char *icon_name)
struct x_error_message_stack {
char string[X_ERROR_MESSAGE_SIZE];
Display *dpy;
+ x_special_error_handler handler;
+ void *handler_data;
struct x_error_message_stack *prev;
};
static struct x_error_message_stack *x_error_message;
@@ -9204,6 +9206,9 @@ x_error_catcher (Display *display, XErrorEvent *event)
XGetErrorText (display, event->error_code,
x_error_message->string,
X_ERROR_MESSAGE_SIZE);
+ if (x_error_message->handler)
+ x_error_message->handler (display, event, x_error_message->string,
+ x_error_message->handler_data);
}
/* Begin trapping X errors for display DPY. Actually we trap X errors
@@ -9223,7 +9228,8 @@ x_error_catcher (Display *display, XErrorEvent *event)
x_had_errors_p or x_check_errors. */
void
-x_catch_errors (Display *dpy)
+x_catch_errors_with_handler (Display *dpy, x_special_error_handler handler,
+ void *handler_data)
{
struct x_error_message_stack *data = xmalloc (sizeof *data);
@@ -9232,10 +9238,18 @@ x_catch_errors (Display *dpy)
data->dpy = dpy;
data->string[0] = 0;
+ data->handler = handler;
+ data->handler_data = handler_data;
data->prev = x_error_message;
x_error_message = data;
}
+void
+x_catch_errors (Display *dpy)
+{
+ x_catch_errors_with_handler (dpy, NULL, NULL);
+}
+
/* Undo the last x_catch_errors call.
DPY should be the display that was passed to x_catch_errors.
diff --git a/src/xterm.h b/src/xterm.h
index fe3455f..f7d2803 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1024,8 +1024,13 @@ XrmDatabase x_load_resources (Display *, const char *,
const char *,
/* Defined in xterm.c */
+typedef void (*x_special_error_handler)(Display *, XErrorEvent *, char *,
+ void *);
+
extern bool x_text_icon (struct frame *, const char *);
extern void x_catch_errors (Display *);
+extern void x_catch_errors_with_handler (Display *, x_special_error_handler,
+ void *);
extern void x_check_errors (Display *, const char *)
ATTRIBUTE_FORMAT_PRINTF (2, 0);
extern bool x_had_errors_p (Display *);