Module: wine Branch: master Commit: b9b940fab97e0afe906f37936b5cafe2f8b7b92d URL: http://source.winehq.org/git/wine.git/?a=commit;h=b9b940fab97e0afe906f37936b...
Author: Alexandre Julliard julliard@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 )