2008/2/13, Dmitry Timoshkov <[EMAIL PROTECTED]>:
> "Maarten Lankhorst" <[EMAIL PROTECTED]> wrote:
>
>  > This makes the tests pass on my pc.
>
>  Perhaps there is something less hacky way like GdiFlush() which is more
>  appropriate for this.
I created a patch that does GdiFlush and waits up to .5 seconds after
a resolution change, are you ok with that?

Cheers,
Maarten.
diff --git a/dlls/d3d9/tests/Makefile.in b/dlls/d3d9/tests/Makefile.in
index 37befbe..9f8308d 100644
--- a/dlls/d3d9/tests/Makefile.in
+++ b/dlls/d3d9/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = d3d9.dll
-IMPORTS   = user32 kernel32
+IMPORTS   = user32 kernel32 gdi32
 EXTRALIBS = -ldxerr9 -luuid -ldxguid
 
 CTESTS = \
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index fdafb88..35e6dd1 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -125,6 +125,7 @@ static IDirect3DDevice9 *init_d3d9(void)
         hr = IDirect3D9_CreateDevice(d3d9_ptr, D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, present_parameters.hDeviceWindow, 
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device_ptr);
     }
     ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE, "IDirect3D_CreateDevice 
returned: %s\n", DXGetErrorString9(hr));
+    GdiFlush();
 
     return device_ptr;
 }
diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index 3d8fecb..2a3a2c8 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -74,6 +74,7 @@ static BOOL createObjects(void)
         trace("SetDisplayMode failed\n");
         goto err;
     }
+    GdiFlush();
 
     hr = IDirectDraw7_QueryInterface(DirectDraw, &IID_IDirect3D7, (void**) 
&Direct3D);
     if (hr == E_NOINTERFACE) goto err;
@@ -844,6 +845,7 @@ static BOOL D3D1_createObjects(void)
     if (FAILED(hr)) {
         return FALSE;
     }
+    GdiFlush();
 
     hr = IDirectDraw_QueryInterface(DirectDraw1, &IID_IDirect3D, (void**) 
&Direct3D1);
     ok(hr==DD_OK, "QueryInterface returned: %x\n", hr);
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index e580fd6..c485059 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -43,6 +43,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(graphics);
 
 #define ABS(x)    ((x)<0?(-(x)):(x))
 
+DWORD LastChangedResolutionTicks = 0;
+
   /* ROP code to GC function conversion */
 const int X11DRV_XROPfunction[16] =
 {
@@ -1374,3 +1376,17 @@ DWORD X11DRV_SetDCOrg( X11DRV_PDEVICE *physDev, INT x, 
INT y )
     physDev->dc_rect.top = y - physDev->drawable_rect.top;
     return ret;
 }
+
+/***********************************************************************
+ *           GdiFlush   (X11DRV.@)
+ */
+BOOL X11DRV_GdiFlush(void)
+{
+    DWORD Ticks;
+    TRACE("\n");
+    XSync(gdi_display, False);
+    Ticks = GetTickCount();
+    if (Ticks - LastChangedResolutionTicks < 500)
+        Sleep(500 - (Ticks - LastChangedResolutionTicks));
+    return TRUE;
+}
diff --git a/dlls/winex11.drv/winex11.drv.spec 
b/dlls/winex11.drv/winex11.drv.spec
index 74ddb66..7280c02 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -16,6 +16,7 @@
 @ cdecl ExtEscape(ptr long long ptr long ptr) X11DRV_ExtEscape
 @ cdecl ExtFloodFill(ptr long long long long) X11DRV_ExtFloodFill
 @ cdecl ExtTextOut(ptr long long long ptr ptr long ptr) X11DRV_ExtTextOut
+@ cdecl GdiFlush() X11DRV_GdiFlush
 @ cdecl GetBitmapBits(long ptr long) X11DRV_GetBitmapBits
 @ cdecl GetCharWidth(ptr long long ptr) X11DRV_GetCharWidth
 @ cdecl GetDCOrgEx(ptr ptr) X11DRV_GetDCOrgEx
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 8f80452..6badff5 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -436,6 +436,7 @@ extern INT X11DRV_DCICommand(INT cbInput, const struct 
_DCICMD *lpCmd, LPVOID lp
 extern void X11DRV_GDI_Finalize(void);
 
 extern Display *gdi_display;  /* display to use for all GDI functions */
+extern DWORD LastChangedResolutionTicks; /* Ticks of last time resolution was 
changed */
 
 /* X11 GDI palette driver */
 
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c
index fd930a2..c99b6c6 100644
--- a/dlls/winex11.drv/xrandr.c
+++ b/dlls/winex11.drv/xrandr.c
@@ -230,6 +230,7 @@ static LONG X11DRV_XRandR_SetCurrentMode(int mode)
     if (stat == RRSetConfigSuccess)
     {
         X11DRV_resize_desktop( dd_modes[mode].dwWidth, dd_modes[mode].dwHeight 
);
+        LastChangedResolutionTicks = GetTickCount();
         return DISP_CHANGE_SUCCESSFUL;
     }
 


Reply via email to