update for HEAD-2003091401
[reactos.git] / lib / user32 / misc / dllmain.c
index eddbc97..611cb1e 100644 (file)
@@ -1,7 +1,11 @@
 #include <windows.h>
 #include <debug.h>
 #include <user32/callback.h>
+#include <user32/accel.h>
 #include <window.h>
+#include <menu.h>
+#include <user32.h>
+#include <strpool.h>
 
 #ifdef DBG
 
@@ -10,11 +14,39 @@ DWORD DebugTraceLevel = MIN_TRACE;
 
 #endif /* DBG */
 
+static ULONG User32TlsIndex;
+
 /* To make the linker happy */
 VOID STDCALL KeBugCheck (ULONG BugCheckCode) {}
 
 HWINSTA ProcessWindowStation;
 
+PUSER32_THREAD_DATA
+User32GetThreadData()
+{
+  return((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
+}
+
+VOID
+InitThread(VOID)
+{
+  PUSER32_THREAD_DATA ThreadData;
+
+  ThreadData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
+                        sizeof(USER32_THREAD_DATA));
+  TlsSetValue(User32TlsIndex, ThreadData);
+}
+
+VOID
+CleanupThread(VOID)
+{
+  PUSER32_THREAD_DATA ThreadData;
+
+  ThreadData = (PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex);
+  HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, ThreadData);
+  TlsSetValue(User32TlsIndex, 0);
+}
+
 DWORD
 Init(VOID)
 {
@@ -33,8 +65,26 @@ Init(VOID)
     (PVOID)User32SendGETMINMAXINFOMessageForKernel;
   NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDNCCALCSIZE] =
     (PVOID)User32SendNCCALCSIZEMessageForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGING] =
+    (PVOID)User32SendWINDOWPOSCHANGINGMessageForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDWINDOWPOSCHANGED] =
+    (PVOID)User32SendWINDOWPOSCHANGEDMessageForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGING] =
+    (PVOID)User32SendSTYLECHANGINGMessageForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDSTYLECHANGED] =
+    (PVOID)User32SendSTYLECHANGEDMessageForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] =
+    (PVOID)User32LoadSysMenuTemplateForKernel;
+  NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] =
+    (PVOID)User32SetupDefaultCursors;
+
+  /* Allocate an index for user32 thread local data. */
+  User32TlsIndex = TlsAlloc();
 
   UserSetupInternalPos();
+  MenuInit();
+
+  RtlInitializeCriticalSection(&U32AccelCacheLock);
 
   GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
 
@@ -48,29 +98,40 @@ Cleanup(VOID)
 
   GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
 
+  TlsFree(User32TlsIndex);
+
   return(Status);
 }
 
+
+
 INT STDCALL
-DllMain(PVOID  hinstDll,
-       ULONG   dwReason,
-       PVOID   reserved)
+DllMain(
+       PVOID  hinstDll,
+       ULONG  dwReason,
+       PVOID  reserved
+       )
 {
   D(MAX_TRACE, ("hinstDll (0x%X)  dwReason (0x%X)\n", hinstDll, dwReason));
 
   switch (dwReason)
     {
     case DLL_PROCESS_ATTACH:
+      hProcessHeap = RtlGetProcessHeap();
       Init();
+      InitThread();
       break;
     case DLL_THREAD_ATTACH:
+      InitThread();
       break;
     case DLL_THREAD_DETACH:
+      CleanupThread();
       break;
     case DLL_PROCESS_DETACH:
+      DeleteFrameBrushes();
+      CleanupThread();
       Cleanup();
       break;
     }
   return(1);
 }
-