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