Author: dchapyshev
Date: Sat Oct 25 02:37:48 2008
New Revision: 36933
URL: 
http://svn.reactos.org/svn/reactos?rev=36933&view=rev
Log:
DefWindowProcA/W:
- Fix WM_GETTEXTLENGHT message
- Add WM_IME_NOTIFY message
- Implement WM_IME_KEYDOWN, WM_IME_KEYUP, WM_IME_SETCONTEXT, WM_IME_CHAR,
WM_IME_STARTCOMPOSITION, WM_IME_COMPOSITION, WM_IME_ENDCOMPOSITION, WM_IME_SELECT,
WM_IME_NOTIFY
- Remove CascadeWindows and TileWindows from window.c (it is already declared in mdi.c)
- Implement TileChildWindows, CascadeChildWindows, GetInternalWindowPos, SetSysColorsTemp
- Add checking params for GetProcessDefaultLayout, SetProcessDefaultLayout,
GetMouseMovePointsEx, GetRawInputDeviceList
- LockSetForegroundWindow return TRUE
- GetRawInputBuffer, GetRawInputDeviceInfoA/W, DefRawInputProc, GetRawInputData,
GetRegisteredRawInputDevices return 0
Based on Wine implementation
Modified:
    trunk/reactos/dll/win32/user32/misc/stubs.c
    trunk/reactos/dll/win32/user32/windows/defwnd.c
    trunk/reactos/dll/win32/user32/windows/window.c
Modified: trunk/reactos/dll/win32/user32/misc/stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/stub…
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/stubs.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -42,8 +42,22 @@
   int nBufPoints,
   DWORD resolution)
 {
-  UNIMPLEMENTED;
-  return 0;
+    if((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64))
+       {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return -1;
+    }
+
+    if(!lppt || !lpptBuf)
+       {
+        SetLastError(ERROR_NOACCESS);
+        return -1;
+    }
+
+    UNIMPLEMENTED;
+
+    SetLastError(ERROR_POINT_NOT_FOUND);
+    return -1;
 }
@@ -137,8 +151,15 @@
                     LPPOINT ptIcon
                     )
 {
-  UNIMPLEMENTED;
-  return FALSE;
+    WINDOWPLACEMENT wndpl;
+
+    if (GetWindowPlacement(hwnd, &wndpl))
+    {
+               if (rectWnd) *rectWnd = wndpl.rcNormalPosition;
+               if (ptIcon)  *ptIcon = wndpl.ptMinPosition;
+               return wndpl.showCmd;
+    }
+    return 0;
 }
 /*
@@ -226,41 +247,91 @@
   return NtUserCallOneParam((DWORD) hDC, ONEPARAM_ROUTINE_REALIZEPALETTE);
 }
-/*
- * @unimplemented
- */
-HANDLE
+
+/*************************************************************************
+ *             SetSysColorsTemp (USER32.@) (Wine 10/22/2008)
+ *
+ * UNDOCUMENTED !!
+ *
+ * Called by W98SE desk.cpl Control Panel Applet:
+ * handle = SetSysColorsTemp(ptr, ptr, nCount);     ("set" call)
+ * result = SetSysColorsTemp(NULL, NULL, handle);   ("restore" call)
+ *
+ * pPens is an array of COLORREF values, which seems to be used
+ * to indicate the color values to create new pens with.
+ *
+ * pBrushes is an array of solid brush handles (returned by a previous
+ * CreateSolidBrush), which seems to contain the brush handles to set
+ * for the system colors.
+ *
+ * n seems to be used for
+ *   a) indicating the number of entries to operate on (length of pPens,
+ *      pBrushes)
+ *   b) passing the handle that points to the previously used color settings.
+ *      I couldn't figure out in hell what kind of handle this is on
+ *      Windows. I just use a heap handle instead. Shouldn't matter anyway.
+ *
+ * RETURNS
+ *     heap handle of our own copy of the current syscolors in case of
+ *                 "set" call, i.e. pPens, pBrushes != NULL.
+ *     TRUE (unconditionally !) in case of "restore" call,
+ *          i.e. pPens, pBrushes == NULL.
+ *     FALSE in case of either pPens != NULL and pBrushes == NULL
+ *          or pPens == NULL and pBrushes != NULL.
+ *
+ * I'm not sure whether this implementation is 100% correct. [AM]
+ */
+
+static HPEN SysColorPens[COLOR_MENUBAR + 1];
+static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1];
+
+DWORD
 WINAPI
-SetSysColorsTemp(
-                const COLORREF *pPens,
-                const HBRUSH   *pBrushes,
-                INT            n
-                )
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
-
-/*
- * @unimplemented
- */
-WORD
-STDCALL
-CascadeChildWindows ( HWND hWndParent, WORD wFlags )
-{
-  UNIMPLEMENTED;
-  return FALSE;
-}
-
-/*
- * @unimplemented
- */
-WORD
-STDCALL
-TileChildWindows ( HWND hWndParent, WORD wFlags )
-{
-  UNIMPLEMENTED;
-  return FALSE;
+SetSysColorsTemp(const COLORREF *pPens,
+                 const HBRUSH *pBrushes,
+                                DWORD n)
+{
+    DWORD i;
+
+    if (pPens && pBrushes) /* "set" call */
+    {
+        /* allocate our structure to remember old colors */
+        LPVOID pOldCol = HeapAlloc(GetProcessHeap(), 0,
sizeof(DWORD)+n*sizeof(HPEN)+n*sizeof(HBRUSH));
+        LPVOID p = pOldCol;
+        *(DWORD *)p = n; p = (char*)p + sizeof(DWORD);
+        memcpy(p, SysColorPens, n*sizeof(HPEN)); p = (char*)p + n*sizeof(HPEN);
+        memcpy(p, SysColorBrushes, n*sizeof(HBRUSH)); p = (char*)p + n*sizeof(HBRUSH);
+
+        for (i=0; i < n; i++)
+        {
+            SysColorPens[i] = CreatePen( PS_SOLID, 1, pPens[i] );
+            SysColorBrushes[i] = pBrushes[i];
+        }
+
+        return (DWORD) pOldCol; /* FIXME: pointer truncation */
+    }
+    if (!pPens && !pBrushes) /* "restore" call */
+    {
+        LPVOID pOldCol = (LPVOID)n; /* FIXME: not 64-bit safe */
+        LPVOID p = pOldCol;
+        DWORD nCount = *(DWORD *)p;
+        p = (char*)p + sizeof(DWORD);
+
+        for (i=0; i < nCount; i++)
+        {
+            DeleteObject(SysColorPens[i]);
+            SysColorPens[i] = *(HPEN *)p; p = (char*)p + sizeof(HPEN);
+        }
+        for (i=0; i < nCount; i++)
+        {
+            SysColorBrushes[i] = *(HBRUSH *)p; p = (char*)p + sizeof(HBRUSH);
+        }
+        /* get rid of storage structure */
+        HeapFree(GetProcessHeap(), 0, pOldCol);
+
+        return TRUE;
+    }
+    return FALSE;
 }
 /*
@@ -308,7 +379,7 @@
     PUINT pcbSize)
 {
   UNIMPLEMENTED;
-  return FALSE;
+  return 0;
 }
 /*
@@ -340,7 +411,7 @@
     PUINT pcbSize)
 {
   UNIMPLEMENTED;
-  return FALSE;
+  return 0;
 }
 /*
@@ -365,7 +436,7 @@
     UINT cbSizeHeader)
 {
   UNIMPLEMENTED;
-  return FALSE;
+  return 0;
 }
 /*
@@ -374,12 +445,12 @@
 UINT
 STDCALL
 GetRawInputBuffer(
-    PRAWINPUT   pData,
-    PUINT    pcbSize,
-    UINT         cbSizeHeader)
-{
-  UNIMPLEMENTED;
-  return FALSE;
+    PRAWINPUT pData,
+    PUINT pcbSize,
+    UINT cbSizeHeader)
+{
+  UNIMPLEMENTED;
+  return 0;
 }
 /*
@@ -388,14 +459,14 @@
 UINT
 STDCALL
 GetRawInputData(
-    HRAWINPUT    hRawInput,
-    UINT         uiCommand,
-    LPVOID      pData,
-    PUINT    pcbSize,
-    UINT         cbSizeHeader)
-{
-  UNIMPLEMENTED;
-  return FALSE;
+    HRAWINPUT hRawInput,
+    UINT uiCommand,
+    LPVOID pData,
+    PUINT pcbSize,
+    UINT cbSizeHeader)
+{
+  UNIMPLEMENTED;
+  return 0;
 }
 /*
@@ -408,8 +479,12 @@
     PUINT puiNumDevices,
     UINT cbSize)
 {
-  UNIMPLEMENTED;
-  return FALSE;
+    if(pRawInputDeviceList)
+        memset(pRawInputDeviceList, 0, sizeof *pRawInputDeviceList);
+    *puiNumDevices = 0;
+
+    UNIMPLEMENTED;
+    return 0;
 }
 /*
@@ -423,7 +498,7 @@
     UINT cbSize)
 {
   UNIMPLEMENTED;
-  return FALSE;
+  return 0;
 }
 /*
Modified: trunk/reactos/dll/win32/user32/windows/defwnd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/d…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/defwnd.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/defwnd.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -1194,6 +1194,7 @@
             if (hDC)
             {
                 HICON hIcon;
+
                 if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE &&
                     (hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL)
                 {
@@ -1762,6 +1763,75 @@
 }
+/*
+ * helpers for calling IMM32 (from Wine 10/22/2008)
+ *
+ * WM_IME_* messages are generated only by IMM32,
+ * so I assume imm32 is already LoadLibrary-ed.
+ */
+static HWND
+DefWndImmGetDefaultIMEWnd(HWND hwnd)
+{
+    HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+    HWND (WINAPI *pFunc)(HWND);
+    HWND hwndRet = 0;
+
+    if (!hInstIMM)
+    {
+        ERR("cannot get IMM32 handle\n");
+        return 0;
+    }
+
+    pFunc = (void*) GetProcAddress(hInstIMM, "ImmGetDefaultIMEWnd");
+    if (pFunc != NULL)
+        hwndRet = (*pFunc)(hwnd);
+
+    return hwndRet;
+}
+
+
+static BOOL
+DefWndImmIsUIMessageA(HWND hwndIME, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+    BOOL (WINAPI *pFunc)(HWND,UINT,WPARAM,LPARAM);
+    BOOL fRet = FALSE;
+
+    if (!hInstIMM)
+    {
+        ERR("cannot get IMM32 handle\n");
+        return FALSE;
+    }
+
+    pFunc = (void*) GetProcAddress(hInstIMM, "ImmIsUIMessageA");
+    if (pFunc != NULL)
+        fRet = (*pFunc)(hwndIME, msg, wParam, lParam);
+
+    return fRet;
+}
+
+
+static BOOL
+DefWndImmIsUIMessageW(HWND hwndIME, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    HINSTANCE hInstIMM = GetModuleHandleW(L"imm32\0");
+    BOOL (WINAPI *pFunc)(HWND,UINT,WPARAM,LPARAM);
+    BOOL fRet = FALSE;
+
+    if (!hInstIMM)
+    {
+        ERR("cannot get IMM32 handle\n");
+        return FALSE;
+    }
+
+    pFunc = (void*) GetProcAddress(hInstIMM, "ImmIsUIMessageW");
+    if (pFunc != NULL)
+        fRet = (*pFunc)(hwndIME, msg, wParam, lParam);
+
+    return fRet;
+}
+
+
 LRESULT STDCALL
 DefWindowProcA(HWND hWnd,
               UINT Msg,
@@ -1784,13 +1854,13 @@
             if(cs->lpszName)
             {
-              RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
-              RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
-              NtUserDefSetText(hWnd, &UnicodeString);
-              RtlFreeUnicodeString(&UnicodeString);
+                RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
+                RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
+                NtUserDefSetText(hWnd, &UnicodeString);
+                RtlFreeUnicodeString(&UnicodeString);
             }
             else
-              NtUserDefSetText(hWnd, NULL);
+                NtUserDefSetText(hWnd, NULL);
             Result = 1;
             break;
@@ -1810,9 +1880,11 @@
                                                          buf,
                                                          Wnd->WindowName.Length)))
                 {
-                    Result = (LRESULT)len;
+                    Result = (LRESULT) len;
                 }
             }
+            else Result = 0L;
+
             break;
         }
@@ -1859,13 +1931,13 @@
             if(lParam)
             {
-              RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
-              RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
-              NtUserDefSetText(hWnd, &UnicodeString);
-              RtlFreeUnicodeString(&UnicodeString);
+                RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
+                RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
+                NtUserDefSetText(hWnd, &UnicodeString);
+                RtlFreeUnicodeString(&UnicodeString);
             }
             else
-              NtUserDefSetText(hWnd, NULL);
+                NtUserDefSetText(hWnd, NULL);
             if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
             {
@@ -1876,16 +1948,50 @@
             break;
         }
-/*      FIXME: Implement these. */
+        case WM_IME_KEYDOWN:
+        {
+            Result = PostMessageA(hWnd, WM_KEYDOWN, wParam, lParam);
+            break;
+        }
+
+        case WM_IME_KEYUP:
+        {
+            Result = PostMessageA(hWnd, WM_KEYUP, wParam, lParam);
+            break;
+        }
+
         case WM_IME_CHAR:
-        case WM_IME_KEYDOWN:
-        case WM_IME_KEYUP:
+        {
+            if (HIBYTE(wParam))
+                PostMessageA(hWnd, WM_CHAR, HIBYTE(wParam), lParam);
+            PostMessageA(hWnd, WM_CHAR, LOBYTE(wParam), lParam);
+            break;
+        }
+
         case WM_IME_STARTCOMPOSITION:
         case WM_IME_COMPOSITION:
         case WM_IME_ENDCOMPOSITION:
         case WM_IME_SELECT:
+        case WM_IME_NOTIFY:
+        {
+            HWND hwndIME;
+
+            hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+            if (hwndIME)
+                Result = SendMessageA(hwndIME, Msg, wParam, lParam);
+            break;
+        }
+
         case WM_IME_SETCONTEXT:
-            FIXME("FIXME: WM_IME_* conversion isn't implemented yet!");
+        {
+            HWND hwndIME;
+
+            hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+            if (hwndIME)
+                Result = DefWndImmIsUIMessageA(hwndIME, Msg, wParam, lParam);
+            break;
+        }
+
         /* fall through */
         default:
             Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
@@ -1916,9 +2022,9 @@
              * may have child window IDs instead of window name */
             if(cs->lpszName)
-              RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
-
-            NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL));
+                RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
+
+            NtUserDefSetText(hWnd, (cs->lpszName ? &UnicodeString : NULL));
             Result = 1;
             break;
         }
@@ -1937,9 +2043,11 @@
                                                          buf,
                                                          Wnd->WindowName.Length)))
                 {
-                    Result = (LRESULT)len;
+                    Result = (LRESULT) (Wnd->WindowName.Length / sizeof(WCHAR));
                 }
             }
+            else Result = 0L;
+
             break;
         }
@@ -1978,7 +2086,7 @@
             UNICODE_STRING UnicodeString;
             if(lParam)
-              RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);
+                RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);
             NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL));
@@ -1992,16 +2100,44 @@
         case WM_IME_CHAR:
         {
-            SendMessageW(hWnd, WM_CHAR, wParam, lParam);
+            PostMessageW(hWnd, WM_CHAR, wParam, lParam);
             Result = 0;
             break;
         }
+        case WM_IME_KEYDOWN:
+        {
+            Result = PostMessageW(hWnd, WM_KEYDOWN, wParam, lParam);
+            break;
+        }
+
+        case WM_IME_KEYUP:
+        {
+            Result = PostMessageW(hWnd, WM_KEYUP, wParam, lParam);
+            break;
+        }
+
+        case WM_IME_STARTCOMPOSITION:
+        case WM_IME_COMPOSITION:
+        case WM_IME_ENDCOMPOSITION:
+        case WM_IME_SELECT:
+        case WM_IME_NOTIFY:
+        {
+            HWND hwndIME;
+
+            hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+            if (hwndIME)
+                Result = SendMessageW(hwndIME, Msg, wParam, lParam);
+            break;
+        }
+
         case WM_IME_SETCONTEXT:
         {
-            /* FIXME */
-            FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
-            Result = 0;
+            HWND hwndIME;
+
+            hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
+            if (hwndIME)
+                Result = DefWndImmIsUIMessageW(hwndIME, Msg, wParam, lParam);
             break;
         }
Modified: trunk/reactos/dll/win32/user32/windows/window.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/w…
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/windows/window.c [iso-8859-1] Sat Oct 25 02:37:48 2008
@@ -96,27 +96,23 @@
 }
-/*
- * @unimplemented
- */
-/*
-WORD STDCALL
-CascadeWindows(HWND hwndParent,
-           UINT wHow,
-           CONST RECT *lpRect,
-           UINT cKids,
-           const HWND *lpKids)
-{
-  UNIMPLEMENTED;
-  return 0;
-}
-*/
-
 VOID STDCALL
 SwitchToThisWindow(HWND hwnd, BOOL fUnknown)
 {
     ShowWindow(hwnd, SW_SHOW);
 }
+
+
+/*
+ * @implemented
+ */
+WORD
+STDCALL
+CascadeChildWindows ( HWND hWndParent, WORD wFlags )
+{
+  return CascadeWindows(hWndParent, wFlags, NULL, 0, NULL);
+}
+
 /*
  * @implemented
@@ -1003,8 +999,16 @@
 BOOL STDCALL
 GetProcessDefaultLayout(DWORD *pdwDefaultLayout)
 {
+    if (!pdwDefaultLayout)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
     UNIMPLEMENTED;
-    return FALSE;
+
+    *pdwDefaultLayout = 0;
+    return TRUE;
 }
@@ -1502,7 +1506,7 @@
 LockSetForegroundWindow(UINT uLockCode)
 {
     UNIMPLEMENTED;
-    return FALSE;
+    return TRUE;
 }
@@ -1602,6 +1606,9 @@
 BOOL STDCALL
 SetProcessDefaultLayout(DWORD dwDefaultLayout)
 {
+    if (dwDefaultLayout == 0)
+        return TRUE;
+
     UNIMPLEMENTED;
     return FALSE;
 }
@@ -1739,23 +1746,6 @@
 {
     return NtUserShowWindowAsync(hWnd, nCmdShow);
 }
-
-
-/*
- * @unimplemented
- */
-/*
-WORD STDCALL
-TileWindows(HWND hwndParent,
-        UINT wHow,
-        CONST RECT *lpRect,
-        UINT cKids,
-        const HWND *lpKids)
-{
-  UNIMPLEMENTED;
-  return 0;
-}
-*/
 /*
@@ -2003,6 +1993,16 @@
 /*
  * @implemented
  */
+WORD
+STDCALL
+TileChildWindows(HWND hWndParent, WORD wFlags)
+{
+    return TileWindows(hWndParent, wFlags, NULL, 0, NULL);
+}
+
+/*
+ * @implemented
+ */
 BOOL STDCALL
 AnyPopup(VOID)
 {