Module: wine Branch: stable Commit: 251a085f2ab364e90888430cedb4b480c97f286d URL: http://source.winehq.org/git/wine.git/?a=commit;h=251a085f2ab364e90888430ced...
Author: Alexandre Julliard julliard@winehq.org Date: Sat May 21 09:54:40 2016 +0900
user32: Completely free owned DCEs when the corresponding window/class is destroyed.
Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit d341b0c3815a1b8872c8354dd0811e05a1ce7152) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/gdi32/tests/dc.c | 1 - dlls/user32/painting.c | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c index cb42219..0fd6326 100644 --- a/dlls/gdi32/tests/dc.c +++ b/dlls/gdi32/tests/dc.c @@ -830,7 +830,6 @@ static void test_DeleteDC(void) ok(ret, "UnregisterClassA failed\n");
ret = GetObjectType(hdc_test); -todo_wine ok(!ret, "GetObjectType should fail for a deleted DC\n");
/* CS_OWNDC */ diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c index 1dea98d..1c4ca7c 100644 --- a/dlls/user32/painting.c +++ b/dlls/user32/painting.c @@ -339,16 +339,17 @@ static struct dce *get_window_dce( HWND hwnd ) */ void free_dce( struct dce *dce, HWND hwnd ) { + struct dce *dce_to_free = NULL; + USER_Lock();
if (dce) { if (!--dce->count) { - /* turn it into a cache entry */ - SetHookFlags( dce->hdc, DCHF_RESETDC ); release_dce( dce ); - dce->flags |= DCX_CACHE; + list_remove( &dce->entry ); + dce_to_free = dce; } else if (dce->hwnd == hwnd) { @@ -363,7 +364,7 @@ void free_dce( struct dce *dce, HWND hwnd ) LIST_FOR_EACH_ENTRY( dce, &dce_list, struct dce, entry ) { if (dce->hwnd != hwnd) continue; - if (!(dce->flags & DCX_CACHE)) continue; + if (!(dce->flags & DCX_CACHE)) break;
if (dce->count) WARN( "GetDC() without ReleaseDC() for window %p\n", hwnd ); dce->count = 0; @@ -372,6 +373,13 @@ void free_dce( struct dce *dce, HWND hwnd ) }
USER_Unlock(); + + if (dce_to_free) + { + SetDCHook( dce_to_free->hdc, NULL, 0 ); + DeleteDC( dce_to_free->hdc ); + HeapFree( GetProcessHeap(), 0, dce_to_free ); + } }