Clear the internal paint flag in the server before returning a

WM_PAINT message to avoid an extra server round-trip.
This commit is contained in:
Alexandre Julliard 2005-03-10 17:19:33 +00:00
parent 454c1b7599
commit b9a9de6eb9
2 changed files with 9 additions and 10 deletions

View File

@ -2692,11 +2692,6 @@ BOOL WINAPI PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT f
return FALSE;
}
WIN_RestoreWndsLock( locks );
if (msg.message == WM_PAINT) /* clear internal paint flag */
RedrawWindow( msg.hwnd, NULL, 0, RDW_NOINTERNALPAINT | RDW_NOCHILDREN );
if ((queue = QUEUE_Current()))
{
queue->GetMessageTimeVal = msg.time;
@ -2706,6 +2701,8 @@ BOOL WINAPI PeekMessageW( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT f
HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, flags & PM_REMOVE, (LPARAM)&msg, TRUE );
WIN_RestoreWndsLock( locks );
/* copy back our internal safe copy of message data to msg_out.
* msg_out is a variable from the *program*, so it can't be used
* internally as it can get "corrupted" by our use of SendMessage()

View File

@ -589,20 +589,22 @@ static struct window *find_child_to_repaint( struct window *parent, struct threa
}
/* find a window that needs to receive a WM_PAINT */
/* find a window that needs to receive a WM_PAINT; also clear its internal paint flag */
user_handle_t find_window_to_repaint( user_handle_t parent, struct thread *thread )
{
struct window *ptr, *win = find_child_to_repaint( top_window, thread );
if (win)
if (win && parent)
{
if (!parent) return win->handle;
/* check that it is a child of the specified parent */
for (ptr = win; ptr; ptr = ptr->parent)
if (ptr->handle == parent) return win->handle;
if (ptr->handle == parent) break;
/* otherwise don't return any window, we don't repaint a child before its parent */
if (!ptr) win = NULL;
}
return 0;
if (!win) return 0;
win->paint_flags &= ~PAINT_INTERNAL;
return win->handle;
}