Stefan Dösinger : user32: Add a test for WM_DISPLAYCHANGE.
Alexandre Julliard
julliard at winehq.org
Fri Dec 14 07:39:51 CST 2007
Module: wine
Branch: master
Commit: 920506b23076ded0d03146af99268cc832c87987
URL: http://source.winehq.org/git/wine.git/?a=commit;h=920506b23076ded0d03146af99268cc832c87987
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Dec 14 00:19:08 2007 +0100
user32: Add a test for WM_DISPLAYCHANGE.
---
dlls/user32/tests/sysparams.c | 88 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 87 insertions(+), 1 deletions(-)
diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index 68e6cca..ecaae35 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -150,16 +150,26 @@ static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam
LPARAM lParam );
static int change_counter;
static int change_last_param;
+static int last_bpp;
+static BOOL displaychange_ok = FALSE, displaychange_test_active = FALSE;
+static HANDLE displaychange_sem = 0;
static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
switch (msg) {
+ case WM_DISPLAYCHANGE:
+ ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
+ last_bpp = wParam;
+ displaychange_ok = FALSE;
+ ReleaseSemaphore(displaychange_sem, 1, 0);
+ break;
+
case WM_SETTINGCHANGE:
if (change_counter>0) {
/* ignore these messages caused by resizing of toolbars */
- if( wParam == SPI_SETWORKAREA) break;
+ if( wParam == SPI_SETWORKAREA || displaychange_test_active) break;
if( change_last_param == SPI_SETWORKAREA) {
change_last_param = wParam;
break;
@@ -175,6 +185,7 @@ static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam
PostQuitMessage( 0 );
break;
+ /* drop through */
default:
return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
}
@@ -2169,6 +2180,78 @@ static void test_SPI_SETWALLPAPER( void ) /* 115 */
test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
}
+static void test_WM_DISPLAYCHANGE(void)
+{
+ DEVMODE mode, startmode;
+ int start_bpp, last_set_bpp = 0;
+ int test_bpps[] = {8, 16, 24, 32}, i;
+ LONG change_ret;
+ DWORD wait_ret;
+
+ displaychange_test_active = TRUE;
+
+ memset(&startmode, 0, sizeof(startmode));
+ startmode.dmSize = sizeof(startmode);
+ EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &startmode);
+ start_bpp = startmode.dmBitsPerPel;
+
+ displaychange_sem = CreateSemaphore(NULL, 0, 1, NULL);
+
+ for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
+ last_bpp = -1;
+
+ memset(&mode, 0, sizeof(mode));
+ mode.dmSize = sizeof(mode);
+ mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ mode.dmBitsPerPel = test_bpps[i];
+ mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
+ mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
+
+ change_counter = 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
+ displaychange_ok = TRUE;
+ change_ret = ChangeDisplaySettingsEx(NULL, &mode, NULL, 0, NULL);
+ /* Wait quite long for the message, screen setting changes can take some time */
+ if(change_ret == DISP_CHANGE_SUCCESSFUL) {
+ wait_ret = WaitForSingleObject(displaychange_sem, 10000);
+ ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
+ }
+ displaychange_ok = FALSE;
+
+ if(change_ret != DISP_CHANGE_SUCCESSFUL) {
+ skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret);
+ ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despide mode change failure\n", last_bpp);
+ continue;
+ }
+
+ if((start_bpp != test_bpps[i] ||
+ (test_bpps[i] == 32 && last_bpp == 24)) &&
+ !(test_bpps[i] == 24 && start_bpp == 32)) {
+ todo_wine ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
+ } else {
+ ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
+ }
+ last_set_bpp = test_bpps[i];
+ }
+
+ if(start_bpp != last_set_bpp && last_set_bpp != 0) {
+ memset(&mode, 0, sizeof(mode));
+ mode.dmSize = sizeof(mode);
+ mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ mode.dmBitsPerPel = start_bpp;
+ mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
+ mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
+
+ displaychange_ok = TRUE;
+ change_ret = ChangeDisplaySettingsEx(NULL, &mode, NULL, 0, NULL);
+ WaitForSingleObject(displaychange_sem, 10000);
+ displaychange_ok = FALSE;
+ CloseHandle(displaychange_sem);
+ displaychange_sem = 0;
+ }
+
+ displaychange_test_active = FALSE;
+}
+
/*
* Registry entries for the system parameters.
* Names are created by 'SET' flags names.
@@ -2210,6 +2293,9 @@ static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
test_SPI_SETWHEELSCROLLLINES(); /* 105 */
test_SPI_SETMENUSHOWDELAY(); /* 107 */
test_SPI_SETWALLPAPER(); /* 115 */
+
+ test_WM_DISPLAYCHANGE();
+
SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
return 0;
}
More information about the wine-cvs
mailing list