Zhiyi Zhang (@zhiyi) commented about dlls/comctl32/status.c:
width = parent_rect.right - parent_rect.left; x = parent_rect.left; y = parent_rect.bottom - infoPtr->height;
- MoveWindow (infoPtr->Self, x, y, width, infoPtr->height, TRUE);
- MoveWindow (infoPtr->Self, x, y, width, infoPtr->height, FALSE);
- if(y != infoPtr->y)
InvalidateRect(infoPtr->Self, NULL, FALSE);
- else
- {
update_rect.left = min(infoPtr->width-HORZ_GAP, width);
update_rect.right = max(width, infoPtr->width-HORZ_GAP);
update_rect.top = infoPtr->height;
update_rect.bottom = 0;
InvalidateRect(infoPtr->Self, &update_rect, FALSE);
I think you need to look into why MoveWindow(infoPtr->Self, x, y, width, infoPtr->height, TRUE); doesn't actually repaint the window. I think it's the missing SWP_NOCOPYBITS for NtUserSetWindowPos() in NtUserMoveWindow(). But you need to test and see if that's actually the case. First, you test whether NtUserMoveWindow() calls NtUserSetWindowPos() with SWP_NOCOPYBITS by adding some message tests, e.g., is there a SWP_NOCOPYBITS in WM_WINDOWPOSCHANGING or not. You can search SWP_NOCOPYBITS in user32/tests/msg.c for examples. Depending on the result, if MoveWindow() needs to add SWP_NOCOPYBITS, then you fix MoveWindow(). If not, then adding an InvalidateRect(infoPtr->Self, NULL, FALSE); should be enough. A similar bug is https://bugs.winehq.org/show_bug.cgi?id=52515.