server: Crop the invalidate region against the rectangles of all parents.
This commit is contained in:
parent
bc25119c6e
commit
30c0639b5a
|
@ -5824,6 +5824,12 @@ static void test_paint_messages(void)
|
||||||
SetRectRgn( hrgn, 30, 30, 40, 40 );
|
SetRectRgn( hrgn, 30, 30, 40, 40 );
|
||||||
check_update_rgn( hchild, hrgn );
|
check_update_rgn( hchild, hrgn );
|
||||||
|
|
||||||
|
/* invalidated region is cropped by the parent rects */
|
||||||
|
SetRect( &rect, 0, 0, 50, 50 );
|
||||||
|
RedrawWindow( hchild, &rect, 0, RDW_INVALIDATE | RDW_ERASE );
|
||||||
|
SetRectRgn( hrgn, 30, 30, 50, 50 );
|
||||||
|
check_update_rgn( hchild, hrgn );
|
||||||
|
|
||||||
DestroyWindow( hparent );
|
DestroyWindow( hparent );
|
||||||
ok(!IsWindow(hchild), "child must be destroyed with its parent\n");
|
ok(!IsWindow(hchild), "child must be destroyed with its parent\n");
|
||||||
flush_sequence();
|
flush_sequence();
|
||||||
|
|
|
@ -1036,23 +1036,27 @@ static int get_window_visible_rect( struct window *win, rectangle_t *rect, int f
|
||||||
/* and converted from client to window coordinates. Helper for (in)validate_window. */
|
/* and converted from client to window coordinates. Helper for (in)validate_window. */
|
||||||
static struct region *crop_region_to_win_rect( struct window *win, struct region *region, int frame )
|
static struct region *crop_region_to_win_rect( struct window *win, struct region *region, int frame )
|
||||||
{
|
{
|
||||||
struct region *tmp = create_empty_region();
|
rectangle_t rect;
|
||||||
|
struct region *tmp;
|
||||||
|
|
||||||
if (!tmp) return NULL;
|
if (!get_window_visible_rect( win, &rect, frame )) return NULL;
|
||||||
|
if (!(tmp = create_empty_region())) return NULL;
|
||||||
|
set_region_rect( tmp, &rect );
|
||||||
|
|
||||||
/* get bounding rect in client coords */
|
if (region)
|
||||||
if (frame) set_region_rect( tmp, &win->window_rect );
|
{
|
||||||
else set_region_client_rect( tmp, win );
|
/* map it to client coords */
|
||||||
if (!is_desktop_window(win))
|
offset_region( tmp, win->window_rect.left - win->client_rect.left,
|
||||||
offset_region( tmp, -win->client_rect.left, -win->client_rect.top );
|
win->window_rect.top - win->client_rect.top );
|
||||||
|
|
||||||
/* intersect specified region with bounding rect */
|
/* intersect specified region with bounding rect */
|
||||||
if (region && !intersect_region( tmp, region, tmp )) goto done;
|
if (!intersect_region( tmp, region, tmp )) goto done;
|
||||||
if (is_region_empty( tmp )) goto done;
|
if (is_region_empty( tmp )) goto done;
|
||||||
|
|
||||||
/* map it to window coords */
|
/* map it back to window coords */
|
||||||
offset_region( tmp, win->client_rect.left - win->window_rect.left,
|
offset_region( tmp, win->client_rect.left - win->window_rect.left,
|
||||||
win->client_rect.top - win->window_rect.top );
|
win->client_rect.top - win->window_rect.top );
|
||||||
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
Loading…
Reference in New Issue