Alexandre Julliard : user32: Delay registration of the builtin classes until the first window is created .

Alexandre Julliard julliard at winehq.org
Wed Oct 16 14:25:50 CDT 2013


Module: wine
Branch: master
Commit: 7370a565436b404570b1b1c4ad58a320368fbd7a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7370a565436b404570b1b1c4ad58a320368fbd7a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  1 20:34:07 2007 +0100

user32: Delay registration of the builtin classes until the first window is created.

---

 dlls/user32/class.c     |   25 +++++++++++++++++++++++--
 dlls/user32/user_main.c |    3 ---
 dlls/user32/win.c       |    3 +++
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index a66f0db..333cb76 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -64,6 +64,7 @@ typedef struct tagCLASS
 } CLASS;
 
 static struct list class_list = LIST_INIT( class_list );
+static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
 
 #define CLASS_OTHER_PROCESS ((CLASS *)1)
 
@@ -376,9 +377,9 @@ static void register_builtin( const struct builtin_class_descr *descr )
 
 
 /***********************************************************************
- *           CLASS_RegisterBuiltinClasses
+ *           register_builtins
  */
-void CLASS_RegisterBuiltinClasses(void)
+static BOOL WINAPI register_builtins( INIT_ONCE *once, void *param, void **context )
 {
     register_builtin( &DESKTOP_builtin_class );
     register_builtin( &BUTTON_builtin_class );
@@ -393,6 +394,16 @@ void CLASS_RegisterBuiltinClasses(void)
     register_builtin( &MESSAGE_builtin_class );
     register_builtin( &SCROLL_builtin_class );
     register_builtin( &STATIC_builtin_class );
+    return TRUE;
+}
+
+
+/***********************************************************************
+ *           CLASS_RegisterBuiltinClasses
+ */
+void CLASS_RegisterBuiltinClasses(void)
+{
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
 }
 
 
@@ -488,6 +499,8 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
     CLASS *classPtr;
     HINSTANCE instance;
 
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
+
     if (wc->cbSize != sizeof(*wc) || wc->cbClsExtra < 0 || wc->cbWndExtra < 0 ||
         wc->hInstance == user32_module)  /* we can't register a class for user32 */
     {
@@ -541,6 +554,8 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
     CLASS *classPtr;
     HINSTANCE instance;
 
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
+
     if (wc->cbSize != sizeof(*wc) || wc->cbClsExtra < 0 || wc->cbWndExtra < 0 ||
         wc->hInstance == user32_module)  /* we can't register a class for user32 */
     {
@@ -597,6 +612,8 @@ BOOL WINAPI UnregisterClassW( LPCWSTR className, HINSTANCE hInstance )
 {
     CLASS *classPtr = NULL;
 
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
+
     SERVER_START_REQ( destroy_class )
     {
         req->instance = wine_server_client_ptr( hInstance );
@@ -1097,6 +1114,8 @@ BOOL WINAPI GetClassInfoExA( HINSTANCE hInstance, LPCSTR name, WNDCLASSEXA *wc )
 
     TRACE("%p %s %p\n", hInstance, debugstr_a(name), wc);
 
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
+
     if (!wc)
     {
         SetLastError( ERROR_NOACCESS );
@@ -1148,6 +1167,8 @@ BOOL WINAPI GetClassInfoExW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSEXW *wc
 
     TRACE("%p %s %p\n", hInstance, debugstr_w(name), wc);
 
+    InitOnceExecuteOnce( &init_once, register_builtins, NULL, NULL );
+
     if (!wc)
     {
         SetLastError( ERROR_NOACCESS );
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index c5b4714..e74ac19 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -278,9 +278,6 @@ static BOOL process_attach(void)
     /* Setup palette function pointers */
     palette_init();
 
-    /* Initialize built-in window classes */
-    CLASS_RegisterBuiltinClasses();
-
     return TRUE;
 }
 
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 1b4d34b..d506fee 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1391,6 +1391,8 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
         }
     }
 
+    CLASS_RegisterBuiltinClasses();
+
     /* Find the parent window */
 
     parent = cs->hwndParent;
@@ -1424,6 +1426,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
             SetLastError(ERROR_TLW_WITH_WSCHILD);
             return 0;  /* WS_CHILD needs a parent, but WS_POPUP doesn't */
         }
+
         /* are we creating the desktop or HWND_MESSAGE parent itself? */
         if (className != (LPCWSTR)DESKTOP_CLASS_ATOM &&
             (IS_INTRESOURCE(className) || strcmpiW( className, messageW )))




More information about the wine-cvs mailing list