summaryrefslogtreecommitdiff
path: root/xc
diff options
context:
space:
mode:
authorkem <kem>2002-04-16 04:36:36 +0000
committerkem <kem>2002-04-16 04:36:36 +0000
commit0a965cb4c6e0e34abf9f6eda44ffcb5f7d10db25 (patch)
tree2f08f19dfe6837198c15399bc4dc67d9d8814759 /xc
parentc83e073815603c9f94d7c90c6ce620dba655e51e (diff)
Add error handler to catch back-end X errors -- fixes xtest crashes
Diffstat (limited to 'xc')
-rw-r--r--xc/programs/Xserver/hw/dmx/dmx.h2
-rw-r--r--xc/programs/Xserver/hw/dmx/dmxinit.c25
2 files changed, 27 insertions, 0 deletions
diff --git a/xc/programs/Xserver/hw/dmx/dmx.h b/xc/programs/Xserver/hw/dmx/dmx.h
index db7531502..272dd4e19 100644
--- a/xc/programs/Xserver/hw/dmx/dmx.h
+++ b/xc/programs/Xserver/hw/dmx/dmx.h
@@ -150,6 +150,8 @@ typedef struct _DMXInputInfo DMXInputInfo;
extern int dmxNumScreens;
extern DMXScreenInfo *dmxScreens;
extern int dmxShadowFB;
+extern XErrorEvent dmxLastErrorEvent;
+extern Bool dmxErrorOccurred;
#define DMX_WRAP(_entry, _newfunc, _saved, _actual) \
do { \
diff --git a/xc/programs/Xserver/hw/dmx/dmxinit.c b/xc/programs/Xserver/hw/dmx/dmxinit.c
index a1f14421c..ed92d862b 100644
--- a/xc/programs/Xserver/hw/dmx/dmxinit.c
+++ b/xc/programs/Xserver/hw/dmx/dmxinit.c
@@ -58,6 +58,25 @@ DMXInputInfo *dmxInputs;
int dmxShadowFB = TRUE;
+XErrorEvent dmxLastErrorEvent;
+Bool dmxErrorOccurred = FALSE;
+
+/* dmxErrorHandler catches errors that occur when calling one of the
+ * back-end servers. */
+static int dmxErrorHandler(Display *dpy, XErrorEvent *ev)
+{
+#define DMX_ERROR_BUF_SIZE 256
+ char buf[DMX_ERROR_BUF_SIZE];
+
+ dmxErrorOccurred = TRUE;
+ dmxLastErrorEvent = *ev;
+
+ XGetErrorText(dpy, ev->error_code, buf, DMX_ERROR_BUF_SIZE);
+ dmxLog(dmxWarning, "dmxErrorHandler: %s\n", buf);
+
+ return 0;
+}
+
/* dmxAddInputName adds a display name to the dmxScreens
* structure. Note: can't use xalloc/xfree here because OsInit() hasn't
* been called yet. Use malloc/free instead. See also
@@ -112,6 +131,11 @@ static void dmxOpenDisplay(DMXScreenInfo *dmxScreen)
dmxScreen->name);
}
+static void dmxSetErrorHandler(DMXScreenInfo *dmxScreen)
+{
+ XSetErrorHandler(dmxErrorHandler);
+}
+
static void dmxPrintScreenInfo(DMXScreenInfo *dmxScreen)
{
XWindowAttributes attribs;
@@ -333,6 +357,7 @@ static void dmxDisplayInit(ScreenInfo *pScreenInfo, DMXScreenInfo *dmxScreen,
int argc, char *charv[])
{
dmxOpenDisplay(dmxScreen);
+ dmxSetErrorHandler(dmxScreen);
dmxCheckForWM(dmxScreen);
dmxGetScreenAttribs(dmxScreen);
dmxGetVisualInfo(dmxScreen);