Added patch to enforce that surfaces are flushed after ReleaseDC.

This commit is contained in:
Sebastian Lackner
2015-02-27 22:44:57 +01:00
parent 9146caa7ae
commit 2672abd9e0
5 changed files with 61 additions and 1 deletions

View File

@@ -181,6 +181,7 @@ patch_enable_all ()
enable_user32_GetSystemMetrics="$1"
enable_user32_GetTipText="$1"
enable_user32_Mouse_Message_Hwnd="$1"
enable_user32_Painting="$1"
enable_user32_ScrollWindowEx="$1"
enable_user32_WndProc="$1"
enable_vcomp_Stub_Functions="$1"
@@ -575,6 +576,9 @@ patch_enable ()
user32-Mouse_Message_Hwnd)
enable_user32_Mouse_Message_Hwnd="$2"
;;
user32-Painting)
enable_user32_Painting="$2"
;;
user32-ScrollWindowEx)
enable_user32_ScrollWindowEx="$2"
;;
@@ -3647,6 +3651,18 @@ if test "$enable_user32_Mouse_Message_Hwnd" -eq 1; then
) >> "$patchlist"
fi
# Patchset user32-Painting
# |
# | Modified files:
# | * dlls/user32/painting.c, dlls/user32/win.c
# |
if test "$enable_user32_Painting" -eq 1; then
patch_apply user32-Painting/0001-user32-Enforce-that-surfaces-are-flushed-after-Relea.patch
(
echo '+ { "Sebastian Lackner", "user32: Enforce that surfaces are flushed after ReleaseDC.", 1 },';
) >> "$patchlist"
fi
# Patchset user32-ScrollWindowEx
# |
# | This patchset fixes the following Wine bugs:

View File

@@ -0,0 +1,41 @@
From c4a8e65a698c608dd491a0318116fa875b8362ba Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 27 Feb 2015 22:37:16 +0100
Subject: user32: Enforce that surfaces are flushed after ReleaseDC.
If a second thread draws on the surfaces while the main thread is idle then
the window doesn't update properly. Can be reproduced for example with:
https://www-user.tu-chemnitz.de/~heha/petzold/ch20c.htm
---
dlls/user32/painting.c | 1 +
dlls/user32/win.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index 5c1dc69..7be594f 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -1116,6 +1116,7 @@ HDC WINAPI GetWindowDC( HWND hwnd )
*/
INT WINAPI ReleaseDC( HWND hwnd, HDC hdc )
{
+ flush_window_surfaces( FALSE );
return release_dc( hwnd, hdc, FALSE );
}
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 0516193..5f99e43 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -598,7 +598,7 @@ void flush_window_surfaces( BOOL idle )
now = GetTickCount();
if (idle) last_idle = now;
/* if not idle, we only flush if there's evidence that the app never goes idle */
- else if ((int)(now - last_idle) < 1000) goto done;
+ else if ((int)(now - last_idle) < 100) goto done;
LIST_FOR_EACH_ENTRY( surface, &window_surfaces, struct window_surface, entry )
surface->funcs->flush( surface );
--
2.3.0

View File

@@ -0,0 +1 @@
Fixes: Enforce that surfaces are flushed after ReleaseDC