fix bug 838 (Sol.exe is missing it's menubar)
[reactos.git] / reactos / subsys / win32k / ntuser / class.c
index 78fc81b..94e4cc0 100644 (file)
@@ -48,7 +48,6 @@ CleanupClassImpl(VOID)
 }
 
 
-/* return TRUE if class became destroyed */
 inline VOID FASTCALL 
 ClassDerefObject(PWNDCLASS_OBJECT Class)
 {
@@ -67,13 +66,12 @@ ClassRefObject(PWNDCLASS_OBJECT Class)
 
 VOID FASTCALL DestroyClass(PWNDCLASS_OBJECT Class)
 {
-   PWINSTATION_OBJECT WinSta;
-   WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-   
    ASSERT(Class->refs == 0);
+   
    RemoveEntryList(&Class->ListEntry);
-   //FIXME: release ATOM
-   RtlDeleteAtomFromAtomTable(WinSta->AtomTable, Class->Atom);
+   if (Class->hMenu)
+      UserDestroyMenu(Class->hMenu);
+   RtlDeleteAtomFromAtomTable(gAtomTable, Class->Atom);
    ExFreePool(Class);
 }
 
@@ -113,17 +111,14 @@ ClassGetClassByAtom(RTL_ATOM Atom, HINSTANCE hInstance)
 PWNDCLASS_OBJECT FASTCALL
 ClassGetClassByName(LPCWSTR ClassName, HINSTANCE hInstance)
 {
-   PWINSTATION_OBJECT WinSta;
    NTSTATUS Status;
    RTL_ATOM Atom;
 
    if (!ClassName || !PsGetWin32Thread()->Desktop)
       return FALSE;
 
-   WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
    Status = RtlLookupAtomInAtomTable(
-               WinSta->AtomTable,
+               gAtomTable,
                (LPWSTR)ClassName,
                &Atom);
 
@@ -156,7 +151,8 @@ IntRegisterClass(
    DWORD Flags,
    WNDPROC wpExtra,
    PUNICODE_STRING MenuName,
-   RTL_ATOM Atom)
+   RTL_ATOM Atom,
+   HMENU hMenu)
 {
    PWNDCLASS_OBJECT Class;
    ULONG  objectSize;
@@ -195,6 +191,7 @@ IntRegisterClass(
    Class->hInstance = lpwcx->hInstance;
    Class->hIcon = lpwcx->hIcon;
    Class->hCursor = lpwcx->hCursor;
+   Class->hMenu = hMenu;
    Class->hbrBackground = lpwcx->hbrBackground;
    Class->Unicode = !(Flags & REGISTERCLASS_ANSI);
    Class->Global = Global;
@@ -421,7 +418,8 @@ NtUserRegisterClassExWOW(
    PUNICODE_STRING MenuName,
    WNDPROC wpExtra,
    DWORD Flags,
-   DWORD Unknown7)
+   DWORD Unknown7,
+   HMENU hMenu)
 
 /*
  * FUNCTION:
@@ -436,7 +434,6 @@ NtUserRegisterClassExWOW(
  */
 {
    WNDCLASSEXW SafeClass;
-   PWINSTATION_OBJECT WinSta;
    NTSTATUS Status;
    RTL_ATOM Atom;
    DECLARE_RETURN(RTL_ATOM);
@@ -476,14 +473,12 @@ NtUserRegisterClassExWOW(
       RETURN( (RTL_ATOM)0);
    }
 
-   WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-
    //FIXME: make ClassName ptr the atom, not buffer
    if (ClassName->Length > 0)
    {
       DPRINT("NtUserRegisterClassExWOW(%S)\n", ClassName->Buffer);
       /* FIXME - Safely copy/verify the buffer first!!! */
-      Status = RtlAddAtomToAtomTable(WinSta->AtomTable,
+      Status = RtlAddAtomToAtomTable(gAtomTable,
                                      ClassName->Buffer,
                                      &Atom);
       if (!NT_SUCCESS(Status))
@@ -505,11 +500,11 @@ NtUserRegisterClassExWOW(
       RETURN(0);
    }
 
-   if (!IntRegisterClass(&SafeClass, Flags, wpExtra, MenuName, Atom))
+   if (!IntRegisterClass(&SafeClass, Flags, wpExtra, MenuName, Atom, hMenu))
    {
       if (ClassName->Length)
       {
-         RtlDeleteAtomFromAtomTable(WinSta->AtomTable, Atom);
+         RtlDeleteAtomFromAtomTable(gAtomTable, Atom);
       }
       DPRINT("Failed creating window class object\n");
       RETURN((RTL_ATOM)0);
@@ -557,6 +552,7 @@ NtUserSetClassLong(HWND hWnd,
 {
    PWINDOW_OBJECT Window;
    LONG Ret;
+   USER_REFERENCE_ENTRY Ref;
    DECLARE_RETURN(DWORD);
 
    DPRINT("Enter NtUserSetClassLong\n");
@@ -567,7 +563,7 @@ NtUserSetClassLong(HWND hWnd,
       RETURN(0);
    }
 
-   UserRefObjectCo(Window);
+   UserRefObjectCo(Window, &Ref);
 
    Ret = IntGetClassLong(Window, Offset, Ansi);
    co_IntSetClassLong(Window, Offset, dwNewLong, Ansi);
@@ -615,16 +611,6 @@ NtUserUnregisterClass(
       RETURN(FALSE);
    }
 
-/* this was probably ment to prevent sysclass dereg
-Seems wrong. Any class can have NULL hInst, not only sysclasses
-
-*/
-//   if (Class->hInstance && Class->hInstance != hInstance)
-//   {
-//      SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
-//      RETURN( FALSE);
-//   }
-
    if (Class->refs)
    {
       /* NOTE: the class will not be freed when its refs become 0 ie. no more
@@ -718,7 +704,6 @@ NtUserGetClassName (
 {
    PWINDOW_OBJECT Window;
    DECLARE_RETURN(DWORD);
-   PWINSTATION_OBJECT WinSta;
    NTSTATUS Status;
 
    UserEnterShared();
@@ -729,12 +714,10 @@ NtUserGetClassName (
       RETURN(0);
    }
 
-   WinSta = PsGetWin32Thread()->Desktop->WindowStation;
-   
    nMaxCount *= sizeof(WCHAR);
    
    //FIXME: wrap in SEH to protect lpClassName access
-   Status = RtlQueryAtomInAtomTable(WinSta->AtomTable,
+   Status = RtlQueryAtomInAtomTable(gAtomTable,
                                     Window->Class->Atom, NULL, NULL,
                                     lpClassName, &nMaxCount);
    if (!NT_SUCCESS(Status))