Make DrawMenuBar and SetMenu tests pass under Wine. Take 3
Dmitry Timoshkov
dmitry at baikal.ru
Tue Sep 27 10:08:17 CDT 2005
Hello,
Alexandre suggested to move RedrawWindow call to X11DRV_SetWindowPos and
take into account SWP_DEFERERASE, so here is another version of the patch.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Make DrawMenuBar and SetMenu tests pass under Wine.
diff -up cvs/hq/wine/dlls/user/tests/msg.c wine/dlls/user/tests/msg.c
--- cvs/hq/wine/dlls/user/tests/msg.c 2005-09-14 13:48:11.000000000 +0900
+++ wine/dlls/user/tests/msg.c 2005-09-27 23:39:17.000000000 +0900
@@ -189,6 +189,31 @@ static const struct message WmSWP_MoveSe
{ 0 }
};
+/* SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|
+ SWP_NOZORDER|SWP_FRAMECHANGED)
+ * for a visible overlapped window.
+ */
+static const struct message WmSWP_FrameChanged[] = {
+ { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_FRAMECHANGED },
+ { WM_NCCALCSIZE, sent|wparam, 1 },
+ { WM_NCPAINT, sent }, /* wparam != 1 */
+ { WM_ERASEBKGND, sent|optional },
+ { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_FRAMECHANGED|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
+ { 0 }
+};
+/* SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_DEFERERASE|SWP_NOACTIVATE|
+ SWP_NOZORDER|SWP_FRAMECHANGED)
+ * for a visible overlapped window.
+ */
+static const struct message WmSWP_FrameChangedDeferErase[] = {
+ { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE|SWP_NOMOVE|SWP_DEFERERASE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_FRAMECHANGED },
+ { WM_NCCALCSIZE, sent|wparam, 1 },
+ { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOSIZE|SWP_NOMOVE|SWP_DEFERERASE|SWP_NOACTIVATE|SWP_NOZORDER|SWP_FRAMECHANGED|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
+ { WM_PAINT, sent },
+ { WM_NCPAINT, sent|beginpaint }, /* wparam != 1 */
+ { 0 }
+};
+
/* ShowWindow(SW_SHOW) for a not visible overlapped window */
static const struct message WmShowOverlappedSeq[] = {
{ WM_SHOWWINDOW, sent|wparam, 1 },
@@ -923,7 +948,7 @@ static const struct message WmSetMenuVis
{ WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER },
{ WM_NCCALCSIZE, sent|wparam, 1 },
{ EVENT_OBJECT_REORDER, winevent_hook|wparam|lparam, 0, 0 },
- { WM_NCPAINT, sent|wparam, 1 },
+ { WM_NCPAINT, sent }, /* wparam != 1 */
{ WM_GETTEXT, sent|defwinproc|optional },
{ WM_ERASEBKGND, sent|optional },
{ WM_ACTIVATE, sent|optional },
@@ -932,7 +957,7 @@ static const struct message WmSetMenuVis
{ WM_SIZE, sent|defwinproc },
{ EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 },
{ WM_NCCALCSIZE, sent|wparam|optional, 1 },
- { WM_NCPAINT, sent|wparam|optional, 1 },
+ { WM_NCPAINT, sent|optional }, /* wparam != 1 */
{ WM_ERASEBKGND, sent|optional },
{ 0 }
};
@@ -940,7 +965,7 @@ static const struct message WmSetMenuVis
static const struct message WmSetMenuVisibleNoSizeChangeSeq[] = {
{ WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER },
{ WM_NCCALCSIZE, sent|wparam, 1 },
- { WM_NCPAINT, sent|wparam, 1 },
+ { WM_NCPAINT, sent }, /* wparam != 1 */
{ WM_GETTEXT, sent|defwinproc|optional },
{ WM_ERASEBKGND, sent|optional },
{ WM_ACTIVATE, sent|optional },
@@ -953,7 +978,7 @@ static const struct message WmDrawMenuBa
{
{ WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER },
{ WM_NCCALCSIZE, sent|wparam, 1 },
- { WM_NCPAINT, sent|wparam, 1 },
+ { WM_NCPAINT, sent }, /* wparam != 1 */
{ WM_GETTEXT, sent|defwinproc|optional },
{ WM_ERASEBKGND, sent|optional },
{ WM_WINDOWPOSCHANGED, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
@@ -3003,6 +3028,21 @@ static void test_messages(void)
SetWindowPos( hwnd, 0, 200, 200, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE );
ok_sequence(WmSWP_MoveSeq, "SetWindowPos:Move", FALSE );
+ UpdateWindow( hwnd );
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ flush_sequence();
+ trace("testing SWP_FRAMECHANGED\n");
+ SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ ok_sequence(WmSWP_FrameChanged, "SetWindowPos:FrameChanged", FALSE );
+
+ trace("testing SWP_FRAMECHANGED|SWP_DEFERERASE\n");
+ SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_DEFERERASE |
+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ ok_sequence(WmSWP_FrameChangedDeferErase, "SetWindowPos:FrameChangedDeferErase", FALSE );
+
/* popups don't get WM_GETMINMAXINFO */
SetWindowLongW( hwnd, GWL_STYLE, WS_VISIBLE|WS_POPUP );
SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED);
@@ -3219,14 +3259,20 @@ static void test_messages(void)
ok (SetMenu(hwnd, 0), "SetMenu\n");
ok_sequence(WmSetMenuNonVisibleNoSizeChangeSeq, "SetMenu:NonVisibleNoSizeChange", FALSE);
ShowWindow(hwnd, SW_SHOW);
+ UpdateWindow( hwnd );
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
flush_sequence();
ok (SetMenu(hwnd, 0), "SetMenu\n");
- ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange", TRUE);
+ ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange", FALSE);
ok (SetMenu(hwnd, hmenu), "SetMenu\n");
- ok_sequence(WmSetMenuVisibleSizeChangeSeq, "SetMenu:VisibleSizeChange", TRUE);
+ ok_sequence(WmSetMenuVisibleSizeChangeSeq, "SetMenu:VisibleSizeChange", FALSE);
+ UpdateWindow( hwnd );
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ flush_sequence();
ok(DrawMenuBar(hwnd), "DrawMenuBar\n");
- ok_sequence(WmDrawMenuBarSeq, "DrawMenuBar", TRUE);
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg );
+ ok_sequence(WmDrawMenuBarSeq, "DrawMenuBar", FALSE);
DestroyWindow(hwnd);
flush_sequence();
diff -up cvs/hq/wine/dlls/x11drv/winpos.c wine/dlls/x11drv/winpos.c
--- cvs/hq/wine/dlls/x11drv/winpos.c 2005-09-20 12:52:44.000000000 +0900
+++ wine/dlls/x11drv/winpos.c 2005-09-27 23:43:16.000000000 +0900
@@ -727,6 +727,15 @@ BOOL X11DRV_SetWindowPos( WINDOWPOS *win
&newWindowRect, &newClientRect, orig_flags, valid_rects ))
return FALSE;
+ if ( (winpos->flags & SWP_FRAMECHANGED) &&
+ !(winpos->flags & SWP_SHOWWINDOW) &&
+ (GetWindowLongW(winpos->hwnd, GWL_STYLE) & WS_VISIBLE) )
+ {
+ UINT rdw_flags = RDW_FRAME | RDW_ERASE;
+ if ( !(orig_flags & SWP_DEFERERASE) ) rdw_flags |= RDW_ERASENOW;
+ RedrawWindow( winpos->hwnd, NULL, NULL, rdw_flags );
+ }
+
if( winpos->flags & SWP_HIDEWINDOW )
HideCaret(winpos->hwnd);
else if (winpos->flags & SWP_SHOWWINDOW)
More information about the wine-patches
mailing list