Related: !8095 and !8013.
-- v4: server: Remove unused parameter `frame` from redraw_window(). server: Add internal WINE_RDW_NESTED to indicate nested redraw_window() calls.
From: Jinoh Kang jinoh.kang.kr@gmail.com
--- server/window.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/server/window.c b/server/window.c index 914d376a44a..308e732e8dc 100644 --- a/server/window.c +++ b/server/window.c @@ -1616,14 +1616,17 @@ static void validate_parents( struct window *child ) }
+#define WINE_RDW_NESTED 0x80000000U + /* add/subtract a region (in client coordinates) to the update region of the window */ -static void redraw_window( struct window *win, struct region *region, int frame, unsigned int flags ) +static void redraw_window( struct window *win, struct region *region, int frame, unsigned int flags, int nested ) { struct region *child_rgn, *tmp; struct window *child;
if (flags & RDW_INVALIDATE) { + assert( frame == !!(flags & RDW_FRAME) ); if (!(tmp = crop_region_to_win_rect( win, region, frame ))) return;
if (!add_update_region( win, tmp )) return; @@ -1639,6 +1642,7 @@ static void redraw_window( struct window *win, struct region *region, int frame, } else if (win->update_region) { + assert( frame == nested ); /* validating nested child; include frame */ if ((tmp = crop_region_to_win_rect( win, region, frame ))) { if (!subtract_region( tmp, win->update_region, tmp )) @@ -1688,7 +1692,7 @@ static void redraw_window( struct window *win, struct region *region, int frame, if (rect_in_region( child_rgn, &child->window_rect )) { offset_region( child_rgn, -child->client_rect.left, -child->client_rect.top ); - redraw_window( child, child_rgn, 1, flags ); + redraw_window( child, child_rgn, 1, flags, 1 ); } } free_region( child_rgn ); @@ -1885,7 +1889,7 @@ static struct region *expose_window( struct window *win, const struct rectangle { /* make it relative to parent */ offset_region( new_vis_rgn, old_window_rect->left, old_window_rect->top ); - redraw_window( win->parent, new_vis_rgn, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN ); + redraw_window( win->parent, new_vis_rgn, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN, 0 ); } } } @@ -2056,7 +2060,7 @@ static void set_window_pos( struct window *win, struct window *previous, }
if (exposed_rgn) - redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN ); + redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
done: if (old_vis_rgn) free_region( old_vis_rgn ); @@ -2081,7 +2085,7 @@ static void set_window_region( struct window *win, struct region *region, int re /* expose anything revealed by the change */ if (old_vis_rgn && ((exposed_rgn = expose_window( win, &win->window_rect, old_vis_rgn, 0 )))) { - redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN ); + redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 ); free_region( exposed_rgn ); }
@@ -2985,7 +2989,7 @@ DECL_HANDLER(redraw_window) } }
- redraw_window( win, region, (flags & RDW_INVALIDATE) && (flags & RDW_FRAME), flags ); + redraw_window( win, region, (flags & RDW_INVALIDATE) && (flags & RDW_FRAME), flags, 0 ); if (region) free_region( region ); }
@@ -3161,7 +3165,7 @@ DECL_HANDLER(set_window_layered_info) win->layered_flags = req->flags; win->is_layered = 1; /* repaint since we know now it's not going to use UpdateLayeredWindow */ - if (!was_layered) redraw_window( win, 0, 1, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_ERASE | RDW_FRAME ); + if (!was_layered) redraw_window( win, 0, 1, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_ERASE | RDW_FRAME, 0 ); } else set_win32_error( ERROR_INVALID_WINDOW_HANDLE ); }
From: Jinoh Kang jinoh.kang.kr@gmail.com
--- server/window.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/server/window.c b/server/window.c index 308e732e8dc..6ea196ca3d9 100644 --- a/server/window.c +++ b/server/window.c @@ -1619,14 +1619,14 @@ static void validate_parents( struct window *child ) #define WINE_RDW_NESTED 0x80000000U
/* add/subtract a region (in client coordinates) to the update region of the window */ -static void redraw_window( struct window *win, struct region *region, int frame, unsigned int flags, int nested ) +static void redraw_window( struct window *win, struct region *region, unsigned int flags, int nested ) { struct region *child_rgn, *tmp; struct window *child;
if (flags & RDW_INVALIDATE) { - assert( frame == !!(flags & RDW_FRAME) ); + const int frame = !!(flags & RDW_FRAME); if (!(tmp = crop_region_to_win_rect( win, region, frame ))) return;
if (!add_update_region( win, tmp )) return; @@ -1642,7 +1642,7 @@ static void redraw_window( struct window *win, struct region *region, int frame, } else if (win->update_region) { - assert( frame == nested ); /* validating nested child; include frame */ + const int frame = nested; /* validating nested child; include frame */ if ((tmp = crop_region_to_win_rect( win, region, frame ))) { if (!subtract_region( tmp, win->update_region, tmp )) @@ -1692,7 +1692,7 @@ static void redraw_window( struct window *win, struct region *region, int frame, if (rect_in_region( child_rgn, &child->window_rect )) { offset_region( child_rgn, -child->client_rect.left, -child->client_rect.top ); - redraw_window( child, child_rgn, 1, flags, 1 ); + redraw_window( child, child_rgn, flags, 1 ); } } free_region( child_rgn ); @@ -1889,7 +1889,7 @@ static struct region *expose_window( struct window *win, const struct rectangle { /* make it relative to parent */ offset_region( new_vis_rgn, old_window_rect->left, old_window_rect->top ); - redraw_window( win->parent, new_vis_rgn, 0, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN, 0 ); + redraw_window( win->parent, new_vis_rgn, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN, 0 ); } } } @@ -2060,7 +2060,7 @@ static void set_window_pos( struct window *win, struct window *previous, }
if (exposed_rgn) - redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 ); + redraw_window( win, exposed_rgn, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 );
done: if (old_vis_rgn) free_region( old_vis_rgn ); @@ -2085,7 +2085,7 @@ static void set_window_region( struct window *win, struct region *region, int re /* expose anything revealed by the change */ if (old_vis_rgn && ((exposed_rgn = expose_window( win, &win->window_rect, old_vis_rgn, 0 )))) { - redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 ); + redraw_window( win, exposed_rgn, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN, 0 ); free_region( exposed_rgn ); }
@@ -2989,7 +2989,7 @@ DECL_HANDLER(redraw_window) } }
- redraw_window( win, region, (flags & RDW_INVALIDATE) && (flags & RDW_FRAME), flags, 0 ); + redraw_window( win, region, flags, 0 ); if (region) free_region( region ); }
@@ -3165,7 +3165,7 @@ DECL_HANDLER(set_window_layered_info) win->layered_flags = req->flags; win->is_layered = 1; /* repaint since we know now it's not going to use UpdateLayeredWindow */ - if (!was_layered) redraw_window( win, 0, 1, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_ERASE | RDW_FRAME, 0 ); + if (!was_layered) redraw_window( win, 0, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_ERASE | RDW_FRAME, 0 ); } else set_win32_error( ERROR_INVALID_WINDOW_HANDLE ); }
v4: Replace private flag with an explicit boolean.
This is now effectively exchanging one boolean flag for another, but I think it's still overall an improvement.
As @rbernon says in !8095, understanding when `frame` becomes true requires "having to track down 6 different calls sites to figure under which condition that additional parameter can be set to a 1/0 constant, based on seemingly arbitrary decision as it is hardcoded in most of them."
This patch makes the propagating behavior explicit: RDW_FRAME dictates whether frame is included for invalidating case, and "nested update" status for validating case.
For background, the motivation for removing the boolean flag came from (again quoting @rbernon) "aiming at reducing the number of parameters overall in a MR that added two more, and I though it would be better to remove one seemingly independent parameter that actually isn't" (the MR being !8013).
I still think my patch is in the right direction in this aspect: my `nested` *is* an independent parameter, unlike `frame` which may or may not depend on `RDW_FRAME` depending on yet another flag. Adding more boolean parameters, if ever needed, can be achieved by simply replacing `nested` with a bitfield.