This seems like a nice little test case. The UI in question is a single large dialog box put up by the Btrieve 6.15 setup utility. The Btrieve 6.15 redistributables saved in a zip file are only about 500KB, so it's a pretty easy test case to send to anyone interested.
Recipe: Start BTI setup. Press TAB three times to bring to settings combo box. Start logging messages to small readonly text control giving name of current setting (11th control in spy++). Press Uparrow to pick different setting. Note visual problem in Wine.
The problem in Wine is that the bottom window ends up blank. The sequence appears to be: erase bottom window, draw right values for bottom window client areas but not frames, erase bottom window. On Windows, it seems to continue after that with: draw right values for client areas again, then draw frames. Those last two bits are missing in Wine.
Here are message logs taken with spy++:
Microsoft Windows Me <00001> 00000798 S .WM_SHOWWINDOW fShow:False fuStatus:0 (ShowWindow was called) [wParam:00000000 lParam:00000000] <00002> 00000798 R .WM_SHOWWINDOW lResult:00000000 <00003> 00000798 S .WM_WINDOWPOSCHANGING lpwp:007DF2BA [wParam:00000000 lParam:007DF2BA] <00004> 00000798 R .WM_WINDOWPOSCHANGING lResult:00000000 <00005> 00000798 S .WM_WINDOWPOSCHANGED lpwp:007DF2F6 [wParam:00000000 lParam:007DF2F6] <00006> 00000798 R .WM_WINDOWPOSCHANGED lResult:00000000 <00007> 00000798 S .WM_SHOWWINDOW fShow:True fuStatus:0 (ShowWindow was called) [wParam:00000001 lParam:00000000] <00008> 00000798 R .WM_SHOWWINDOW lResult:00000000 <00009> 00000798 S .WM_WINDOWPOSCHANGING lpwp:007DF2BA [wParam:00000000 lParam:007DF2BA] <00010> 00000798 R .WM_WINDOWPOSCHANGING lResult:00000000 <00011> 00000798 S .WM_WINDOWPOSCHANGED lpwp:007DF2F6 [wParam:00000000 lParam:007DF2F6] <00012> 00000798 R .WM_WINDOWPOSCHANGED lResult:00000000 <00013> 00000798 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] <00014> 00000798 S WM_NCPAINT hrgn:00000001 [wParam:00000001 lParam:00000000] <00015> 00000798 R WM_NCPAINT lResult:00000000 <00016> 00000798 S WM_ERASEBKGND hdc:00000DDE [wParam:00000DDE lParam:00000000] <00017> 00000798 R WM_ERASEBKGND fErased:True [lResult:00000001]
Wine <00001> 00020054 S .WM_SHOWWINDOW fShow:False fuStatus:0 (ShowWindow was called) [wParam:00000000 lParam:00000000] <00002> 00020054 R .WM_SHOWWINDOW lResult:00000000 <00003> 00020054 S .WM_WINDOWPOSCHANGING lpwp:40792458 [wParam:00000000 lParam:40792458] <00004> 00020054 R .WM_WINDOWPOSCHANGING lResult:00000000 <00005> 00020054 S .WM_WINDOWPOSCHANGED lpwp:40792458 [wParam:00000000 lParam:40792458] <00006> 00020054 R .WM_WINDOWPOSCHANGED lResult:00000000 <00007> 00020054 S .WM_SHOWWINDOW fShow:True fuStatus:0 (ShowWindow was called) [wParam:00000001 lParam:00000000] <00008> 00020054 R .WM_SHOWWINDOW lResult:00000000 <00009> 00020054 S .WM_WINDOWPOSCHANGING lpwp:40792458 [wParam:00000000 lParam:40792458] <00010> 00020054 R .WM_WINDOWPOSCHANGING lResult:00000000 <00011> 00020054 S .WM_WINDOWPOSCHANGED lpwp:40792458 [wParam:00000000 lParam:40792458] <00012> 00020054 R .WM_WINDOWPOSCHANGED lResult:00000000
----------------------------------------------------- Same thing, but log messages to the 5th control in spy++. This is the VisualCtl that is the frame and background for the entire bottom part of the dialog.
Microsoft Windows Me <00001> 00000780 P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] <00002> 00000780 S WM_NCPAINT hrgn:00000A48 [wParam:00000A48 lParam:00000000] <00003> 00000780 R WM_NCPAINT lResult:00000000 <00004> 00000780 S WM_ERASEBKGND hdc:00000C12 [wParam:00000C12 lParam:00000000] <00005> 00000780 R WM_ERASEBKGND fErased:True [lResult:00000001]
Wine <00001> 0002005A P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000] <00002> 0002005A S WM_ERASEBKGND hdc:00000864 [wParam:00000864 lParam:00000000] <00003> 0002005A R WM_ERASEBKGND fErased:True [lResult:00000001]
"Dan Kegel" dank@kegel.com wrote:
The problem in Wine is that the bottom window ends up blank. The sequence appears to be: erase bottom window, draw right values for bottom window client areas but not frames, erase bottom window. On Windows, it seems to continue after that with: draw right values for client areas again, then draw frames. Those last two bits are missing in Wine.
Accidentally, I'm debugging painting bugs in one of my apps, but your case seems to be a different one. Attached patch makes your app happy, but since I'm not sure that this is a right fix, I'm not sending it to wine-patches.
Dmitry Timoshkov wrote:
Attached patch makes your app happy, but since I'm not sure that this is a right fix, I'm not sending it to wine-patches. ... +++ wine/dlls/x11drv/winpos.c Mon Feb 3 13:24:42 2003 @@ -990,6 +990,8 @@ if (winpos->flags & SWP_SHOWWINDOW) { set_visible_style( winpos->hwnd, TRUE );
RedrawWindow( winpos->hwnd, NULL, 0, RDW_INVALIDATE | RDW_FRAME |
RDW_ERASE | RDW_NOINTERNALPAINT | RDW_ALLCHILDREN );
Sure enough, that appears to fix the problem very nicely. That should help me out a bit as I try to bring up Yardi, which uses Btrieve. - Dan