[USER32] We're still using this one. Fixes build.
[reactos.git] / win32ss / user / user32 / windows / defwnd.c
index 5b90e29..27dcc57 100644 (file)
@@ -2,37 +2,18 @@
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS user32.dll
- * FILE:            dll/win32/user32/windows/defwnd.c
+ * FILE:            win32ss/user/user32/windows/defwnd.c
  * PURPOSE:         Window management
  * PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
  * UPDATE HISTORY:
  *      06-06-2001  CSH  Created
  */
 
-/* INCLUDES ******************************************************************/
-
 #include <user32.h>
 
 #include <wine/debug.h>
 WINE_DEFAULT_DEBUG_CHANNEL(user32);
 
-LRESULT DefWndNCPaint(HWND hWnd, HRGN hRgn, BOOL Active);
-LRESULT DefWndNCCalcSize(HWND hWnd, BOOL CalcSizeStruct, RECT *Rect);
-LRESULT DefWndNCActivate(HWND hWnd, WPARAM wParam, LPARAM lParam);
-LRESULT DefWndNCHitTest(HWND hWnd, POINT Point);
-LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
-LRESULT DefWndNCLButtonDblClk(HWND hWnd, WPARAM wParam, LPARAM lParam);
-LRESULT NC_HandleNCRButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam );
-void FASTCALL MenuInitSysMenuPopup(HMENU Menu, DWORD Style, DWORD ClsStyle, LONG HitTest );
-void MENU_EndMenu( HWND );
-
-/* GLOBALS *******************************************************************/
-
-static short iF10Key = 0;
-static short iMenuSysKey = 0;
-
-/* FUNCTIONS *****************************************************************/
-
 /*
  * @implemented
  */
@@ -63,7 +44,6 @@ GetSysColorBrush(int nIndex)
     return gpsi->ahbrSystem[nIndex];
   }
 
-  SetLastError(ERROR_INVALID_PARAMETER);
   return NULL;
 }
 
@@ -96,137 +76,37 @@ DefSetText(HWND hWnd, PCWSTR String, BOOL Ansi)
   }
   Ret = NtUserDefSetText(hWnd, (String ? &lsString : NULL));
 
-  if (Ret)
-     IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
-
   return Ret;
 }
 
-void
-UserGetInsideRectNC(PWND Wnd, RECT *rect)
-{
-    ULONG Style;
-    ULONG ExStyle;
-
-    Style = Wnd->style;
-    ExStyle = Wnd->ExStyle;
-
-    rect->top    = rect->left = 0;
-    rect->right  = Wnd->rcWindow.right - Wnd->rcWindow.left;
-    rect->bottom = Wnd->rcWindow.bottom - Wnd->rcWindow.top;
-
-    if (Style & WS_ICONIC)
-    {
-        return;
-    }
-
-    /* Remove frame from rectangle */
-    if (UserHasThickFrameStyle(Style, ExStyle ))
-    {
-        InflateRect(rect, -GetSystemMetrics(SM_CXFRAME), -GetSystemMetrics(SM_CYFRAME));
-    }
-    else
-    {
-        if (UserHasDlgFrameStyle(Style, ExStyle ))
-        {
-            InflateRect(rect, -GetSystemMetrics(SM_CXDLGFRAME), -GetSystemMetrics(SM_CYDLGFRAME));
-            /* FIXME: this isn't in NC_AdjustRect? why not? */
-            if (ExStyle & WS_EX_DLGMODALFRAME)
-                   InflateRect( rect, -1, 0 );
-        }
-        else
-        {
-            if (UserHasThinFrameStyle(Style, ExStyle))
-            {
-                InflateRect(rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
-            }
-        }
-    }
-    /* We have additional border information if the window
-     * is a child (but not an MDI child) */
-    if ((Style & WS_CHILD) && !(ExStyle & WS_EX_MDICHILD))
-    {
-       if (ExStyle & WS_EX_CLIENTEDGE)
-          InflateRect (rect, -GetSystemMetrics(SM_CXEDGE), -GetSystemMetrics(SM_CYEDGE));
-       if (ExStyle & WS_EX_STATICEDGE)
-          InflateRect (rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER));
-    }
-}
-
-LRESULT
-DefWndHandleSetCursor(HWND hWnd, WPARAM wParam, LPARAM lParam, ULONG Style)
+HWND FASTCALL
+IntFindChildWindowToOwner(HWND hRoot, HWND hOwner)
 {
-  /* Not for child windows. */
-  if (hWnd != (HWND)wParam)
-    {
-      return(0);
-    }
-
-  switch((INT_PTR) LOWORD(lParam))
-    {
-    case HTERROR:
-      {
-       WORD Msg = HIWORD(lParam);
-       if (Msg == WM_LBUTTONDOWN || Msg == WM_MBUTTONDOWN ||
-           Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN)
-         {
-           MessageBeep(0);
-         }
-       break;
-      }
-
-    case HTCLIENT:
-      {
-       HICON hCursor = (HICON)GetClassLongPtrW(hWnd, GCL_HCURSOR);
-       if (hCursor)
-         {
-           SetCursor(hCursor);
-           return(TRUE);
-         }
-       return(FALSE);
-      }
+   HWND Ret;
+   PWND Child, OwnerWnd, Root, Owner;
 
-    case HTLEFT:
-    case HTRIGHT:
-      {
-        if (Style & WS_MAXIMIZE)
-        {
-          break;
-        }
-       return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZEWE)));
-      }
+   Root = ValidateHwnd(hRoot);
+   Owner = ValidateHwnd(hOwner);
 
-    case HTTOP:
-    case HTBOTTOM:
-      {
-        if (Style & WS_MAXIMIZE)
-        {
-          break;
-        }
-       return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENS)));
-      }
+   for( Child = Root->spwndChild ? DesktopPtrToUser(Root->spwndChild) : NULL;
+        Child;
+        Child = Child->spwndNext ? DesktopPtrToUser(Child->spwndNext) : NULL )
+   {
+      OwnerWnd = Child->spwndOwner ? DesktopPtrToUser(Child->spwndOwner) : NULL;
+      if(!OwnerWnd)
+         continue;
 
-    case HTTOPLEFT:
-    case HTBOTTOMRIGHT:
-      {
-        if (Style & WS_MAXIMIZE)
-        {
-          break;
-        }
-       return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENWSE)));
-      }
+      if (!(Child->style & WS_POPUP) || !(Child->style & WS_VISIBLE))
+         continue;
 
-    case HTBOTTOMLEFT:
-    case HTTOPRIGHT:
+      if(OwnerWnd == Owner)
       {
-        if (GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_MAXIMIZE)
-        {
-          break;
-        }
-       return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENESW)));
+         Ret = Child->head.h;
+         return Ret;
       }
-    }
-  return((LRESULT)SetCursor(LoadCursorW(0, IDC_ARROW)));
+   }
+   ERR("IDCWTO Nothing found\n");
+   return NULL;
 }
 
 /***********************************************************************
@@ -268,51 +148,35 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
 
   if (!IsWindowEnabled( hWnd )) return 0;
 
-  if (ISITHOOKED(WH_CBT))
-  {
-     NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE);
-     if (lResult) return 0;
-  }
-
   switch (wParam & 0xfff0)
     {
       case SC_MOVE:
       case SC_SIZE:
-       NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE);
-       break;
-
-    case SC_MINIMIZE:
-        if (hWnd == GetActiveWindow())
-            ShowOwnedPopups(hWnd,FALSE);
-        ShowWindow( hWnd, SW_MINIMIZE );
-        break;
+//      case SC_DEFAULT:
+      case SC_MOUSEMENU:
+      case SC_KEYMENU:
+      case SC_SCREENSAVE:
+      case SC_MINIMIZE:
+      case SC_MAXIMIZE:
+      case SC_RESTORE:
+      case SC_CLOSE:
+      case SC_HOTKEY:
+        NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE);
+        return 0;
 
-    case SC_MAXIMIZE:
-        if (IsIconic(hWnd) && hWnd == GetActiveWindow())
-            ShowOwnedPopups(hWnd,TRUE);
-        ShowWindow( hWnd, SW_MAXIMIZE );
+      default:
         break;
+    }
 
-    case SC_RESTORE:
-        if (IsIconic(hWnd) && hWnd == GetActiveWindow())
-            ShowOwnedPopups(hWnd,TRUE);
-        ShowWindow( hWnd, SW_RESTORE );
-        break;
+  if (ISITHOOKED(WH_CBT))
+  {
+     NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE);
+     if (lResult) return 0;
+  }
 
-      case SC_CLOSE:
-        return SendMessageW(hWnd, WM_CLOSE, 0, 0);
+  switch (wParam & 0xfff0)
+    {
 
-//      case SC_DEFAULT:
-      case SC_MOUSEMENU:
-        {
-          Pt.x = (short)LOWORD(lParam);
-          Pt.y = (short)HIWORD(lParam);
-          MenuTrackMouseMenuBar(hWnd, wParam & 0x000f, Pt);
-        }
-       break;
-      case SC_KEYMENU:
-        MenuTrackKbdMenuBar(hWnd, wParam, (WCHAR)lParam);
-       break;
       case SC_VSCROLL:
       case SC_HSCROLL:
         {
@@ -326,39 +190,12 @@ DefWndHandleSysCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
         WinExec( "taskman.exe", SW_SHOWNORMAL );
         break;
 
-      case SC_SCREENSAVE:
-        NtUserMessageCall( hWnd, WM_SYSCOMMAND, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, FALSE);
-        break;
 
       case SC_NEXTWINDOW:
       case SC_PREVWINDOW:
         DoAppSwitch( wParam, lParam);
         break;
 
-      case SC_HOTKEY:
-        {
-           HWND hwnd, hWndLastActive;
-           PWND pWnd;
-
-           hwnd = (HWND)lParam;
-           pWnd = ValidateHwnd(hwnd);
-           if (pWnd)
-           {
-              hWndLastActive = GetLastActivePopup(hwnd);
-              if (hWndLastActive)
-              {
-                 hwnd = hWndLastActive;
-                 pWnd = ValidateHwnd(hwnd);
-              }
-              SetForegroundWindow(hwnd);
-              if (pWnd->style & WS_MINIMIZE)
-              {
-                 PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
-              }
-           }
-        }
-        break;
-
       default:
         FIXME("Unimplemented DefWndHandleSysCommand wParam 0x%x\n",wParam);
         break;
@@ -408,38 +245,6 @@ DefWndControlColor(HDC hDC, UINT ctlType)
   return GetSysColorBrush(COLOR_WINDOW);
 }
 
-static void DefWndPrint( HWND hwnd, HDC hdc, ULONG uFlags)
-{
-  /*
-   * Visibility flag.
-   */
-  if ( (uFlags & PRF_CHECKVISIBLE) &&
-       !IsWindowVisible(hwnd) )
-      return;
-
-  /*
-   * Unimplemented flags.
-   */
-  if ( (uFlags & PRF_CHILDREN) ||
-       (uFlags & PRF_OWNED)    ||
-       (uFlags & PRF_NONCLIENT) )
-  {
-    FIXME("WM_PRINT message with unsupported flags\n");
-  }
-
-  /*
-   * Background
-   */
-  if ( uFlags & PRF_ERASEBKGND)
-    SendMessageW(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0);
-
-  /*
-   * Client area
-   */
-  if ( uFlags & PRF_CLIENT)
-    SendMessageW(hwnd, WM_PRINTCLIENT, (WPARAM)hdc, uFlags);
-}
-
 static BOOL CALLBACK
 UserSendUiUpdateMsg(HWND hwnd, LPARAM lParam)
 {
@@ -447,43 +252,40 @@ UserSendUiUpdateMsg(HWND hwnd, LPARAM lParam)
     return TRUE;
 }
 
-// WM_SETICON
-LRESULT FASTCALL
-DefWndSetIcon(PWND pWnd, WPARAM wParam, LPARAM lParam)
+/* WARNING: Redundant with /ntuser/defwnd.c!UserPaintCaption !!
+   Use TWOPARAM_ROUTINE_REDRAWTITLE/REDRAWFRAME or HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK .
+ */
+static void
+UserPaintCaption(PWND pwnd, INT Flags)
 {
-    HICON hIcon, hIconSmall, hIconOld;
-
-    if ( wParam > ICON_SMALL2 )
-    {  
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
+  if ( pwnd->style & WS_VISIBLE && (pwnd->style & WS_CAPTION) == WS_CAPTION )
+  {
+     if (pwnd->state & WNDS_HASCAPTION && NtUserQueryWindow(UserHMGetHandle(pwnd), QUERY_WINDOW_FOREGROUND))
+        Flags |= DC_ACTIVE;
+    /* 
+     * When themes are not enabled we can go on and paint the non client area.
+     * However if we do that with themes enabled we will draw a classic frame.
+     * This is solved by sending a themes specific message to notify the themes
+     * engine that the caption needs to be redrawn 
+     */
+    if(gpsi->dwSRVIFlags & SRVINFO_APIHOOK)
+    {
+        /* 
+         * This will cause uxtheme to either paint the themed caption or call
+         * RealUserDrawCaption in order to draw the classic caption when themes
+         * are disabled but the themes service is enabled
+         */
+        SendMessageW(UserHMGetHandle(pwnd), WM_NCUAHDRAWCAPTION, Flags, 0);
     }
-    hIconSmall = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp);
-    hIcon = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp);
-
-    hIconOld = wParam == ICON_BIG ? hIcon : hIconSmall;
-
-    switch(wParam)
+    else
     {
-        case ICON_BIG:
-            hIcon = (HICON)lParam;
-            break;
-        case ICON_SMALL:
-            hIconSmall = (HICON)lParam;
-            break;
-        case ICON_SMALL2:
-            ERR("FIXME: Set ICON_SMALL2 support!\n");
-        default:
-            break;
+        RECT rc = {0,0,0,0};
+        HDC hDC = GetDCEx(UserHMGetHandle(pwnd), NULL, DCX_WINDOW|DCX_USESTYLE);
+        NtUserDrawCaption(UserHMGetHandle(pwnd), hDC, &rc, DC_DRAWCAPTIONMD|Flags);
+        ReleaseDC(UserHMGetHandle(pwnd), hDC);
     }
-
-    NtUserSetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp, hIcon);
-    NtUserSetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp, hIconSmall);
-
-    if ((pWnd->style & WS_CAPTION ) == WS_CAPTION)
-       DefWndNCPaint(UserHMGetHandle(pWnd), HRGN_WINDOW, -1);  /* Repaint caption */
-
-    return (LRESULT)hIconOld;
+  }
+  //NtUserCallTwoParam((DWORD_PTR)UserHMGetHandle(pwnd),Flags,TWOPARAM_ROUTINE_REDRAWTITLE)
 }
 
 LRESULT FASTCALL
@@ -498,11 +300,11 @@ DefWndGetIcon(PWND pWnd, WPARAM wParam, LPARAM lParam)
     switch(wParam)
     {
         case ICON_BIG:
-            hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp);
+            hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconProp, TRUE);
             break;
         case ICON_SMALL:
         case ICON_SMALL2:
-            hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp);
+            hIconRet = UserGetProp(UserHMGetHandle(pWnd), gpsi->atomIconSmProp, TRUE);
             break;
         default:
             break;
@@ -510,48 +312,13 @@ DefWndGetIcon(PWND pWnd, WPARAM wParam, LPARAM lParam)
     return (LRESULT)hIconRet;
 }
 
-VOID FASTCALL
-DefWndScreenshot(HWND hWnd)
-{
-    RECT rect;
-    HDC hdc;
-    INT w;
-    INT h;
-    HBITMAP hbitmap;
-    HDC hdc2;
-
-    OpenClipboard(hWnd);
-    EmptyClipboard();
-
-    hdc = GetWindowDC(hWnd);
-    GetWindowRect(hWnd, &rect);
-    w = rect.right - rect.left;
-    h = rect.bottom - rect.top;
-
-    hbitmap = CreateCompatibleBitmap(hdc, w, h);
-    hdc2 = CreateCompatibleDC(hdc);
-    SelectObject(hdc2, hbitmap);
-
-    BitBlt(hdc2, 0, 0, w, h,
-           hdc, 0, 0,
-           SRCCOPY);
-
-    SetClipboardData(CF_BITMAP, hbitmap);
-
-    ReleaseDC(hWnd, hdc);
-    ReleaseDC(hWnd, hdc2);
-
-    CloseClipboard();
-}
-
-
 
 LRESULT WINAPI
 User32DefWindowProc(HWND hWnd,
-                   UINT Msg,
-                   WPARAM wParam,
-                   LPARAM lParam,
-                   BOOL bUnicode)
+                    UINT Msg,
+                    WPARAM wParam,
+                    LPARAM lParam,
+                    BOOL bUnicode)
 {
     PWND pWnd = NULL;
     if (hWnd)
@@ -562,70 +329,21 @@ User32DefWindowProc(HWND hWnd,
 
     switch (Msg)
     {
-       case WM_NCPAINT:
-       {
-            return DefWndNCPaint(hWnd, (HRGN)wParam, -1);
-        }
-
-        case WM_NCCALCSIZE:
-        {
-            return DefWndNCCalcSize(hWnd, (BOOL)wParam, (RECT*)lParam);
-        }
-
         case WM_POPUPSYSTEMMENU:
         {
             /* This is an undocumented message used by the windows taskbar to
                display the system menu of windows that belong to other processes. */
             HMENU menu = GetSystemMenu(hWnd, FALSE);
-
+            ERR("WM_POPUPSYSTEMMENU\n");
             if (menu)
-                TrackPopupMenu(menu, TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
+                TrackPopupMenu(menu, TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_SYSTEM_MENU,
                                LOWORD(lParam), HIWORD(lParam), 0, hWnd, NULL);
             return 0;
         }
 
-        case WM_NCACTIVATE:
-        {
-            return DefWndNCActivate(hWnd, wParam, lParam);
-        }
-
-        case WM_NCHITTEST:
-        {
-            POINT Point;
-            Point.x = GET_X_LPARAM(lParam);
-            Point.y = GET_Y_LPARAM(lParam);
-            return (DefWndNCHitTest(hWnd, Point));
-        }
-
-        case WM_LBUTTONDOWN:
-        case WM_RBUTTONDOWN:
-        case WM_MBUTTONDOWN:
-            iF10Key = iMenuSysKey = 0;
-            break;
-
-        case WM_NCLBUTTONDOWN:
-        {
-            return (DefWndNCLButtonDown(hWnd, wParam, lParam));
-        }
-
-        case WM_LBUTTONDBLCLK:
-            return (DefWndNCLButtonDblClk(hWnd, HTCLIENT, lParam));
-
-        case WM_NCLBUTTONDBLCLK:
-        {
-            return (DefWndNCLButtonDblClk(hWnd, wParam, lParam));
-        }
-
-        case WM_NCRBUTTONDOWN:
-            return NC_HandleNCRButtonDown( hWnd, wParam, lParam );
-
         case WM_RBUTTONUP:
         {
             POINT Pt;
-            if (hWnd == GetCapture())
-            {
-                ReleaseCapture();
-            }
             Pt.x = GET_X_LPARAM(lParam);
             Pt.y = GET_Y_LPARAM(lParam);
             ClientToScreen(hWnd, &Pt);
@@ -648,6 +366,16 @@ User32DefWindowProc(HWND hWnd,
            * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
            * message to the window". When is it appropriate?
            */
+           ERR("WM_NCRBUTTONUP\n");
+            break;
+
+        case WM_XBUTTONUP:
+        case WM_NCXBUTTONUP:
+            if (HIWORD(wParam) == XBUTTON1 || HIWORD(wParam) == XBUTTON2)
+            {
+               SendMessageW(hWnd, WM_APPCOMMAND, (WPARAM)hWnd,
+                         MAKELPARAM(LOWORD(wParam), FAPPCOMMAND_MOUSE | HIWORD(wParam)));
+            }
             break;
 
         case WM_CONTEXTMENU:
@@ -665,94 +393,9 @@ User32DefWindowProc(HWND hWnd,
             }
             else
             {
-                POINT Pt;
-                LONG_PTR Style;
-                LONG HitCode;
-
-                Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
-
-                Pt.x = GET_X_LPARAM(lParam);
-                Pt.y = GET_Y_LPARAM(lParam);
-                if (Style & WS_CHILD)
-                {
-                    ScreenToClient(GetParent(hWnd), &Pt);
-                }
-
-                HitCode = DefWndNCHitTest(hWnd, Pt);
-
-                if (HitCode == HTCAPTION || HitCode == HTSYSMENU)
-                {
-                    HMENU SystemMenu;
-                    UINT Flags;
-
-                    if((SystemMenu = GetSystemMenu(hWnd, FALSE)))
-                    {
-                      MenuInitSysMenuPopup(SystemMenu, GetWindowLongPtrW(hWnd, GWL_STYLE),
-                                           GetClassLongPtrW(hWnd, GCL_STYLE), HitCode);
-
-                      if(HitCode == HTCAPTION)
-                        Flags = TPM_LEFTBUTTON | TPM_RIGHTBUTTON;
-                      else
-                        Flags = TPM_LEFTBUTTON;
-
-                      TrackPopupMenu(SystemMenu, Flags,
-                                     Pt.x, Pt.y, 0, hWnd, NULL);
-                    }
-                }
-           }
-            break;
-        }
-
-        case WM_PRINT:
-        {
-            DefWndPrint(hWnd, (HDC)wParam, lParam);
-            return (0);
-        }
-
-        case WM_SYSCOLORCHANGE:
-        {
-            /* force to redraw non-client area */
-            DefWndNCPaint(hWnd, HRGN_WINDOW, -1);
-            /* Use InvalidateRect to redraw client area, enable
-             * erase to redraw all subcontrols otherwise send the
-             * WM_SYSCOLORCHANGE to child windows/controls is required
-             */
-            InvalidateRect(hWnd,NULL,TRUE);
-            return (0);
-        }
-
-        case WM_PAINTICON:
-        case WM_PAINT:
-        {
-            PAINTSTRUCT Ps;
-            HDC hDC;
-
-            /* If already in Paint and Client area is not empty just return. */
-            if (pWnd->state2 & WNDS2_STARTPAINT && !IsRectEmpty(&pWnd->rcClient))
-            {
-               ERR("In Paint and Client area is not empty!\n");
-               return 0;
-            }
-
-            hDC = BeginPaint(hWnd, &Ps);
-            if (hDC)
-            {
-                HICON hIcon;
-
-                if (IsIconic(hWnd) && ((hIcon = (HICON)GetClassLongPtrW( hWnd, GCLP_HICON))))
-                {
-                    RECT ClientRect;
-                    INT x, y;
-                    GetClientRect(hWnd, &ClientRect);
-                    x = (ClientRect.right - ClientRect.left -
-                         GetSystemMetrics(SM_CXICON)) / 2;
-                    y = (ClientRect.bottom - ClientRect.top -
-                         GetSystemMetrics(SM_CYICON)) / 2;
-                    DrawIcon(hDC, x, y, hIcon);
-                }
-                EndPaint(hWnd, &Ps);
+               goto GoSS;
             }
-            return (0);
+            break;
         }
 
         case WM_CLOSE:
@@ -814,145 +457,14 @@ User32DefWindowProc(HWND hWnd,
         case WM_CTLCOLORDLG:
         case WM_CTLCOLORSTATIC:
         case WM_CTLCOLORSCROLLBAR:
-           return (LRESULT) DefWndControlColor((HDC)wParam, Msg - WM_CTLCOLORMSGBOX);
+            return (LRESULT) DefWndControlColor((HDC)wParam, Msg - WM_CTLCOLORMSGBOX);
 
         case WM_CTLCOLOR:
             return (LRESULT) DefWndControlColor((HDC)wParam, HIWORD(lParam));
 
-        case WM_SETCURSOR:
-        {
-            LONG_PTR Style = GetWindowLongPtrW(hWnd, GWL_STYLE);
-
-            if (Style & WS_CHILD)
-            {
-                /* with the exception of the border around a resizable wnd,
-                 * give the parent first chance to set the cursor */
-                if (LOWORD(lParam) < HTLEFT || LOWORD(lParam) > HTBOTTOMRIGHT)
-                {
-                    HWND parent = GetParent( hWnd );
-                    if (bUnicode)
-                    {
-                       if (parent != GetDesktopWindow() &&
-                           SendMessageW( parent, WM_SETCURSOR, wParam, lParam))
-                          return TRUE;
-                    }
-                    else
-                    {
-                       if (parent != GetDesktopWindow() &&                    
-                           SendMessageA( parent, WM_SETCURSOR, wParam, lParam))
-                          return TRUE;
-                    }
-                }
-            }
-            return (DefWndHandleSetCursor(hWnd, wParam, lParam, Style));
-        }
-
         case WM_SYSCOMMAND:
             return (DefWndHandleSysCommand(hWnd, wParam, lParam));
 
-        case WM_KEYDOWN:
-            if(wParam == VK_F10) iF10Key = VK_F10;
-            break;
-
-        case WM_SYSKEYDOWN:
-        {
-            if (HIWORD(lParam) & KF_ALTDOWN)
-            {   /* Previous state, if the key was down before this message,
-                   this is a cheap way to ignore autorepeat keys. */
-                if ( !(HIWORD(lParam) & KF_REPEAT) )
-                {
-                   if ( ( wParam == VK_MENU  ||
-                          wParam == VK_LMENU ||
-                          wParam == VK_RMENU ) && !iMenuSysKey )
-                       iMenuSysKey = 1;
-                   else
-                       iMenuSysKey = 0;
-                }
-
-                iF10Key = 0;
-
-                if (wParam == VK_F4) /* Try to close the window */
-                {
-                   HWND top = GetAncestor(hWnd, GA_ROOT);
-                   if (!(GetClassLongPtrW(top, GCL_STYLE) & CS_NOCLOSE))
-                      PostMessageW(top, WM_SYSCOMMAND, SC_CLOSE, 0);
-                }
-                else if (wParam == VK_SNAPSHOT) // Alt-VK_SNAPSHOT?
-                {
-                   HWND hwnd = hWnd;
-                   while (GetParent(hwnd) != NULL)
-                   {
-                       hwnd = GetParent(hwnd);
-                   }
-                   DefWndScreenshot(hwnd);
-                }
-                else if ( wParam == VK_ESCAPE || wParam == VK_TAB ) // Alt-Tab/ESC Alt-Shift-Tab/ESC
-                {
-                   WPARAM wParamTmp;
-                   HWND Active = GetActiveWindow(); // Noticed MDI problem.
-                   if (!Active)
-                   {
-                      FIXME("WM_SYSKEYDOWN VK_ESCAPE no active\n");
-                      break;
-                   }
-                   wParamTmp = GetKeyState(VK_SHIFT) & 0x8000 ? SC_PREVWINDOW : SC_NEXTWINDOW;
-                   SendMessageW( Active, WM_SYSCOMMAND, wParamTmp, wParam );
-                }
-            }
-            else if( wParam == VK_F10 )
-            {
-                if (GetKeyState(VK_SHIFT) & 0x8000)
-                    SendMessageW( hWnd, WM_CONTEXTMENU, (WPARAM)hWnd, MAKELPARAM(-1, -1) );
-                iF10Key = 1;
-            }
-            break;
-        }
-
-        case WM_KEYUP:
-        case WM_SYSKEYUP:
-        {
-           /* Press and release F10 or ALT */
-            if (((wParam == VK_MENU || wParam == VK_LMENU || wParam == VK_RMENU)
-                 && iMenuSysKey) || ((wParam == VK_F10) && iF10Key))
-                SendMessageW( GetAncestor( hWnd, GA_ROOT ), WM_SYSCOMMAND, SC_KEYMENU, 0L );
-            iMenuSysKey = iF10Key = 0;
-            break;
-        }
-
-        case WM_SYSCHAR:
-        {
-            iMenuSysKey = 0;
-            if (wParam == VK_RETURN && IsIconic(hWnd))
-            {
-                PostMessageW( hWnd, WM_SYSCOMMAND, SC_RESTORE, 0L );
-                break;
-            }
-            if ((HIWORD(lParam) & KF_ALTDOWN) && wParam)
-            {
-                if (wParam == VK_TAB || wParam == VK_ESCAPE) break;
-                if (wParam == VK_SPACE && (GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD))
-                    SendMessageW( GetParent(hWnd), Msg, wParam, lParam );
-                else
-                    SendMessageW( hWnd, WM_SYSCOMMAND, SC_KEYMENU, wParam );
-            }
-            else /* check for Ctrl-Esc */
-                if (wParam != VK_ESCAPE) MessageBeep(0);
-            break;
-        }
-
-        case WM_CANCELMODE:
-        {
-            iMenuSysKey = 0;
-            /* FIXME: Check for a desktop. */
-            //if (!(GetWindowLongPtrW( hWnd, GWL_STYLE ) & WS_CHILD)) EndMenu();
-            MENU_EndMenu( hWnd );
-            if (GetCapture() == hWnd)
-            {
-                ReleaseCapture();
-            }
-            break;
-        }
-
         case WM_VKEYTOITEM:
         case WM_CHARTOITEM:
             return (-1);
@@ -1003,11 +515,6 @@ User32DefWindowProc(HWND hWnd,
             break;
         }
 
-        case WM_SETICON:
-        {
-           return DefWndSetIcon(pWnd, wParam, lParam);
-        }
-
         case WM_GETICON:
         {
            return DefWndGetIcon(pWnd, wParam, lParam);
@@ -1026,22 +533,6 @@ User32DefWindowProc(HWND hWnd,
             break;
         }
 
-        case WM_SYSTIMER:
-        {
-          THRDCARETINFO CaretInfo;
-          switch(wParam)
-          {
-            case 0xffff: /* Caret timer */
-              /* switch showing byte in win32k and get information about the caret */
-              if(NtUserxSwitchCaretShowing(&CaretInfo) && (CaretInfo.hWnd == hWnd))
-              {
-                DrawCaret(hWnd, &CaretInfo);
-              }
-              break;
-          }
-          break;
-        }
-
         case WM_QUERYOPEN:
         case WM_QUERYENDSESSION:
         {
@@ -1261,6 +752,31 @@ User32DefWindowProc(HWND hWnd,
 /* Move to Win32k !*/
         case WM_SHOWWINDOW:
             if (!lParam) break; // Call when it is necessary.
+        case WM_LBUTTONDOWN:
+        case WM_RBUTTONDOWN:
+        case WM_MBUTTONDOWN:
+        case WM_NCLBUTTONDOWN:
+        case WM_NCRBUTTONDOWN:
+        case WM_LBUTTONDBLCLK:
+        case WM_NCLBUTTONDBLCLK:
+        case WM_KEYF1:
+        case WM_KEYUP:
+        case WM_SYSKEYUP:
+        case WM_KEYDOWN:
+        case WM_SYSKEYDOWN:
+        case WM_SYSCHAR:
+        case WM_CANCELMODE:
+        case WM_PAINTICON:
+        case WM_PAINT:
+        case WM_PRINT:
+        case WM_SETICON:
+        case WM_SYSCOLORCHANGE:
+        case WM_NCUAHDRAWCAPTION:
+        case WM_NCUAHDRAWFRAME:
+        case WM_NCPAINT:
+        case WM_NCACTIVATE:
+        case WM_NCCALCSIZE:
+        case WM_NCHITTEST:
         case WM_SYNCPAINT:
         case WM_SETREDRAW:
         case WM_CLIENTSHUTDOWN:
@@ -1269,6 +785,8 @@ User32DefWindowProc(HWND hWnd,
         case WM_WINDOWPOSCHANGING:
         case WM_WINDOWPOSCHANGED:
         case WM_APPCOMMAND:
+        case WM_SETCURSOR:
+GoSS:
         {
             LRESULT lResult;
             NtUserMessageCall( hWnd, Msg, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, !bUnicode);
@@ -1458,15 +976,8 @@ RealDefWindowProcA(HWND hWnd,
 
             if ((GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
             {
-                /* FIXME: this is not 100% correct */
-                if(gpsi->dwSRVIFlags & SRVINFO_APIHOOK)
-                {
-                    SendMessage(hWnd, WM_NCUAHDRAWCAPTION,0,0);
-                }
-                else
-                {
-                    DefWndNCPaint(hWnd, HRGN_WINDOW, -1);
-                }
+                UserPaintCaption(Wnd, DC_TEXT);
+                IntNotifyWinEvent(EVENT_OBJECT_NAMECHANGE, hWnd, OBJID_WINDOW, CHILDID_SELF, 0);
             }
             Result = 1;
             break;
@@ -1497,6 +1008,7 @@ RealDefWindowProcA(HWND hWnd,
         case WM_IME_ENDCOMPOSITION:
         case WM_IME_SELECT:
         case WM_IME_NOTIFY:
+        case WM_IME_CONTROL:
         {
             HWND hwndIME;
 
@@ -1629,17 +1141,7 @@ RealDefWindowProcW(HWND hWnd,
             DefSetText(hWnd, (PCWSTR)lParam, FALSE);
 
             if ((GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
-            {
-                /* FIXME: this is not 100% correct */
-                if(gpsi->dwSRVIFlags & SRVINFO_APIHOOK)
-                {
-                    SendMessage(hWnd, WM_NCUAHDRAWCAPTION,0,0);
-                }
-                else
-                {
-                    DefWndNCPaint(hWnd, HRGN_WINDOW, -1);
-                }
-            }
+                UserPaintCaption(Wnd, DC_TEXT);
             Result = 1;
             break;
         }
@@ -1668,6 +1170,7 @@ RealDefWindowProcW(HWND hWnd,
         case WM_IME_ENDCOMPOSITION:
         case WM_IME_SELECT:
         case WM_IME_NOTIFY:
+        case WM_IME_CONTROL:
         {
             HWND hwndIME;