changelog: Reduced the time for a window with many child windows to be displayed. More info: A large application was taking up to 10 seconds to display its main window. This appears to be due to X individually exposing every child window (of which there are very many) of the main application window and then wine forcing a redraw on the parent of every child and then all the subchildren again (!) resulting in the accumulation of a huge redraw list. This patch will force a redraw only on the child and not the parent as X will eventually expose that anyway. After applying this patch the initial redraw dropped from around 10 seconds to about 2 seconds and I could not find any painting problems If anyone else is having slow application loading problems of this nature, then please try this patch. Dave Hawkes
Index: dlls/x11drv/winpos.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/winpos.c,v retrieving revision 1.34 diff -u -r1.34 winpos.c --- dlls/x11drv/winpos.c 2001/11/13 22:02:20 1.34 +++ dlls/x11drv/winpos.c 2001/12/13 19:40:01 @@ -233,7 +233,7 @@ * * Expose a region of a given window. */ -static void expose_window( HWND hwnd, RECT *rect, HRGN rgn, int flags ) +static void expose_window( HWND hwnd, RECT *rect, HRGN rgn, int flags, int noparents ) { POINT offset; HWND top = 0; @@ -242,7 +242,7 @@ /* find the top most parent that doesn't clip children or siblings and * invalidate the area on its parent, including all children */ - if ((list = WIN_ListParents( hwnd ))) + if (!noparents && (list = WIN_ListParents( hwnd ))) { HWND current = hwnd; LONG style = GetWindowLongW( hwnd, GWL_STYLE ); @@ -269,7 +269,6 @@ } HeapFree( GetProcessHeap(), 0, list ); } - if (!top) top = hwnd; /* make coords relative to top */ @@ -311,7 +310,7 @@ if (ret != NULLREGION) { if (get_covered_region( win, hrgn ) != NULLREGION) - expose_window( win->parent, NULL, hrgn, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN ); + expose_window( win->parent, NULL, hrgn, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN, 0 ); } DeleteObject( hrgn ); } @@ -360,7 +359,7 @@ { if (get_covered_region( win, hrgn ) != NULLREGION) expose_window( win->hwndSelf, NULL, hrgn, - RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN ); + RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 ); } DeleteObject( hrgn ); @@ -396,7 +395,7 @@ } WIN_ReleasePtr( win ); - expose_window( hwnd, &rect, 0, flags ); + expose_window( hwnd, &rect, 0, flags, 1 ); }