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

svn path=/trunk/; revision=36933
This commit is contained in:
Dmitry Chapyshev 2008-10-25 07:37:48 +00:00
parent 8a90945651
commit 1e2dcd06e8
3 changed files with 318 additions and 107 deletions

View file

@ -42,8 +42,22 @@ GetMouseMovePointsEx(
int nBufPoints, int nBufPoints,
DWORD resolution) DWORD resolution)
{ {
UNIMPLEMENTED; if((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64))
return 0; {
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 @@ GetInternalWindowPos(
LPPOINT ptIcon LPPOINT ptIcon
) )
{ {
UNIMPLEMENTED; WINDOWPLACEMENT wndpl;
return FALSE;
if (GetWindowPlacement(hwnd, &wndpl))
{
if (rectWnd) *rectWnd = wndpl.rcNormalPosition;
if (ptIcon) *ptIcon = wndpl.ptMinPosition;
return wndpl.showCmd;
}
return 0;
} }
/* /*
@ -226,41 +247,91 @@ UserRealizePalette ( HDC hDC )
return NtUserCallOneParam((DWORD) hDC, ONEPARAM_ROUTINE_REALIZEPALETTE); return NtUserCallOneParam((DWORD) hDC, ONEPARAM_ROUTINE_REALIZEPALETTE);
} }
/*
* @unimplemented /*************************************************************************
* 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]
*/ */
HANDLE
static HPEN SysColorPens[COLOR_MENUBAR + 1];
static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1];
DWORD
WINAPI WINAPI
SetSysColorsTemp( SetSysColorsTemp(const COLORREF *pPens,
const COLORREF *pPens, const HBRUSH *pBrushes,
const HBRUSH *pBrushes, DWORD n)
INT n
)
{ {
UNIMPLEMENTED; DWORD i;
return FALSE;
}
/* if (pPens && pBrushes) /* "set" call */
* @unimplemented {
*/ /* allocate our structure to remember old colors */
WORD LPVOID pOldCol = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD)+n*sizeof(HPEN)+n*sizeof(HBRUSH));
STDCALL LPVOID p = pOldCol;
CascadeChildWindows ( HWND hWndParent, WORD wFlags ) *(DWORD *)p = n; p = (char*)p + sizeof(DWORD);
{ memcpy(p, SysColorPens, n*sizeof(HPEN)); p = (char*)p + n*sizeof(HPEN);
UNIMPLEMENTED; memcpy(p, SysColorBrushes, n*sizeof(HBRUSH)); p = (char*)p + n*sizeof(HBRUSH);
return FALSE;
}
/* for (i=0; i < n; i++)
* @unimplemented {
*/ SysColorPens[i] = CreatePen( PS_SOLID, 1, pPens[i] );
WORD SysColorBrushes[i] = pBrushes[i];
STDCALL }
TileChildWindows ( HWND hWndParent, WORD wFlags )
{ return (DWORD) pOldCol; /* FIXME: pointer truncation */
UNIMPLEMENTED; }
return FALSE; 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 @@ GetRawInputDeviceInfoW(
PUINT pcbSize) PUINT pcbSize)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*
@ -340,7 +411,7 @@ GetRawInputDeviceInfoA(
PUINT pcbSize) PUINT pcbSize)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*
@ -365,7 +436,7 @@ DefRawInputProc(
UINT cbSizeHeader) UINT cbSizeHeader)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*
@ -374,12 +445,12 @@ DefRawInputProc(
UINT UINT
STDCALL STDCALL
GetRawInputBuffer( GetRawInputBuffer(
PRAWINPUT pData, PRAWINPUT pData,
PUINT pcbSize, PUINT pcbSize,
UINT cbSizeHeader) UINT cbSizeHeader)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*
@ -388,14 +459,14 @@ GetRawInputBuffer(
UINT UINT
STDCALL STDCALL
GetRawInputData( GetRawInputData(
HRAWINPUT hRawInput, HRAWINPUT hRawInput,
UINT uiCommand, UINT uiCommand,
LPVOID pData, LPVOID pData,
PUINT pcbSize, PUINT pcbSize,
UINT cbSizeHeader) UINT cbSizeHeader)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*
@ -408,8 +479,12 @@ GetRawInputDeviceList(
PUINT puiNumDevices, PUINT puiNumDevices,
UINT cbSize) UINT cbSize)
{ {
UNIMPLEMENTED; if(pRawInputDeviceList)
return FALSE; memset(pRawInputDeviceList, 0, sizeof *pRawInputDeviceList);
*puiNumDevices = 0;
UNIMPLEMENTED;
return 0;
} }
/* /*
@ -423,7 +498,7 @@ GetRegisteredRawInputDevices(
UINT cbSize) UINT cbSize)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return 0;
} }
/* /*

View file

@ -1194,6 +1194,7 @@ User32DefWindowProc(HWND hWnd,
if (hDC) if (hDC)
{ {
HICON hIcon; HICON hIcon;
if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE && if (GetWindowLongW(hWnd, GWL_STYLE) & WS_MINIMIZE &&
(hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL) (hIcon = (HICON)GetClassLongW(hWnd, GCL_HICON)) != NULL)
{ {
@ -1762,6 +1763,75 @@ User32DefWindowProc(HWND hWnd,
} }
/*
* 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 LRESULT STDCALL
DefWindowProcA(HWND hWnd, DefWindowProcA(HWND hWnd,
UINT Msg, UINT Msg,
@ -1784,13 +1854,13 @@ DefWindowProcA(HWND hWnd,
if(cs->lpszName) if(cs->lpszName)
{ {
RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName); RtlInitAnsiString(&AnsiString, (LPSTR)cs->lpszName);
RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE); RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
NtUserDefSetText(hWnd, &UnicodeString); NtUserDefSetText(hWnd, &UnicodeString);
RtlFreeUnicodeString(&UnicodeString); RtlFreeUnicodeString(&UnicodeString);
} }
else else
NtUserDefSetText(hWnd, NULL); NtUserDefSetText(hWnd, NULL);
Result = 1; Result = 1;
break; break;
@ -1810,9 +1880,11 @@ DefWindowProcA(HWND hWnd,
buf, buf,
Wnd->WindowName.Length))) Wnd->WindowName.Length)))
{ {
Result = (LRESULT)len; Result = (LRESULT) len;
} }
} }
else Result = 0L;
break; break;
} }
@ -1859,13 +1931,13 @@ DefWindowProcA(HWND hWnd,
if(lParam) if(lParam)
{ {
RtlInitAnsiString(&AnsiString, (LPSTR)lParam); RtlInitAnsiString(&AnsiString, (LPSTR)lParam);
RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE); RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
NtUserDefSetText(hWnd, &UnicodeString); NtUserDefSetText(hWnd, &UnicodeString);
RtlFreeUnicodeString(&UnicodeString); RtlFreeUnicodeString(&UnicodeString);
} }
else else
NtUserDefSetText(hWnd, NULL); NtUserDefSetText(hWnd, NULL);
if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) if ((GetWindowLongW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
{ {
@ -1876,16 +1948,50 @@ DefWindowProcA(HWND hWnd,
break; break;
} }
/* FIXME: Implement these. */
case WM_IME_CHAR:
case WM_IME_KEYDOWN: case WM_IME_KEYDOWN:
{
Result = PostMessageA(hWnd, WM_KEYDOWN, wParam, lParam);
break;
}
case WM_IME_KEYUP: case WM_IME_KEYUP:
{
Result = PostMessageA(hWnd, WM_KEYUP, wParam, lParam);
break;
}
case WM_IME_CHAR:
{
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_STARTCOMPOSITION:
case WM_IME_COMPOSITION: case WM_IME_COMPOSITION:
case WM_IME_ENDCOMPOSITION: case WM_IME_ENDCOMPOSITION:
case WM_IME_SELECT: 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: 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 */ /* fall through */
default: default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE); Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
@ -1916,9 +2022,9 @@ DefWindowProcW(HWND hWnd,
* may have child window IDs instead of window name */ * may have child window IDs instead of window name */
if(cs->lpszName) if(cs->lpszName)
RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName); RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL)); NtUserDefSetText(hWnd, (cs->lpszName ? &UnicodeString : NULL));
Result = 1; Result = 1;
break; break;
} }
@ -1937,9 +2043,11 @@ DefWindowProcW(HWND hWnd,
buf, buf,
Wnd->WindowName.Length))) Wnd->WindowName.Length)))
{ {
Result = (LRESULT)len; Result = (LRESULT) (Wnd->WindowName.Length / sizeof(WCHAR));
} }
} }
else Result = 0L;
break; break;
} }
@ -1978,7 +2086,7 @@ DefWindowProcW(HWND hWnd,
UNICODE_STRING UnicodeString; UNICODE_STRING UnicodeString;
if(lParam) if(lParam)
RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam); RtlInitUnicodeString(&UnicodeString, (LPWSTR)lParam);
NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL)); NtUserDefSetText(hWnd, (lParam ? &UnicodeString : NULL));
@ -1992,16 +2100,44 @@ DefWindowProcW(HWND hWnd,
case WM_IME_CHAR: case WM_IME_CHAR:
{ {
SendMessageW(hWnd, WM_CHAR, wParam, lParam); PostMessageW(hWnd, WM_CHAR, wParam, lParam);
Result = 0; Result = 0;
break; 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: case WM_IME_SETCONTEXT:
{ {
/* FIXME */ HWND hwndIME;
FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
Result = 0; hwndIME = DefWndImmGetDefaultIMEWnd(hWnd);
if (hwndIME)
Result = DefWndImmIsUIMessageW(hwndIME, Msg, wParam, lParam);
break; break;
} }

View file

@ -96,28 +96,24 @@ BringWindowToTop(HWND hWnd)
} }
/*
* @unimplemented
*/
/*
WORD STDCALL
CascadeWindows(HWND hwndParent,
UINT wHow,
CONST RECT *lpRect,
UINT cKids,
const HWND *lpKids)
{
UNIMPLEMENTED;
return 0;
}
*/
VOID STDCALL VOID STDCALL
SwitchToThisWindow(HWND hwnd, BOOL fUnknown) SwitchToThisWindow(HWND hwnd, BOOL fUnknown)
{ {
ShowWindow(hwnd, SW_SHOW); ShowWindow(hwnd, SW_SHOW);
} }
/*
* @implemented
*/
WORD
STDCALL
CascadeChildWindows ( HWND hWndParent, WORD wFlags )
{
return CascadeWindows(hWndParent, wFlags, NULL, 0, NULL);
}
/* /*
* @implemented * @implemented
*/ */
@ -1003,8 +999,16 @@ GetParent(HWND hWnd)
BOOL STDCALL BOOL STDCALL
GetProcessDefaultLayout(DWORD *pdwDefaultLayout) GetProcessDefaultLayout(DWORD *pdwDefaultLayout)
{ {
if (!pdwDefaultLayout)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE;
*pdwDefaultLayout = 0;
return TRUE;
} }
@ -1502,7 +1506,7 @@ BOOL STDCALL
LockSetForegroundWindow(UINT uLockCode) LockSetForegroundWindow(UINT uLockCode)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return TRUE;
} }
@ -1602,6 +1606,9 @@ SetParent(HWND hWndChild,
BOOL STDCALL BOOL STDCALL
SetProcessDefaultLayout(DWORD dwDefaultLayout) SetProcessDefaultLayout(DWORD dwDefaultLayout)
{ {
if (dwDefaultLayout == 0)
return TRUE;
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE; return FALSE;
} }
@ -1741,23 +1748,6 @@ ShowWindowAsync(HWND hWnd,
} }
/*
* @unimplemented
*/
/*
WORD STDCALL
TileWindows(HWND hwndParent,
UINT wHow,
CONST RECT *lpRect,
UINT cKids,
const HWND *lpKids)
{
UNIMPLEMENTED;
return 0;
}
*/
/* /*
* @unimplemented * @unimplemented
*/ */
@ -2000,6 +1990,16 @@ ScrollWindowEx(HWND hWnd,
flags); flags);
} }
/*
* @implemented
*/
WORD
STDCALL
TileChildWindows(HWND hWndParent, WORD wFlags)
{
return TileWindows(hWndParent, wFlags, NULL, 0, NULL);
}
/* /*
* @implemented * @implemented
*/ */