user32: Don't exclude clipped children from the copied window bits since they may be up to date.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-07-20 10:41:43 +02:00
parent 5a61913e90
commit bcbc84e214
4 changed files with 23 additions and 18 deletions

View file

@ -774,7 +774,7 @@ static void copy_bits_from_surface( HWND hwnd, struct window_surface *surface,
char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
BITMAPINFO *info = (BITMAPINFO *)buffer;
void *bits;
UINT flags = UPDATE_NOCHILDREN;
UINT flags = UPDATE_NOCHILDREN | UPDATE_CLIPCHILDREN;
HRGN rgn = get_update_region( hwnd, &flags, NULL );
HDC hdc = GetDCEx( hwnd, rgn, DCX_CACHE | DCX_WINDOW | DCX_EXCLUDERGN );

View file

@ -3748,14 +3748,15 @@ struct get_update_region_reply
/* VARARG(region,rectangles); */
char __pad_20[4];
};
#define UPDATE_NONCLIENT 0x01
#define UPDATE_ERASE 0x02
#define UPDATE_PAINT 0x04
#define UPDATE_INTERNALPAINT 0x08
#define UPDATE_ALLCHILDREN 0x10
#define UPDATE_NOCHILDREN 0x20
#define UPDATE_NOREGION 0x40
#define UPDATE_DELAYED_ERASE 0x80
#define UPDATE_NONCLIENT 0x001
#define UPDATE_ERASE 0x002
#define UPDATE_PAINT 0x004
#define UPDATE_INTERNALPAINT 0x008
#define UPDATE_ALLCHILDREN 0x010
#define UPDATE_NOCHILDREN 0x020
#define UPDATE_NOREGION 0x040
#define UPDATE_DELAYED_ERASE 0x080
#define UPDATE_CLIPCHILDREN 0x100
@ -6419,6 +6420,6 @@ union generic_reply
struct terminate_job_reply terminate_job_reply;
};
#define SERVER_PROTOCOL_VERSION 534
#define SERVER_PROTOCOL_VERSION 535
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View file

@ -2694,14 +2694,15 @@ enum coords_relative
data_size_t total_size; /* total size of the resulting region */
VARARG(region,rectangles); /* list of rectangles for the region (in screen coords) */
@END
#define UPDATE_NONCLIENT 0x01 /* get region for repainting non-client area */
#define UPDATE_ERASE 0x02 /* get region for erasing client area */
#define UPDATE_PAINT 0x04 /* get region for painting client area */
#define UPDATE_INTERNALPAINT 0x08 /* get region if internal paint is pending */
#define UPDATE_ALLCHILDREN 0x10 /* force repaint of all children */
#define UPDATE_NOCHILDREN 0x20 /* don't try to repaint any children */
#define UPDATE_NOREGION 0x40 /* don't return a region, only the flags */
#define UPDATE_DELAYED_ERASE 0x80 /* still needs erase after BeginPaint */
#define UPDATE_NONCLIENT 0x001 /* get region for repainting non-client area */
#define UPDATE_ERASE 0x002 /* get region for erasing client area */
#define UPDATE_PAINT 0x004 /* get region for painting client area */
#define UPDATE_INTERNALPAINT 0x008 /* get region if internal paint is pending */
#define UPDATE_ALLCHILDREN 0x010 /* force repaint of all children */
#define UPDATE_NOCHILDREN 0x020 /* don't try to repaint any children */
#define UPDATE_NOREGION 0x040 /* don't return a region, only the flags */
#define UPDATE_DELAYED_ERASE 0x080 /* still needs erase after BeginPaint */
#define UPDATE_CLIPCHILDREN 0x100 /* remove clipped children from the update region */
/* Update the z order of a window so that a given rectangle is fully visible */

View file

@ -2587,6 +2587,9 @@ DECL_HANDLER(get_update_region)
free_region( region );
return;
}
if ((flags & UPDATE_CLIPCHILDREN) && (win->style & WS_CLIPCHILDREN))
clip_children( win, NULL, region, win->client_rect.left - win->window_rect.left,
win->client_rect.top - win->window_rect.top );
map_win_region_to_screen( win, region );
if (!(data = get_region_data_and_free( region, get_reply_max_size(),
&reply->total_size ))) return;