diff options
author | kem <kem> | 2002-04-16 04:36:36 +0000 |
---|---|---|
committer | kem <kem> | 2002-04-16 04:36:36 +0000 |
commit | 0a965cb4c6e0e34abf9f6eda44ffcb5f7d10db25 (patch) | |
tree | 2f08f19dfe6837198c15399bc4dc67d9d8814759 /xc | |
parent | c83e073815603c9f94d7c90c6ce620dba655e51e (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.h | 2 | ||||
-rw-r--r-- | xc/programs/Xserver/hw/dmx/dmxinit.c | 25 |
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); |