[PATCH] winex11.drv: Use Unsorted instead of YXBanded in Xlib calls that may use multiple rectangles.

Zhiyi Zhang zzhang at codeweavers.com
Wed Nov 4 00:47:39 CST 2020


There is no guarantees in Wine to make sure the rectangles passed to Xlib calls fit the
requirement of using YXBanded. See 'man 3 XSetClipRectangles' for details of YXBanded.

Fix a bug that OCTOPATH TRAVELER may crash with BadMatch X errors when changing resolutions in
fullscreen mode.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/winex11.drv/bitblt.c   | 4 ++--
 dlls/winex11.drv/graphics.c | 2 +-
 dlls/winex11.drv/window.c   | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index fad183b0b01..4e1a4430966 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1737,7 +1737,7 @@ static void update_surface_region( struct x11drv_window_surface *surface )
     if ((data = X11DRV_GetRegionData( rgn, 0 )))
     {
         XShapeCombineRectangles( gdi_display, surface->window, ShapeBounding, 0, 0,
-                                 (XRectangle *)data->Buffer, data->rdh.nCount, ShapeSet, YXBanded );
+                                 (XRectangle *)data->Buffer, data->rdh.nCount, ShapeSet, Unsorted );
         HeapFree( GetProcessHeap(), 0, data );
     }
 
@@ -1879,7 +1879,7 @@ static void CDECL x11drv_surface_set_region( struct window_surface *window_surfa
         if ((data = X11DRV_GetRegionData( surface->region, 0 )))
         {
             XSetClipRectangles( gdi_display, surface->gc, 0, 0,
-                                (XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
+                                (XRectangle *)data->Buffer, data->rdh.nCount, Unsorted );
             HeapFree( GetProcessHeap(), 0, data );
         }
     }
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index 77ca60ec44d..bf30227f319 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -252,7 +252,7 @@ static void update_x11_clipping( X11DRV_PDEVICE *physDev, HRGN rgn )
     else if ((data = X11DRV_GetRegionData( rgn, 0 )))
     {
         XSetClipRectangles( gdi_display, physDev->gc, physDev->dc_rect.left, physDev->dc_rect.top,
-                            (XRectangle *)data->Buffer, data->rdh.nCount, YXBanded );
+                            (XRectangle *)data->Buffer, data->rdh.nCount, Unsorted );
         HeapFree( GetProcessHeap(), 0, data );
     }
 }
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 457173964eb..43173d51eba 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -423,7 +423,7 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region )
                                      data->window_rect.left - data->whole_rect.left,
                                      data->window_rect.top - data->whole_rect.top,
                                      (XRectangle *)pRegionData->Buffer,
-                                     pRegionData->rdh.nCount, ShapeSet, YXBanded );
+                                     pRegionData->rdh.nCount, ShapeSet, Unsorted );
             HeapFree(GetProcessHeap(), 0, pRegionData);
             data->shaped = TRUE;
         }
-- 
2.27.0



More information about the wine-devel mailing list