Alexandre Julliard : server: Support using a name to destroy a window class too.
Alexandre Julliard
julliard at winehq.org
Fri Nov 2 08:10:16 CDT 2007
Module: wine
Branch: master
Commit: b9b940fab97e0afe906f37936b5cafe2f8b7b92d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b9b940fab97e0afe906f37936b5cafe2f8b7b92d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Nov 1 15:28:30 2007 +0100
server: Support using a name to destroy a window class too.
---
dlls/user32/class.c | 23 ++++++++++++-----------
include/wine/server_protocol.h | 3 ++-
server/class.c | 8 ++++++--
server/protocol.def | 1 +
server/trace.c | 4 +++-
5 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 5d97823..dec82b5 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -573,8 +573,15 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
*/
BOOL WINAPI UnregisterClassA( LPCSTR className, HINSTANCE hInstance )
{
- ATOM atom = HIWORD(className) ? GlobalFindAtomA( className ) : LOWORD(className);
- return UnregisterClassW( (LPCWSTR)MAKEINTATOM(atom), hInstance );
+ if (!IS_INTRESOURCE(className))
+ {
+ WCHAR name[MAX_ATOM_LEN + 1];
+
+ if (!MultiByteToWideChar( CP_ACP, 0, className, -1, name, MAX_ATOM_LEN + 1 ))
+ return FALSE;
+ return UnregisterClassW( name, hInstance );
+ }
+ return UnregisterClassW( (LPCWSTR)className, hInstance );
}
/***********************************************************************
@@ -583,20 +590,14 @@ BOOL WINAPI UnregisterClassA( LPCSTR className, HINSTANCE hInstance )
BOOL WINAPI UnregisterClassW( LPCWSTR className, HINSTANCE hInstance )
{
CLASS *classPtr = NULL;
- ATOM atom = HIWORD(className) ? GlobalFindAtomW( className ) : LOWORD(className);
-
- TRACE("%s %p %x\n",debugstr_w(className), hInstance, atom);
- if (!atom)
- {
- SetLastError( ERROR_CLASS_DOES_NOT_EXIST );
- return FALSE;
- }
+ TRACE("%s %p\n",debugstr_w(className), hInstance);
SERVER_START_REQ( destroy_class )
{
- req->atom = atom;
req->instance = hInstance;
+ if (IS_INTRESOURCE(className)) req->atom = LOWORD(className);
+ else wine_server_add_data( req, className, strlenW(className)*sizeof(WCHAR) );
if (!wine_server_call_err( req )) classPtr = reply->client_ptr;
}
SERVER_END_REQ;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index da3c45b..8d1485e 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3609,6 +3609,7 @@ struct destroy_class_request
struct request_header __header;
atom_t atom;
void* instance;
+ /* VARARG(name,unicode_str); */
};
struct destroy_class_reply
{
@@ -4882,6 +4883,6 @@ union generic_reply
struct set_completion_info_reply set_completion_info_reply;
};
-#define SERVER_PROTOCOL_VERSION 325
+#define SERVER_PROTOCOL_VERSION 326
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/class.c b/server/class.c
index ff39dc0..334542e 100644
--- a/server/class.c
+++ b/server/class.c
@@ -186,9 +186,13 @@ DECL_HANDLER(create_class)
/* destroy a window class */
DECL_HANDLER(destroy_class)
{
- struct window_class *class = find_class( current->process, req->atom, req->instance );
+ struct window_class *class;
+ atom_t atom = req->atom;
+
+ if (get_req_data_size())
+ atom = find_global_atom( NULL, get_req_data(), get_req_data_size() / sizeof(WCHAR) );
- if (!class)
+ if (!(class = find_class( current->process, atom, req->instance )))
set_win32_error( ERROR_CLASS_DOES_NOT_EXIST );
else if (class->count)
set_win32_error( ERROR_CLASS_HAS_WINDOWS );
diff --git a/server/protocol.def b/server/protocol.def
index aa06bd5..f2e33ef 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2610,6 +2610,7 @@ enum message_type
@REQ(destroy_class)
atom_t atom; /* class atom */
void* instance; /* module instance */
+ VARARG(name,unicode_str); /* class name */
@REPLY
void* client_ptr; /* pointer to class in client address space */
@END
diff --git a/server/trace.c b/server/trace.c
index 3d5a3c5..a6d3ee5 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3205,7 +3205,9 @@ static void dump_create_class_reply( const struct create_class_reply *req )
static void dump_destroy_class_request( const struct destroy_class_request *req )
{
fprintf( stderr, " atom=%04x,", req->atom );
- fprintf( stderr, " instance=%p", req->instance );
+ fprintf( stderr, " instance=%p,", req->instance );
+ fprintf( stderr, " name=" );
+ dump_varargs_unicode_str( cur_size );
}
static void dump_destroy_class_reply( const struct destroy_class_reply *req )
More information about the wine-cvs
mailing list