X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=subsys%2Fwin32k%2Fntuser%2Fmisc.c;fp=subsys%2Fwin32k%2Fntuser%2Fmisc.c;h=4fc1d1c4eccb57bee7b9b33ddd3a25c2d1742c6a;hp=0000000000000000000000000000000000000000;hb=a3df8bf1429570e0bd6c6428f6ed80073578cf4b;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/subsys/win32k/ntuser/misc.c b/subsys/win32k/ntuser/misc.c new file mode 100644 index 0000000..4fc1d1c --- /dev/null +++ b/subsys/win32k/ntuser/misc.c @@ -0,0 +1,340 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: Misc User funcs + * FILE: subsys/win32k/ntuser/misc.c + * PROGRAMER: Ge van Geldorp (ge@gse.nl) + * REVISION HISTORY: + * 2003/05/22 Created + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + + +/* + * @unimplemented + */ +DWORD +STDCALL +NtUserCallNoParam( + DWORD Routine) +{ +/* + switch(Routine) + { + case 0: + break; + } +*/ + DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam()\n", Routine); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; +} + + +/* + * @implemented + */ +DWORD +STDCALL +NtUserCallOneParam( + DWORD Param, + DWORD Routine) +{ + NTSTATUS Status; + DWORD Result = 0; + PWINSTATION_OBJECT WinStaObject; + PWINDOW_OBJECT WindowObject; + + switch(Routine) + { + case ONEPARAM_ROUTINE_GETMENU: + WindowObject = IntGetWindowObject((HWND)Param); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + Result = (DWORD)WindowObject->IDMenu; + + IntReleaseWindowObject(WindowObject); + return Result; + + case ONEPARAM_ROUTINE_ISWINDOWUNICODE: + WindowObject = IntGetWindowObject((HWND)Param); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + Result = WindowObject->Unicode; + IntReleaseWindowObject(WindowObject); + return Result; + + case ONEPARAM_ROUTINE_WINDOWFROMDC: + return (DWORD)IntWindowFromDC((HDC)Param); + + case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID: + WindowObject = IntGetWindowObject((HWND)Param); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + Result = WindowObject->ContextHelpId; + + IntReleaseWindowObject(WindowObject); + return Result; + case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON: + Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if (!NT_SUCCESS(Status)) + return (DWORD)FALSE; + + Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); + + ObDereferenceObject(WinStaObject); + return Result; + + } + DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam()\n Param=0x%x\n", + Routine, Param); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; +} + + +/* + * @implemented + */ +DWORD +STDCALL +NtUserCallTwoParam( + DWORD Param1, + DWORD Param2, + DWORD Routine) +{ + NTSTATUS Status; + PWINDOW_OBJECT WindowObject; + PSYSTEM_CURSORINFO CurInfo; + PWINSTATION_OBJECT WinStaObject; + PPOINT Pos; + + switch(Routine) + { + case TWOPARAM_ROUTINE_ENABLEWINDOW: + UNIMPLEMENTED + return 0; + + case TWOPARAM_ROUTINE_UNKNOWN: + UNIMPLEMENTED + return 0; + + case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS: + UNIMPLEMENTED + return 0; + + case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW: + UNIMPLEMENTED + return 0; + + case TWOPARAM_ROUTINE_VALIDATERGN: + return (DWORD)NtUserValidateRgn((HWND) Param1, (HRGN) Param2); + + case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID: + WindowObject = IntGetWindowObject((HWND)Param1); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return (DWORD)FALSE; + } + + WindowObject->ContextHelpId = Param2; + + IntReleaseWindowObject(WindowObject); + return (DWORD)TRUE; + + case TWOPARAM_ROUTINE_CURSORPOSITION: + if(!Param1) + return (DWORD)FALSE; + Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if (!NT_SUCCESS(Status)) + return (DWORD)FALSE; + + Pos = (PPOINT)Param1; + + if(Param2) + { + /* set cursor position */ + + CurInfo = &WinStaObject->SystemCursor; + /* FIXME - check if process has WINSTA_WRITEATTRIBUTES */ + + //CheckClipCursor(&Pos->x, &Pos->y, CurInfo); + if((Pos->x != CurInfo->x) || (Pos->y != CurInfo->y)) + { + MouseMoveCursor(Pos->x, Pos->y); + } + + } + else + { + /* get cursor position */ + /* FIXME - check if process has WINSTA_READATTRIBUTES */ + Pos->x = WinStaObject->SystemCursor.x; + Pos->y = WinStaObject->SystemCursor.y; + } + + ObDereferenceObject(WinStaObject); + + return (DWORD)TRUE; + + } + DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam()\n Param1=0x%x Parm2=0x%x\n", + Routine, Param1, Param2); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; +} + + +/* + * @implemented + */ +DWORD +STDCALL +NtUserSystemParametersInfo( + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) +{ + /* FIXME: This should be obtained from the registry */ + static LOGFONTW CaptionFont = + { 14, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"" }; +/* { 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET, + 0, 0, DEFAULT_QUALITY, FF_MODERN, L"Bitstream Vera Sans Bold" };*/ + NTSTATUS Status; + PWINSTATION_OBJECT WinStaObject; + + switch(uiAction) + { + case SPI_SETDOUBLECLKWIDTH: + case SPI_SETDOUBLECLKHEIGHT: + case SPI_SETDOUBLECLICKTIME: + Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if (!NT_SUCCESS(Status)) + return (DWORD)FALSE; + + switch(uiAction) + { + case SPI_SETDOUBLECLKWIDTH: + /* FIXME limit the maximum value? */ + WinStaObject->SystemCursor.DblClickWidth = uiParam; + break; + case SPI_SETDOUBLECLKHEIGHT: + /* FIXME limit the maximum value? */ + WinStaObject->SystemCursor.DblClickHeight = uiParam; + break; + case SPI_SETDOUBLECLICKTIME: + /* FIXME limit the maximum time to 1000 ms? */ + WinStaObject->SystemCursor.DblClickSpeed = uiParam; + break; + } + + /* FIXME save the value to the registry */ + + ObDereferenceObject(WinStaObject); + return TRUE; + + case SPI_GETWORKAREA: + { + ((PRECT)pvParam)->left = 0; + ((PRECT)pvParam)->top = 0; + ((PRECT)pvParam)->right = 640; + ((PRECT)pvParam)->bottom = 480; + return TRUE; + } + case SPI_GETICONTITLELOGFONT: + { + memcpy(pvParam, &CaptionFont, sizeof(CaptionFont)); + return TRUE; + } + case SPI_GETNONCLIENTMETRICS: + { + LPNONCLIENTMETRICSW pMetrics = (LPNONCLIENTMETRICSW)pvParam; + + if (pMetrics->cbSize != sizeof(NONCLIENTMETRICSW) || + uiParam != sizeof(NONCLIENTMETRICSW)) + { + return FALSE; + } + + memset((char *)pvParam + sizeof(pMetrics->cbSize), 0, + pMetrics->cbSize - sizeof(pMetrics->cbSize)); + + pMetrics->iBorderWidth = 1; + pMetrics->iScrollWidth = NtUserGetSystemMetrics(SM_CXVSCROLL); + pMetrics->iScrollHeight = NtUserGetSystemMetrics(SM_CYHSCROLL); + pMetrics->iCaptionWidth = NtUserGetSystemMetrics(SM_CXSIZE); + pMetrics->iCaptionHeight = NtUserGetSystemMetrics(SM_CYSIZE); + memcpy((LPVOID)&(pMetrics->lfCaptionFont), &CaptionFont, sizeof(CaptionFont)); + pMetrics->lfCaptionFont.lfWeight = FW_BOLD; + pMetrics->iSmCaptionWidth = NtUserGetSystemMetrics(SM_CXSMSIZE); + pMetrics->iSmCaptionHeight = NtUserGetSystemMetrics(SM_CYSMSIZE); + memcpy((LPVOID)&(pMetrics->lfSmCaptionFont), &CaptionFont, sizeof(CaptionFont)); + pMetrics->iMenuWidth = NtUserGetSystemMetrics(SM_CXMENUSIZE); + pMetrics->iMenuHeight = NtUserGetSystemMetrics(SM_CYMENUSIZE); + memcpy((LPVOID)&(pMetrics->lfMenuFont), &CaptionFont, sizeof(CaptionFont)); + memcpy((LPVOID)&(pMetrics->lfStatusFont), &CaptionFont, sizeof(CaptionFont)); + memcpy((LPVOID)&(pMetrics->lfMessageFont), &CaptionFont, sizeof(CaptionFont)); + return TRUE; + } + + } + return FALSE; +} + +UINT +STDCALL +NtUserGetDoubleClickTime(VOID) +{ + UINT Result; + NTSTATUS Status; + PWINSTATION_OBJECT WinStaObject; + + Status = ValidateWindowStationHandle(PROCESS_WINDOW_STATION(), + KernelMode, + 0, + &WinStaObject); + if (!NT_SUCCESS(Status)) + return (DWORD)FALSE; + + Result = WinStaObject->SystemCursor.DblClickSpeed; + + ObDereferenceObject(WinStaObject); + return Result; +} +