Dmitry Timoshkov : user32: Add more window style tests, make them pass under Wine.
Alexandre Julliard
julliard at winehq.org
Wed Dec 7 13:57:13 CST 2011
Module: wine
Branch: master
Commit: 8f565eb6ae2663e2ef11342e85ce1cada1f6404c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8f565eb6ae2663e2ef11342e85ce1cada1f6404c
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Wed Dec 7 16:06:23 2011 +0800
user32: Add more window style tests, make them pass under Wine.
---
dlls/user32/tests/win.c | 56 +++++++++++++++++++++++++++++++++++++---------
dlls/user32/win.c | 23 +++++++++++-------
2 files changed, 59 insertions(+), 20 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index a090389..a85c8ad 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -3696,6 +3696,7 @@ static void register_style_check_class(void)
};
atomStyleCheckClass = RegisterClass(&wc);
+ assert(atomStyleCheckClass);
}
static void check_window_style(DWORD dwStyleIn, DWORD dwExStyleIn, DWORD dwStyleOut, DWORD dwExStyleOut)
@@ -3723,12 +3724,23 @@ static void check_window_style(DWORD dwStyleIn, DWORD dwExStyleIn, DWORD dwStyle
dwActualStyle = GetWindowLong(hwnd, GWL_STYLE);
dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
- ok((dwActualStyle == dwStyleOut) && (dwActualExStyle == dwExStyleOut),
- "Style (0x%08x) should really be 0x%08x and/or Ex style (0x%08x) should really be 0x%08x\n",
- dwActualStyle, dwStyleOut, dwActualExStyle, dwExStyleOut);
+ ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle);
+ ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle);
/* try setting the styles explicitly */
SetWindowLong( hwnd, GWL_EXSTYLE, dwExStyleIn );
+ dwActualStyle = GetWindowLong(hwnd, GWL_STYLE);
+ dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
+ /* WS_EX_WINDOWEDGE can't always be changed */
+ if (dwExStyleIn & WS_EX_DLGMODALFRAME)
+ dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE;
+ else if ((dwActualStyle & (WS_DLGFRAME | WS_THICKFRAME)) && !(dwExStyleIn & WS_EX_STATICEDGE))
+ dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE;
+ else
+ dwExStyleOut = dwExStyleIn & ~WS_EX_WINDOWEDGE;
+ ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle);
+ ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle);
+
SetWindowLong( hwnd, GWL_STYLE, dwStyleIn );
dwActualStyle = GetWindowLong(hwnd, GWL_STYLE);
dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
@@ -3736,15 +3748,18 @@ static void check_window_style(DWORD dwStyleIn, DWORD dwExStyleIn, DWORD dwStyle
if ((dwStyleIn & (WS_CHILD|WS_POPUP)) == WS_CHILD) dwStyleOut = dwStyleIn;
else dwStyleOut = dwStyleIn | WS_CLIPSIBLINGS;
/* WS_EX_WINDOWEDGE can't always be changed */
- if ((dwExStyleIn & WS_EX_DLGMODALFRAME) || (dwStyleIn & WS_THICKFRAME))
+ if (dwExStyleIn & WS_EX_DLGMODALFRAME)
dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE;
- else if (dwStyleIn & (WS_CHILD | WS_POPUP))
+ else if ((dwActualStyle & (WS_DLGFRAME | WS_THICKFRAME)) && !(dwExStyleIn & WS_EX_STATICEDGE))
+ dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE;
+ else
dwExStyleOut = dwExStyleIn & ~WS_EX_WINDOWEDGE;
+ ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle);
+ /* FIXME: Remove the condition below once Wine is fixed */
+ if (dwActualExStyle != dwExStyleOut)
+ todo_wine ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle);
else
- dwExStyleOut = dwExStyleIn;
- ok((dwActualStyle == dwStyleOut) && (dwActualExStyle == dwExStyleOut),
- "%08x/%08x: Style (0x%08x) should really be 0x%08x and/or Ex style (0x%08x) should really be 0x%08x\n",
- dwStyleIn, dwExStyleIn, dwActualStyle, dwStyleOut, dwActualExStyle, dwExStyleOut);
+ ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle);
DestroyWindow(hwnd);
if (hwndParent) DestroyWindow(hwndParent);
@@ -3756,17 +3771,36 @@ static void test_window_styles(void)
register_style_check_class();
check_window_style(0, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE);
+ check_window_style(WS_DLGFRAME, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE);
+ check_window_style(WS_THICKFRAME, 0, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE);
+ check_window_style(WS_DLGFRAME, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE);
+ check_window_style(WS_THICKFRAME, WS_EX_STATICEDGE, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE);
check_window_style(WS_OVERLAPPEDWINDOW, 0, WS_CLIPSIBLINGS|WS_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE);
check_window_style(WS_CHILD, 0, WS_CHILD, 0);
+ check_window_style(WS_CHILD|WS_DLGFRAME, 0, WS_CHILD|WS_DLGFRAME, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD|WS_THICKFRAME, 0, WS_CHILD|WS_THICKFRAME, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE);
+ check_window_style(WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE);
+ check_window_style(WS_CHILD|WS_CAPTION, 0, WS_CHILD|WS_CAPTION, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD|WS_CAPTION|WS_SYSMENU, 0, WS_CHILD|WS_CAPTION|WS_SYSMENU, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0);
+ check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME, WS_CHILD, WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
+ check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
check_window_style(WS_CHILD|WS_POPUP, 0, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0);
+ check_window_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, 0, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, 0, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE);
+ check_window_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE);
+ check_window_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE);
check_window_style(WS_CHILD|WS_POPUP, WS_EX_APPWINDOW, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, WS_EX_APPWINDOW);
check_window_style(WS_CHILD|WS_POPUP, WS_EX_WINDOWEDGE, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0);
check_window_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0);
check_window_style(0, WS_EX_TOOLWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW);
check_window_style(WS_POPUP, 0, WS_POPUP|WS_CLIPSIBLINGS, 0);
check_window_style(WS_POPUP, WS_EX_WINDOWEDGE, WS_POPUP|WS_CLIPSIBLINGS, 0);
- check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME, WS_CHILD, WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
- check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME);
+ check_window_style(WS_POPUP|WS_DLGFRAME, 0, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE);
+ check_window_style(WS_POPUP|WS_THICKFRAME, 0, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE);
+ check_window_style(WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE);
+ check_window_style(WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE);
check_window_style(WS_CAPTION, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE);
check_window_style(0, WS_EX_APPWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_APPWINDOW|WS_EX_WINDOWEDGE);
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index f94b181..74e8d6b 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1324,14 +1324,15 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
wndPtr->dwStyle |= WS_CAPTION;
}
- /*
- * WS_EX_WINDOWEDGE appears to be enforced based on the other styles, so
- * why does the user get to set it?
- */
-
- if ((wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) ||
- (wndPtr->dwStyle & (WS_DLGFRAME | WS_THICKFRAME)))
+ /* WS_EX_WINDOWEDGE depends on some other styles */
+ if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME)
wndPtr->dwExStyle |= WS_EX_WINDOWEDGE;
+ else if (wndPtr->dwStyle & (WS_DLGFRAME | WS_THICKFRAME))
+ {
+ if (!((wndPtr->dwExStyle & WS_EX_STATICEDGE) &&
+ (wndPtr->dwStyle & (WS_CHILD | WS_POPUP))))
+ wndPtr->dwExStyle |= WS_EX_WINDOWEDGE;
+ }
else
wndPtr->dwExStyle &= ~WS_EX_WINDOWEDGE;
@@ -2176,6 +2177,8 @@ LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, UINT size, LONG_PTR newval, B
newval = style.styleNew;
/* WS_CLIPSIBLINGS can't be reset on top-level windows */
if (wndPtr->parent == GetDesktopWindow()) newval |= WS_CLIPSIBLINGS;
+ /* FIXME: changing WS_DLGFRAME | WS_THICKFRAME is supposed to change
+ WS_EX_WINDOWEDGE too */
break;
case GWL_EXSTYLE:
style.styleOld = wndPtr->dwExStyle;
@@ -2186,9 +2189,11 @@ LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, UINT size, LONG_PTR newval, B
/* WS_EX_TOPMOST can only be changed through SetWindowPos */
newval = (style.styleNew & ~WS_EX_TOPMOST) | (wndPtr->dwExStyle & WS_EX_TOPMOST);
/* WS_EX_WINDOWEDGE depends on some other styles */
- if ((newval & WS_EX_DLGMODALFRAME) || (wndPtr->dwStyle & WS_THICKFRAME))
+ if (newval & WS_EX_DLGMODALFRAME)
+ newval |= WS_EX_WINDOWEDGE;
+ else if (!(newval & WS_EX_STATICEDGE) && (wndPtr->dwStyle & (WS_DLGFRAME | WS_THICKFRAME)))
newval |= WS_EX_WINDOWEDGE;
- else if (wndPtr->dwStyle & (WS_CHILD|WS_POPUP))
+ else
newval &= ~WS_EX_WINDOWEDGE;
break;
case GWLP_HWNDPARENT:
More information about the wine-cvs
mailing list