Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
0fbe20a2
Commit
0fbe20a2
authored
Dec 22, 2009
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user32: Move freeing of a 16-bit module's classes to wnd16.c.
parent
e3bcc11b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
39 deletions
+59
-39
class.c
dlls/user32/class.c
+0
-32
controls.h
dlls/user32/controls.h
+1
-1
user16.c
dlls/user32/user16.c
+3
-2
wnd16.c
dlls/user32/wnd16.c
+55
-4
No files found.
dlls/user32/class.c
View file @
0fbe20a2
...
...
@@ -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.
...
...
dlls/user32/controls.h
View file @
0fbe20a2
...
...
@@ -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
;
...
...
dlls/user32/user16.c
View file @
0fbe20a2
...
...
@@ -1527,9 +1527,10 @@ void WINAPI SignalProc16( HANDLE16 hModule, UINT16 code,
{
if
(
code
==
USIG16_DLL_UNLOAD
)
{
hModule
=
GetExePtr
(
hModule
);
/* HOOK_FreeModuleHooks( hModule ); */
CLASS_FreeModuleC
lasses
(
hModule
);
free_module_icons
(
GetExePtr
(
hModule
)
);
free_module_c
lasses
(
hModule
);
free_module_icons
(
hModule
);
}
}
...
...
dlls/user32/wnd16.c
View file @
0fbe20a2
...
...
@@ -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
)
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment