dlls/user/painting.c is getting caught in an infinite loop in the function update_now() I added two TRACE statements to try to figure out what is going on. Uncommenting the SendMessageW() line allows the loop to exit. See the attached win traces for the working and broken cases.
I don't know enough about what this function is trying to do to fix it...
The bug can be reproduced using Irfan View's ( www.irfanview.com ) slideshow functions.
--- painting.c.orig 2005-02-28 12:01:55.000000000 -0700 +++ painting.c 2005-03-04 08:18:52.000000000 -0700 @@ -340,6 +340,7 @@ else if (rdw_flags & RDW_ALLCHILDREN) flags |= UPDATE_ALLCHILDREN;
if (!get_update_flags( hwnd, &child, &flags )) break; +TRACE( "flags = %d, child = %d, prev = %d\n", flags, child , prev ); if (!flags) break; /* nothing more to do */
if (child == prev) /* same window again, didn't get repainted properly */ @@ -351,8 +352,10 @@ TRACE( "%p not repainted properly, erasing\n", child ); if ((hrgn = send_ncpaint( child, NULL, &erase_flags ))) { + TRACE( "hrgn = %p, deleting\n", hrgn ); send_erase( child, erase_flags, hrgn, &rect, NULL ); DeleteObject( hrgn ); +// SendMessageW( child, WM_PAINT, 0, 0 ); } } else