Module: wine Branch: master Commit: 0fbe20a254bd947813480b348230a6f3d6bc97a2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0fbe20a254bd947813480b3482...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Dec 22 12:33:26 2009 +0100
user32: Move freeing of a 16-bit module's classes to wnd16.c.
---
dlls/user32/class.c | 32 -------------------------- dlls/user32/controls.h | 2 +- dlls/user32/user16.c | 5 ++- dlls/user32/wnd16.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 39 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c index f7e0f25..36315b0 100644 --- a/dlls/user32/class.c +++ b/dlls/user32/class.c @@ -255,38 +255,6 @@ static void CLASS_FreeClass( CLASS *classPtr )
/*********************************************************************** - * CLASS_FreeModuleClasses - */ -void CLASS_FreeModuleClasses( HMODULE16 hModule ) -{ - struct list *ptr, *next; - - TRACE("0x%08x\n", hModule); - - USER_Lock(); - for (ptr = list_head( &class_list ); ptr; ptr = next) - { - CLASS *class = LIST_ENTRY( ptr, CLASS, entry ); - next = list_next( &class_list, ptr ); - if (class->hInstance == HINSTANCE_32(hModule)) - { - BOOL ret; - - SERVER_START_REQ( destroy_class ) - { - req->atom = class->atomName; - req->instance = wine_server_client_ptr( class->hInstance ); - ret = !wine_server_call_err( req ); - } - SERVER_END_REQ; - if (ret) CLASS_FreeClass( class ); - } - } - USER_Unlock(); -} - - -/*********************************************************************** * CLASS_FindClass * * Return a pointer to the class. diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h index 956c32e..c3fd4ec 100644 --- a/dlls/user32/controls.h +++ b/dlls/user32/controls.h @@ -126,6 +126,7 @@ extern LRESULT StaticWndProc_common(HWND,UINT,WPARAM,LPARAM,BOOL) DECLSPEC_HIDDE
/* 16-bit support */ extern HWND create_window16(CREATESTRUCTW*,LPCWSTR,HINSTANCE,UINT) DECLSPEC_HIDDEN; +extern void free_module_classes(HINSTANCE16) DECLSPEC_HIDDEN; extern void register_wow_handlers(void) DECLSPEC_HIDDEN; extern void WINAPI UserRegisterWowHandlers( const struct wow_handlers16 *new, struct wow_handlers32 *orig ); @@ -138,7 +139,6 @@ extern void CLASS_RegisterBuiltinClasses(void) DECLSPEC_HIDDEN; extern WNDPROC get_class_winproc( struct tagCLASS *class ) DECLSPEC_HIDDEN; extern struct dce *get_class_dce( struct tagCLASS *class ) DECLSPEC_HIDDEN; extern struct dce *set_class_dce( struct tagCLASS *class, struct dce *dce ) DECLSPEC_HIDDEN; -extern void CLASS_FreeModuleClasses( HMODULE16 hModule ) DECLSPEC_HIDDEN;
/* defwnd proc */ extern HBRUSH DEFWND_ControlColor( HDC hDC, UINT ctlType ) DECLSPEC_HIDDEN; diff --git a/dlls/user32/user16.c b/dlls/user32/user16.c index c6fd3d7..4daaafd 100644 --- a/dlls/user32/user16.c +++ b/dlls/user32/user16.c @@ -1527,9 +1527,10 @@ void WINAPI SignalProc16( HANDLE16 hModule, UINT16 code, { if (code == USIG16_DLL_UNLOAD) { + hModule = GetExePtr(hModule); /* HOOK_FreeModuleHooks( hModule ); */ - CLASS_FreeModuleClasses( hModule ); - free_module_icons( GetExePtr(hModule) ); + free_module_classes( hModule ); + free_module_icons( hModule ); } }
diff --git a/dlls/user32/wnd16.c b/dlls/user32/wnd16.c index ad99e6d..6968683 100644 --- a/dlls/user32/wnd16.c +++ b/dlls/user32/wnd16.c @@ -23,6 +23,7 @@ #include "win.h" #include "controls.h" #include "user_private.h" +#include "wine/list.h" #include "wine/server.h"
/* size of buffer needed to store an atom string */ @@ -34,6 +35,15 @@
static HWND16 hwndSysModal;
+struct class_entry +{ + struct list entry; + ATOM atom; + HINSTANCE16 inst; +}; + +static struct list class_list = LIST_INIT( class_list ); + struct wnd_enum_info { WNDENUMPROC16 proc; @@ -62,6 +72,19 @@ static inline HWND full_insert_after_hwnd( HWND16 hwnd ) return ret; }
+void free_module_classes( HINSTANCE16 inst ) +{ + struct class_entry *class, *next; + + LIST_FOR_EACH_ENTRY_SAFE( class, next, &class_list, struct class_entry, entry ) + { + if (class->inst != inst) continue; + list_remove( &class->entry ); + UnregisterClassA( (LPCSTR)MAKEINTATOM(class->atom), HINSTANCE_32(class->inst) ); + HeapFree( GetProcessHeap(), 0, class ); + } +} + /************************************************************************** * MessageBox (USER.1) */ @@ -1532,22 +1555,34 @@ BOOL16 WINAPI SetWindowPlacement16( HWND16 hwnd, const WINDOWPLACEMENT16 *wp16 ) */ ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc ) { + struct class_entry *class; WNDCLASSEXA wc32; + HINSTANCE16 inst; + ATOM atom; + + inst = GetExePtr( wc->hInstance ); + if (!inst) inst = GetModuleHandle16( NULL );
wc32.cbSize = sizeof(wc32); wc32.style = wc->style; wc32.lpfnWndProc = WINPROC_AllocProc16( wc->lpfnWndProc ); wc32.cbClsExtra = wc->cbClsExtra; wc32.cbWndExtra = wc->cbWndExtra; - wc32.hInstance = HINSTANCE_32(GetExePtr(wc->hInstance)); - if (!wc32.hInstance) wc32.hInstance = HINSTANCE_32(GetModuleHandle16(NULL)); + wc32.hInstance = HINSTANCE_32(inst); wc32.hIcon = HICON_32(wc->hIcon); wc32.hCursor = HCURSOR_32(wc->hCursor); wc32.hbrBackground = HBRUSH_32(wc->hbrBackground); wc32.lpszMenuName = MapSL(wc->lpszMenuName); wc32.lpszClassName = MapSL(wc->lpszClassName); wc32.hIconSm = HICON_32(wc->hIconSm); - return RegisterClassExA( &wc32 ); + atom = RegisterClassExA( &wc32 ); + if ((class = HeapAlloc( GetProcessHeap(), 0, sizeof(*class) ))) + { + class->atom = atom; + class->inst = inst; + list_add_tail( &class_list, &class->entry ); + } + return atom; }
@@ -1617,8 +1652,24 @@ INT16 WINAPI GetPriorityClipboardFormat16( UINT16 *list, INT16 count ) */ BOOL16 WINAPI UnregisterClass16( LPCSTR className, HINSTANCE16 hInstance ) { + ATOM atom; + if (hInstance == GetModuleHandle16("user")) hInstance = 0; - return UnregisterClassA( className, HINSTANCE_32(GetExePtr( hInstance )) ); + else hInstance = GetExePtr( hInstance ); + + if ((atom = GlobalFindAtomA( className ))) + { + struct class_entry *class; + LIST_FOR_EACH_ENTRY( class, &class_list, struct class_entry, entry ) + { + if (class->inst != hInstance) continue; + if (class->atom != atom) continue; + list_remove( &class->entry ); + HeapFree( GetProcessHeap(), 0, class ); + break; + } + } + return UnregisterClassA( className, HINSTANCE_32(hInstance) ); }