Alexandre Julliard : user32: Don' t exclude clipped children from the copied window bits since they may be up to date.
Alexandre Julliard
julliard at winehq.org
Thu Jul 20 16:20:34 CDT 2017
Module: wine
Branch: master
Commit: bcbc84e21455e31dcac742d81d409581f451a506
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bcbc84e21455e31dcac742d81d409581f451a506
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 20 10:41:43 2017 +0200
user32: Don't exclude clipped children from the copied window bits since they may be up to date.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/painting.c | 2 +-
include/wine/server_protocol.h | 19 ++++++++++---------
server/protocol.def | 17 +++++++++--------
server/window.c | 3 +++
4 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index 8448355..2130473 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -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 );
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 261391a..932a25c 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -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 */
diff --git a/server/protocol.def b/server/protocol.def
index b834c89..6a4d3fc 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -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 */
diff --git a/server/window.c b/server/window.c
index 463c4f2..2f2aae4 100644
--- a/server/window.c
+++ b/server/window.c
@@ -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;
More information about the wine-cvs
mailing list