From b456ee2e2dcef6fc8961263a6aa290bb2289fe10 Mon Sep 17 00:00:00 2001 From: Ralf Habacker Date: Mon, 26 Nov 2018 13:14:01 +0100 Subject: [PATCH v2] server: Release related atoms when destroying a window class According to the Windows API, UnregisterClass() releases the corresponding atom, which has not been implemented in wine yet. This commit adds a test to check if the corresponding atom is released after calling UnregisterClass(). It cannot be submitted as separate commit because it would fail without the base patch. Patch intended for git master branch only (stable branch needs a different patch because it does not have struct member 'base_atom') Many thanks to daniel.wendt@linux.com for doing some analysis work. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46180 Signed-off-by: Ralf Habacker --- dlls/user32/tests/class.c | 2 ++ server/class.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c index d6910d982d..118ec19709 100644 --- a/dlls/user32/tests/class.c +++ b/dlls/user32/tests/class.c @@ -230,6 +230,8 @@ static void ClassTest(HINSTANCE hInstance, BOOL global) ok(UnregisterClassW(className, hInstance), "UnregisterClass() failed\n"); + ok(GetClipboardFormatNameW(classatom, str, ARRAY_SIZE(str)) == 0, + "UnregisterClass() failed - unable to unregister atom\n"); return; } diff --git a/server/class.c b/server/class.c index 403180db79..b8240bd568 100644 --- a/server/class.c +++ b/server/class.c @@ -76,6 +76,8 @@ static struct window_class *create_class( struct process *process, int extra_byt static void destroy_class( struct window_class *class ) { + release_global_atom( NULL, class->atom ); + release_global_atom( NULL, class->base_atom ); list_remove( &class->entry ); release_object( class->process ); free( class ); -- 2.13.7