Hi all, This patch will prevent Wine to crash with an X11 error when remote displaying to a XFree 4.2 server with DGA / XVidMode enabled. Changelog: Test for X11 errors for DGA2 and XVidMode extensions -- Lionel Ulmer - http://www.bbrox.org/
Index: dlls/x11drv/dga2.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/dga2.c,v retrieving revision 1.9 diff -u -r1.9 dga2.c --- dlls/x11drv/dga2.c 31 May 2002 23:40:57 -0000 1.9 +++ dlls/x11drv/dga2.c 13 Jul 2002 18:22:42 -0000 @@ -58,9 +58,15 @@ info->dwWidth, info->dwHeight, info->dwBPP, info->wRefreshRate); } +static int DGA2ErrorHandler(Display *dpy, XErrorEvent *event, void *arg) +{ + return 1; +} + void X11DRV_XF86DGA2_Init(void) { int nmodes, major, minor, i; + Bool ok; if (xf86dga2_modes) return; /* already initialized? */ @@ -71,7 +77,10 @@ if (!TSXDGAQueryExtension(gdi_display, &dga_event, &dga_error)) return; - if (!TSXDGAQueryVersion(gdi_display, &major, &minor)) return; + X11DRV_expect_error(gdi_display, DGA2ErrorHandler, NULL); + ok = TSXDGAQueryVersion(gdi_display, &major, &minor); + if (X11DRV_check_error()) ok = FALSE; + if (!ok) return; if (major < 2) return; /* only bother with DGA 2+ */ Index: dlls/x11drv/xvidmode.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/xvidmode.c,v retrieving revision 1.14 diff -u -r1.14 xvidmode.c --- dlls/x11drv/xvidmode.c 28 Mar 2002 22:22:06 -0000 1.14 +++ dlls/x11drv/xvidmode.c 13 Jul 2002 18:22:42 -0000 @@ -93,9 +93,15 @@ info->dwAlphaBitMask = 0; } +static int XVidModeErrorHandler(Display *dpy, XErrorEvent *event, void *arg) +{ + return 1; +} + void X11DRV_XF86VM_Init(void) { int nmodes, i; + Bool ok; if (xf86vm_major) return; /* already initialized? */ @@ -106,7 +112,10 @@ /* see if XVidMode is available */ if (!TSXF86VidModeQueryExtension(gdi_display, &xf86vm_event, &xf86vm_error)) return; - if (!TSXF86VidModeQueryVersion(gdi_display, &xf86vm_major, &xf86vm_minor)) return; + X11DRV_expect_error(gdi_display, XVidModeErrorHandler, NULL); + ok = TSXF86VidModeQueryVersion(gdi_display, &xf86vm_major, &xf86vm_minor); + if (X11DRV_check_error()) ok = FALSE; + if (!ok) return; #ifdef X_XF86VidModeSetGammaRamp if (xf86vm_major > 2 || (xf86vm_major == 2 && xf86vm_minor >= 1))