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;
}