diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index e9b3e6480c8..2e14ce3aed0 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -401,99 +401,10 @@ VOID SetUserSysColors(VOID) RegCloseKey(hKey); } -static -VOID LoadUserFontSetting( - IN LPWSTR lpValueName, - OUT PLOGFONTW pFont) -{ - HKEY hKey; - LOGFONTW lfTemp; - DWORD Type, Size; - LONG rc; +DWORD +WINAPI +UpdatePerUserSystemParameters(DWORD dw1, BOOL bEnable); - TRACE("(%s, %p)\n", debugstr_w(lpValueName), pFont); - - Size = sizeof(LOGFONTW); - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS, - 0, KEY_QUERY_VALUE, &hKey); - if (rc != ERROR_SUCCESS) - { - WARN("RegOpenKeyEx() failed with error %lu\n", rc); - return; - } - rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&lfTemp, &Size); - if (rc != ERROR_SUCCESS || Type != REG_BINARY) - { - WARN("RegQueryValueEx() failed with error %lu\n", rc); - return; - } - RegCloseKey(hKey); - /* FIXME: Check if lfTemp is a valid font */ - *pFont = lfTemp; -} - -static -VOID LoadUserMetricSetting( - IN LPWSTR lpValueName, - OUT INT *pValue) -{ - HKEY hKey; - DWORD Type, Size; - WCHAR strValue[8]; - LONG rc; - - TRACE("(%s, %p)\n", debugstr_w(lpValueName), pValue); - - Size = sizeof(strValue); - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_METRICS, - 0, KEY_QUERY_VALUE, &hKey); - if (rc != ERROR_SUCCESS) - { - WARN("RegOpenKeyEx() failed with error %lu\n", rc); - return; - } - rc = RegQueryValueEx(hKey, lpValueName, NULL, &Type, (LPBYTE)&strValue, &Size); - if (rc != ERROR_SUCCESS || Type != REG_SZ) - { - WARN("RegQueryValueEx() failed with error %lu\n", rc); - return; - } - RegCloseKey(hKey); - *pValue = StrToInt(strValue); -} - -static -VOID SetUserMetrics(VOID) -{ - NONCLIENTMETRICSW ncmetrics; - MINIMIZEDMETRICS mmmetrics; - - TRACE("()\n"); - - ncmetrics.cbSize = sizeof(NONCLIENTMETRICSW); - mmmetrics.cbSize = sizeof(MINIMIZEDMETRICS); - SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0); - SystemParametersInfoW(SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &mmmetrics, 0); - - LoadUserFontSetting(L"CaptionFont", &ncmetrics.lfCaptionFont); - LoadUserFontSetting(L"SmCaptionFont", &ncmetrics.lfSmCaptionFont); - LoadUserFontSetting(L"MenuFont", &ncmetrics.lfMenuFont); - LoadUserFontSetting(L"StatusFont", &ncmetrics.lfStatusFont); - LoadUserFontSetting(L"MessageFont", &ncmetrics.lfMessageFont); - /* FIXME: load icon font ? */ - - LoadUserMetricSetting(L"BorderWidth", &ncmetrics.iBorderWidth); - LoadUserMetricSetting(L"ScrollWidth", &ncmetrics.iScrollWidth); - LoadUserMetricSetting(L"ScrollHeight", &ncmetrics.iScrollHeight); - LoadUserMetricSetting(L"CaptionWidth", &ncmetrics.iCaptionWidth); - LoadUserMetricSetting(L"CaptionHeight", &ncmetrics.iCaptionHeight); - LoadUserMetricSetting(L"SmCaptionWidth", &ncmetrics.iSmCaptionWidth); - LoadUserMetricSetting(L"SmCaptionHeight", &ncmetrics.iSmCaptionHeight); - LoadUserMetricSetting(L"Menuwidth", &ncmetrics.iMenuWidth); - LoadUserMetricSetting(L"MenuHeight", &ncmetrics.iMenuHeight); - - SystemParametersInfoW(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncmetrics, 0); -} static VOID SetUserWallpaper(VOID) @@ -536,61 +447,6 @@ VOID SetUserWallpaper(VOID) WARN("RegOpenKeyEx() failed with error %lu\n", rc); } -static VOID SetUserPreference(UINT uiAction,BOOL bValue,UINT fWinIni) -{ - DWORD dwvalue = bValue; - SystemParametersInfo(uiAction, 0, (PVOID)&dwvalue, fWinIni); -} - -static VOID SetUserPreferences(VOID) -{ - HKEY hKey; - DWORD Type, Size; - LONG rc; - USERPREFERENCESMASK Preferences; - - TRACE("()\n"); - - rc = RegOpenKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_DESKTOP, - 0, KEY_QUERY_VALUE, &hKey); - if (rc == ERROR_SUCCESS) - { - Size = sizeof(USERPREFERENCESMASK); - ERR("USERPREFERENCESMASK size: %d\n",Size); - - rc = RegQueryValueEx(hKey, - L"UserPreferencesMask", - NULL, - &Type, - (LPBYTE)&Preferences, - &Size); - if (rc == ERROR_SUCCESS && Type == REG_BINARY) - { - SetUserPreference(SPI_SETUIEFFECTS, Preferences.bUiEffects, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETACTIVEWINDOWTRACKING, Preferences.bActiveWindowTracking, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETMENUANIMATION, Preferences.bMenuAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETCOMBOBOXANIMATION, Preferences.bComboBoxAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETLISTBOXSMOOTHSCROLLING, Preferences.bListBoxSmoothScrolling, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETGRADIENTCAPTIONS, Preferences.bGradientCaptions, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETKEYBOARDCUES, Preferences.bKeyboardCues, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETACTIVEWNDTRKZORDER, Preferences.bActiveWndTrkZorder, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETHOTTRACKING, Preferences.bHotTracking, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETMENUFADE, Preferences.bMenuFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETSELECTIONFADE, Preferences.bSelectionFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETTOOLTIPANIMATION, Preferences.bTooltipAnimation, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETTOOLTIPFADE, Preferences.bTooltipFade, SPIF_SENDCHANGE); - SetUserPreference(SPI_SETCURSORSHADOW, Preferences.bCursorShadow, SPIF_SENDCHANGE); - } - else - { - ERR("No User Preferences set in registry or incorrect type (error %lu)\n", rc); - } - RegCloseKey(hKey); - } - else - WARN("RegOpenKeyEx() failed with error %lu\n", rc); -} - static VOID PlayLogonSound() { @@ -641,10 +497,9 @@ VOID SetUserSettings(VOID) { TRACE("()\n"); + UpdatePerUserSystemParameters(1, TRUE); SetUserSysColors(); - SetUserMetrics(); SetUserWallpaper(); - SetUserPreferences(); } typedef DWORD (WINAPI *PCMP_REPORT_LOGON)(DWORD, DWORD); diff --git a/reactos/dll/win32/user32/misc/desktop.c b/reactos/dll/win32/user32/misc/desktop.c index c3eb8266530..fbf519987a5 100644 --- a/reactos/dll/win32/user32/misc/desktop.c +++ b/reactos/dll/win32/user32/misc/desktop.c @@ -124,15 +124,6 @@ SystemParametersInfoA(UINT uiAction, { switch (uiAction) { - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - return FALSE; - } case SPI_GETNONCLIENTMETRICS: { @@ -248,88 +239,40 @@ SystemParametersInfoA(UINT uiAction, } case SPI_GETDESKWALLPAPER: { - HKEY hKey; - BOOL Ret = FALSE; + BOOL Ret; + WCHAR awc[MAX_PATH]; + UNICODE_STRING ustrWallpaper; + ANSI_STRING astrWallpaper; -#if 0 - /* Get the desktop bitmap handle, this does NOT return the file name! */ - if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0)) - { - /* Return an empty string, no wallpapaper is set */ - *(CHAR*)pvParam = '\0'; - return TRUE; - } -#endif + Ret = NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, awc, fWinIni); + RtlInitUnicodeString(&ustrWallpaper, awc); + RtlUnicodeStringToAnsiString(&astrWallpaper, &ustrWallpaper, TRUE); - /* FIXME - Read the registry key for now, but what happens if the wallpaper was - changed without SPIF_UPDATEINIFILE?! */ - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) - { - DWORD Type, Size; - Size = uiParam; - if(RegQueryValueExA(hKey, - "Wallpaper", - NULL, - &Type, - (LPBYTE)pvParam, - &Size) == ERROR_SUCCESS - && Type == REG_SZ) - { - Ret = TRUE; - } - RegCloseKey(hKey); - } + RtlCopyMemory(pvParam, astrWallpaper.Buffer, uiParam); + RtlFreeAnsiString(&astrWallpaper); return Ret; } + case SPI_SETDESKWALLPAPER: { - HBITMAP hNewWallpaper; - BOOL Ret; - LPSTR lpWallpaper = (LPSTR)pvParam; + NTSTATUS Status; + UNICODE_STRING ustrWallpaper; + BOOL Ret; - if(lpWallpaper != NULL && *lpWallpaper != '\0') - { - hNewWallpaper = LoadImageA(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); - if(hNewWallpaper == NULL) + if (pvParam) { - return FALSE; + Status = RtlCreateUnicodeStringFromAsciiz(&ustrWallpaper, pvParam); + if (!NT_SUCCESS(Status)) + { + ERR("Status = 0x%x\n", Status); + return FALSE; + } + pvParam = &ustrWallpaper; } - } - else - { - hNewWallpaper = NULL; - lpWallpaper = NULL; - } - /* Set the wallpaper bitmap */ - if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE)) - { - if(hNewWallpaper != NULL) - DeleteObject(hNewWallpaper); - return FALSE; - } - /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */ - - Ret = TRUE; - if(fWinIni & SPIF_UPDATEINIFILE) - { - /* Save the path to the file in the registry */ - HKEY hKey; - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) - { - Ret = RegSetValueExA(hKey, "Wallpaper", 0, REG_SZ, (LPBYTE)(lpWallpaper != NULL ? lpWallpaper : ""), - (lpWallpaper != NULL ? (lstrlenA(lpWallpaper) + 1) * sizeof(CHAR) : sizeof(CHAR)) == ERROR_SUCCESS); - RegCloseKey(hKey); - } - } - - RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); - - return Ret; + Ret = NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, pvParam, fWinIni); + RtlFreeUnicodeString(&ustrWallpaper); + return Ret; } } return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); @@ -347,97 +290,14 @@ SystemParametersInfoW(UINT uiAction, { switch(uiAction) { - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - FIXME("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - return FALSE; - } - case SPI_GETDESKWALLPAPER: - { - HKEY hKey; - BOOL Ret = FALSE; -#if 0 - /* Get the desktop bitmap handle, this does NOT return the file name! */ - if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0)) - { - /* Return an empty string, no wallpapaper is set */ - *(WCHAR*)pvParam = L'\0'; - return TRUE; - } -#endif - - /* FIXME - Read the registry key for now, but what happens if the wallpaper was - changed without SPIF_UPDATEINIFILE?! */ - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) - { - DWORD Type, Size; - Size = uiParam * sizeof(WCHAR); - if(RegQueryValueExW(hKey, - L"Wallpaper", - NULL, - &Type, - (LPBYTE)pvParam, - &Size) == ERROR_SUCCESS - && Type == REG_SZ) - { - Ret = TRUE; - } - RegCloseKey(hKey); - } - return Ret; - } case SPI_SETDESKWALLPAPER: - { - HBITMAP hNewWallpaper; - BOOL Ret; - LPWSTR lpWallpaper = (LPWSTR)pvParam; - - if(lpWallpaper != NULL && *lpWallpaper != L'\0') { - hNewWallpaper = LoadImageW(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); + UNICODE_STRING ustrWallpaper; - if(hNewWallpaper == NULL) - { - return FALSE; - } + RtlInitUnicodeString(&ustrWallpaper, pvParam); + return NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, uiParam, &ustrWallpaper, fWinIni); } - else - { - hNewWallpaper = NULL; - lpWallpaper = NULL; - } - - /* Set the wallpaper bitmap */ - if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE)) - return FALSE; - /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */ - Ret = TRUE; - if(fWinIni & SPIF_UPDATEINIFILE) - { - /* Save the path to the file in the registry */ - HKEY hKey; - - if(RegOpenKeyExW(HKEY_CURRENT_USER, - L"Control Panel\\Desktop", - 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) - { - Ret = (RegSetValueExW(hKey, L"Wallpaper", 0, REG_SZ, (lpWallpaper != NULL ? (LPBYTE)lpWallpaper : (LPBYTE)L""), - (lpWallpaper != NULL ? (lstrlenW(lpWallpaper) + 1) * sizeof(WCHAR) : sizeof(WCHAR))) == ERROR_SUCCESS); - RegCloseKey(hKey); - } - } - - RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); - - return Ret; - } } return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); } diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index 0139bcc93bc..fa4190852e5 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -1334,21 +1334,6 @@ extern "C" { #define SPI_SETICONTITLELOGFONT 0x0022 #define SPI_GETFASTTASKSWITCH 0x0023 #define SPI_SETFASTTASKSWITCH 0x0024 -#define SPI_GETFILTERKEYS 0x0032 -#define SPI_SETFILTERKEYS 0x0033 -#define SPI_GETTOGGLEKEYS 0x0034 -#define SPI_SETTOGGLEKEYS 0x0035 -#define SPI_GETMOUSEKEYS 0x0036 -#define SPI_SETMOUSEKEYS 0x0037 -#define SPI_GETSHOWSOUNDS 0x0038 -#define SPI_SETSHOWSOUNDS 0x0039 -#define SPI_GETSTICKYKEYS 0x003A -#define SPI_SETSTICKYKEYS 0x003B -#define SPI_GETACCESSTIMEOUT 0x003C -#define SPI_SETACCESSTIMEOUT 0x003D -#define SPI_GETSOUNDSENTRY 0x0040 -#define SPI_SETSOUNDSENTRY 0x0041 - #if(WINVER >= 0x0400) #define SPI_SETDRAGFULLWINDOWS 0x0025 #define SPI_GETDRAGFULLWINDOWS 0x0026 @@ -1361,6 +1346,26 @@ extern "C" { #define SPI_SETWORKAREA 0x002F #define SPI_GETWORKAREA 0x0030 #define SPI_SETPENWINDOWS 0x0031 +#endif +#define SPI_GETFILTERKEYS 0x0032 +#define SPI_SETFILTERKEYS 0x0033 +#define SPI_GETTOGGLEKEYS 0x0034 +#define SPI_SETTOGGLEKEYS 0x0035 +#define SPI_GETMOUSEKEYS 0x0036 +#define SPI_SETMOUSEKEYS 0x0037 +#define SPI_GETSHOWSOUNDS 0x0038 +#define SPI_SETSHOWSOUNDS 0x0039 +#define SPI_GETSTICKYKEYS 0x003A +#define SPI_SETSTICKYKEYS 0x003B +#define SPI_GETACCESSTIMEOUT 0x003C +#define SPI_SETACCESSTIMEOUT 0x003D +#if(WINVER >= 0x0400) + #define SPI_GETSERIALKEYS 0x003E + #define SPI_SETSERIALKEYS 0x003F +#endif +#define SPI_GETSOUNDSENTRY 0x0040 +#define SPI_SETSOUNDSENTRY 0x0041 +#if(WINVER >= 0x0400) #define SPI_GETHIGHCONTRAST 0x0042 #define SPI_SETHIGHCONTRAST 0x0043 #define SPI_GETKEYBOARDPREF 0x0044 @@ -1390,17 +1395,15 @@ extern "C" { #define SPI_GETWINDOWSEXTENSION 0x005C #define SPI_SETMOUSETRAILS 0x005D #define SPI_GETMOUSETRAILS 0x005E - #define SPI_SCREENSAVERRUNNING 0x0061 - #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING - #define SPI_GETSERIALKEYS 0x003E - #define SPI_SETSERIALKEYS 0x003F #endif - #if(_WIN32_WINNT >= 0x0400) #define SPI_GETSNAPTODEFBUTTON 0x005F #define SPI_SETSNAPTODEFBUTTON 0x0060 #endif - +#if(WINVER >= 0x0400) + #define SPI_SCREENSAVERRUNNING 0x0061 + #define SPI_SETSCREENSAVERRUNNING SPI_SCREENSAVERRUNNING +#endif #if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) #define SPI_GETMOUSEHOVERWIDTH 0x0062 #define SPI_SETMOUSEHOVERWIDTH 0x0063 @@ -1412,20 +1415,25 @@ extern "C" { #define SPI_SETWHEELSCROLLLINES 0x0069 #define SPI_GETMENUSHOWDELAY 0x006A #define SPI_SETMENUSHOWDELAY 0x006B + #if (_WIN32_WINNT >= 0x0600) + #define SPI_GETWHEELSCROLLCHARS 0x006C + #define SPI_SETWHEELSCROLLCHARS 0x006D + #endif #define SPI_GETSHOWIMEUI 0x006E #define SPI_SETSHOWIMEUI 0x006F - /* Correct ? */ - #define SPI_GETWHEELSCROLLCHARS 0x006C - #define SPI_SETWHEELSCROLLCHARS 0x006D #endif - #if(WINVER >= 0x0500) #define SPI_GETMOUSESPEED 0x0070 #define SPI_SETMOUSESPEED 0x0071 #define SPI_GETSCREENSAVERRUNNING 0x0072 #define SPI_GETDESKWALLPAPER 0x0073 #endif - +#if(WINVER >= 0x0600) + #define SPI_GETAUDIODESCRIPTION 0x0074 + #define SPI_SETAUDIODESCRIPTION 0x0075 + #define SPI_GETSCREENSAVESECURE 0x0076 + #define SPI_SETSCREENSAVESECURE 0x0077 +#endif #if(WINVER >= 0x0500) #define SPI_GETACTIVEWINDOWTRACKING 0x1000 #define SPI_SETACTIVEWINDOWTRACKING 0x1001 @@ -1455,17 +1463,6 @@ extern "C" { #define SPI_SETTOOLTIPFADE 0x1019 #define SPI_GETCURSORSHADOW 0x101A #define SPI_SETCURSORSHADOW 0x101B - #define SPI_GETUIEFFECTS 0x103E - #define SPI_SETUIEFFECTS 0x103F - #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 - #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 - #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002 - #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003 - #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004 - #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005 - #define SPI_GETCARETWIDTH 0x2006 - #define SPI_SETCARETWIDTH 0x2007 - #if(_WIN32_WINNT >= 0x0501) #define SPI_GETMOUSESONAR 0x101C #define SPI_SETMOUSESONAR 0x101D @@ -1480,13 +1477,31 @@ extern "C" { #define SPI_GETBLOCKSENDINPUTRESETS 0x1026 #define SPI_SETBLOCKSENDINPUTRESETS 0x1027 #endif - + #define SPI_GETUIEFFECTS 0x103E + #define SPI_SETUIEFFECTS 0x103F + #if(_WIN32_WINNT >= 0x0600) + #define SPI_GETDISABLEOVERLAPPEDCONTENT 0x1040 + #define SPI_SETDISABLEOVERLAPPEDCONTENT 0x1041 + #define SPI_GETCLIENTAREAANIMATION 0x1042 + #define SPI_SETCLIENTAREAANIMATION 0x1043 + #define SPI_GETCLEARTYPE 0x1048 + #define SPI_SETCLEARTYPE 0x1049 + #define SPI_GETSPEECHRECOGNITION 0x104A + #define SPI_SETSPEECHRECOGNITION 0x104B + #endif + #define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 + #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 + #define SPI_GETACTIVEWNDTRKTIMEOUT 0x2002 + #define SPI_SETACTIVEWNDTRKTIMEOUT 0x2003 + #define SPI_GETFOREGROUNDFLASHCOUNT 0x2004 + #define SPI_SETFOREGROUNDFLASHCOUNT 0x2005 + #define SPI_GETCARETWIDTH 0x2006 + #define SPI_SETCARETWIDTH 0x2007 #if(_WIN32_WINNT >= 0x0501) #define SPI_GETMOUSECLICKLOCKTIME 0x2008 #define SPI_SETMOUSECLICKLOCKTIME 0x2009 #define SPI_GETFONTSMOOTHINGTYPE 0x200A #define SPI_SETFONTSMOOTHINGTYPE 0x200B - #define SPI_GETFONTSMOOTHINGCONTRAST 0x200C #define SPI_SETFONTSMOOTHINGCONTRAST 0x200D #define SPI_GETFOCUSBORDERWIDTH 0x200E diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index 5335150b7f8..1e9bd2346e5 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -41,14 +41,14 @@ typedef struct _CURSORACCELERATION_INFO typedef struct _SYSTEM_CURSORINFO { BOOL Enabled; - BOOL SwapButtons; + BOOL SwapButtons;// UINT ButtonsDown; CURSORCLIP_INFO CursorClipInfo; PCURICON_OBJECT CurrentCursorObject; - UINT WheelScroLines; - UINT WheelScroChars; +// UINT WheelScroLines; +// UINT WheelScroChars; BYTE ShowingCursor; - UINT DblClickSpeed; + UINT DblClickSpeed;// UINT DblClickWidth; UINT DblClickHeight; @@ -56,8 +56,8 @@ typedef struct _SYSTEM_CURSORINFO UINT MouseHoverWidth; UINT MouseHoverHeight; - UINT MouseSpeed; - CURSORACCELERATION_INFO CursorAccelerationInfo; +// UINT MouseSpeed; +// CURSORACCELERATION_INFO CursorAccelerationInfo; DWORD LastBtnDown; LONG LastBtnDownX; diff --git a/reactos/subsystems/win32/win32k/include/misc.h b/reactos/subsystems/win32/win32k/include/misc.h index 776e940ec82..d40354c5149 100644 --- a/reactos/subsystems/win32/win32k/include/misc.h +++ b/reactos/subsystems/win32/win32k/include/misc.h @@ -54,10 +54,27 @@ extern HGDIOBJ StockObjects[]; extern SHORT gusLanguageID; SHORT FASTCALL IntGdiGetLanguageID(); -ULONG FASTCALL IntSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); DWORD APIENTRY IntGetQueueStatus(BOOL ClearChanges); VOID FASTCALL IntUserManualGuiCheck(LONG Check); PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *); VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID); +BOOL +NTAPI +RegReadUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize); + +BOOL +NTAPI +RegWriteUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize); + #endif /* __WIN32K_MISC_H */ diff --git a/reactos/subsystems/win32/win32k/include/monitor.h b/reactos/subsystems/win32/win32k/include/monitor.h index edf2c8edc32..e5ebae7e962 100644 --- a/reactos/subsystems/win32/win32k/include/monitor.h +++ b/reactos/subsystems/win32/win32k/include/monitor.h @@ -14,6 +14,21 @@ typedef struct _MONITOR_OBJECT PDEVOBJ *GdiDevice; /* pointer to the GDI device to which this monitor is attached */ struct _MONITOR_OBJECT *Prev, *Next; /* doubly linked list */ + + // This is the structure Windows uses: +// HEAD head; +// struct _MONITOR_OBJECT *pMonitorNext; +// DWORD dwMONFlags; + RECT rcMonitor; + RECT rcWork; +// HRGN hrgnMonitor; +// SHORT Spare0; +// SHORT cWndStack; +// HDEV hDev; +// HDEV hDevReal; +// BYTE DockTargets[4][7]; +// struct _MONITOR_OBJECT* Flink; +// struct _MONITOR_OBJECT* Blink; } MONITOR_OBJECT, *PMONITOR_OBJECT; /* functions */ diff --git a/reactos/subsystems/win32/win32k/include/sysparams.h b/reactos/subsystems/win32/win32k/include/sysparams.h new file mode 100644 index 00000000000..d8761d7c908 --- /dev/null +++ b/reactos/subsystems/win32/win32k/include/sysparams.h @@ -0,0 +1,180 @@ +#ifndef _WIN32K_SYSPARAMS_H +#define _WIN32K_SYSPARAMS_H + +#include "cursoricon.h" + +// create one struct +// make usable for different users (multiple structs!) + +#define SPI_TABLE1_MIN 1 +#define SPI_TABLE1_MAX 119 +#define SPI_TABLE2_MIN 4096 +#define SPI_TABLE2_MAX 4171 +#define SPI_TABLE3_MIN 8192 +#define SPI_TABLE3_MAX 8215 + +#define SPIF_PROTECT 0x80000 + +enum +{ + UPM_ACTIVEWINDOWTRACKING = 0x01, + UPM_MENUANIMATION = 0x02, + UPM_COMBOBOXANIMATION = 0x04, + UPM_LISTBOXSMOOTHSCROLLING = 0x08, + UPM_GRADIENTCAPTIONS = 0x10, + UPM_KEYBOARDCUES = 0x20, + UPM_ACTIVEWNDTRKZORDER = 0x40, + UPM_HOTTRACKING = 0x80, + UPM_RESERVED = 0x100, + UPM_MENUFADE = 0x200, + UPM_SELECTIONFADE = 0x400, + UPM_TOOLTIPANIMATION = 0x800, + UPM_TOOLTIPFADE = 0x1000, + UPM_CURSORSHADOW = 0x2000, + // room for more + UPM_UIEFFECTS = 0x80000000, + UPM_DEFAULT = 0x80003E9E +} USERPREFMASKS; + +typedef struct _SPIVALUES +{ + /* Metrics */ + NONCLIENTMETRICSW ncm; + MINIMIZEDMETRICS mm; + ICONMETRICSW im; + UINT uiFocusBorderWidth; + UINT uiFocusBorderHeight; + + /* Accessability */ + ACCESSTIMEOUT accesstimeout; + HIGHCONTRAST highcontrast; + BOOL bScreenReader; +#if(WINVER >= 0x0600) + AUDIODESCRIPTION audiodescription; + BOOL bClientAreaAnimation; + BOOL bDisableOverlappedContent; + ULONG ulMsgDuration; + BOOL bSpeechRecognition; +#endif + + /* Sound */ + SOUNDSENTRY soundsentry; + BOOL bShowSounds; + BOOL bBeep; + + /* Mouse */ + CURSORACCELERATION_INFO caiMouse; + MOUSEKEYS mousekeys; + BOOL bMouseClickLock; + DWORD dwMouseClickLockTime; + BOOL bMouseSonar; + BOOL bMouseVanish; + BOOL bMouseBtnSwap; + BOOL bSmoothScrolling; + INT iMouseSpeed; + INT iMouseHoverWidth; + INT iMouseHoverHeight; + INT iMouseHoverTime; + INT iDblClickWidth; + INT iDblClickHeight; + INT iDblClickTime; + INT iDragWidth; + INT iDragHeight; + INT iMouseTrails; + INT iWheelScrollLines; +#if (_WIN32_WINNT >= 0x0600) + UINT uiWheelScrollChars; +#endif + + /* Keyboard */ + FILTERKEYS filterkeys; + SERIALKEYS serialkeys; + STICKYKEYS stickykeys; + TOGGLEKEYS togglekeys; + DWORD dwKbdSpeed; + BOOL bKbdPref; + HKL hklDefInputLang; + INT iKbdDelay; + + /* Screen saver */ + INT iScrSaverTimeout; + BOOL bScrSaverActive; + BOOL bScrSaverRunning; +#if(WINVER >= 0x0600) + BOOL bScrSaverSecure; +#endif + + /* Power */ + INT iLowPwrTimeout; + INT iPwrOffTimeout; + BOOL bLowPwrActive; + BOOL bPwrOffActive; + + /* UI Effects */ + DWORD dwUserPrefMask; + BOOL bFontSmoothing; + UINT uiFontSmoothingType; + UINT uiFontSmoothingContrast; + UINT uiFontSmoothingOrientation; + BOOL bDragFullWindows; + BOOL bMenuDropAlign; + BOOL bFlatMenu; + DWORD dwMenuShowDelay; + BOOL bDropShadow; + BOOL bBlockSendInputResets; +#if(_WIN32_WINNT >= 0x0600) + BOOL bClearType; +#endif + + /* Text metrics */ + TEXTMETRICW tmMenuFont; + TEXTMETRICW tmCaptionFont; + + BOOL bHandHeld; + BOOL bFastTaskSwitch; + UINT uiGridGranularity; + UNICODE_STRING ustrWallpaper; + WCHAR awcWallpaper[MAX_PATH]; + + ANIMATIONINFO animationinfo; + BOOL bSnapToDefBtn; + BOOL bShowImeUi; + DWORD dwForegroundLockTimeout; + DWORD dwActiveTrackingTimeout; + DWORD dwForegroundFlashCount; + DWORD dwCaretWidth; + +// SPI_LANGDRIVER +// SPI_SETDESKPATTERN +// SPI_SETPENWINDOWS +// SPI_SETCURSORS +// SPI_SETICONS +// SPI_SETLANGTOGGLE +// SPI_GETWINDOWSEXTENSION + +} SPIVALUES, *PSPIVALUES; + +typedef union _SPIBUFFER +{ + char ach[1]; + WCHAR awcWallpaper[MAX_PATH+1]; + FILTERKEYS fiterkeys; + TOGGLEKEYS togglekeys; + MOUSEKEYS mousekeys; + STICKYKEYS stickykeys; + ACCESSTIMEOUT accesstimeout; + SERIALKEYS serialkeys; + SOUNDSENTRY soundsentry; + NONCLIENTMETRICSW ncmetrics; + MINIMIZEDMETRICS mmmetrics; + ICONMETRICS iconmetrics; + HIGHCONTRAST highcontrast; + ANIMATIONINFO animationinfo; +#if(WINVER >= 0x0600) + AUDIODESCRIPTION audiodescription; +#endif +} SPIBUFFER; + +extern SPIVALUES gspv; + +#endif /* _WIN32K_SYSPARAMS_H */ diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32k.h index 65292a5bd66..75c1b305948 100644 --- a/reactos/subsystems/win32/win32k/include/win32k.h +++ b/reactos/subsystems/win32/win32k/include/win32k.h @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index 06b881c4f19..dbb061027a0 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -41,7 +41,6 @@ typedef struct _WINSTATION_OBJECT BOOL DropShadow; BOOL DragFullWindows; BOOL FlatMenu; - USERPREFERENCESMASK UserPreferences; /* ScreenSaver */ BOOL ScreenSaverRunning; diff --git a/reactos/subsystems/win32/win32k/misc/file.c b/reactos/subsystems/win32/win32k/misc/file.c new file mode 100644 index 00000000000..d21a735d658 --- /dev/null +++ b/reactos/subsystems/win32/win32k/misc/file.c @@ -0,0 +1,356 @@ +/* + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server + * PURPOSE: File access support routines + * FILE: subsystem/win32/win32k/misc/registry.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#include + +#define NDEBUG +#include + +BOOL +NTAPI +W32kDosPathNameToNtPathName( + IN PCWSTR pwszDosPathName, + OUT PUNICODE_STRING pustrNtPathName) +{ + NTSTATUS Status; + + /* Prepend "\??\" */ + pustrNtPathName->Length = 0; + Status = RtlAppendUnicodeToString(pustrNtPathName, L"\\??\\"); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Append the dos name */ + Status = RtlAppendUnicodeToString(pustrNtPathName, pwszDosPathName); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + return TRUE; +} + + +HANDLE +NTAPI +W32kOpenFile(PCWSTR pwszFileName, DWORD dwDesiredAccess) +{ + UNICODE_STRING ustrFile; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile = INVALID_HANDLE_VALUE; + NTSTATUS Status; + + DPRINT("W32kOpenFile(%S)\n", pwszFileName); + + RtlInitUnicodeString(&ustrFile, pwszFileName); + + InitializeObjectAttributes(&ObjectAttributes, &ustrFile, 0, NULL, NULL); + + Status = ZwCreateFile(&hFile, + dwDesiredAccess, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + hFile = NULL; + } + + DPRINT("Leaving W32kOpenFile, Status=0x%x, hFile=0x%x\n", Status, hFile); + return hFile; +} + +HANDLE +NTAPI +W32kCreateFileSection(HANDLE hFile, + ULONG flAllocation, + DWORD flPageProtection, + ULONGLONG ullMaxSize) +{ + NTSTATUS Status; + HANDLE hSection = NULL; + ACCESS_MASK amDesiredAccess; + + /* Set access mask */ + amDesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ; + + /* Check if write access is requested */ + if (flPageProtection == PAGE_READWRITE) + { + /* Add it to access mask */ + amDesiredAccess |= SECTION_MAP_WRITE; + } + + /* Now create the actual section */ + Status = ZwCreateSection(&hSection, + amDesiredAccess, + NULL, + NULL, + flPageProtection, + flAllocation, + hFile); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + } + + DPRINT("Leaving W32kCreateFileSection, Status=0x%x, hSection=0x%x\n", Status, hSection); + + /* Return section handle */ + return hSection; +} + +PVOID +NTAPI +W32kMapViewOfSection( + HANDLE hSection, + DWORD dwPageProtect, + ULONG_PTR ulSectionOffset) +{ + NTSTATUS Status; + LARGE_INTEGER liSectionOffset; + ULONG_PTR ulViewSize; + PVOID pvBase = 0; + + ulViewSize = + liSectionOffset.QuadPart = ulSectionOffset; + Status = ZwMapViewOfSection(hSection, + NtCurrentProcess(), + &pvBase, + 0, + 0, + &liSectionOffset, + &ulViewSize, + ViewShare, + 0, + dwPageProtect); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + } + + DPRINT("Leaving W32kMapViewOfSection, Status=0x%x, pvBase=0x%x\n", Status, pvBase); + + return pvBase; +} + +typedef struct tagBITMAPV5INFO +{ + BITMAPV5HEADER bmiHeader; + RGBQUAD bmiColors[256]; +} BITMAPV5INFO, *PBITMAPV5INFO; + +// FIXME: this should go to dibobj.c +NTSTATUS +ProbeAndConvertBitmapInfo( + OUT PBITMAPV5INFO pbmiDst, + IN PBITMAPINFO pbmiUnsafe) +{ + BITMAPV5HEADER *pbmhDst = (BITMAPV5HEADER*)&pbmiDst->bmiHeader; + DWORD dwSize; + RGBQUAD *pbmiColors; + ULONG ulWidthBytes; + + /* Get the size and probe */ + ProbeForRead(&pbmiUnsafe->bmiHeader.biSize, sizeof(DWORD), 1); + dwSize = pbmiUnsafe->bmiHeader.biSize; + ProbeForRead(pbmiUnsafe, dwSize, 1); + + /* Check the size */ + // FIXME: are intermediate sizes allowed? As what are they interpreted? + // make sure we don't use a too big dwSize later + if (dwSize != sizeof(BITMAPCOREHEADER) && + dwSize != sizeof(BITMAPINFOHEADER) && + dwSize != sizeof(BITMAPV4HEADER) && + dwSize != sizeof(BITMAPV5HEADER)) + { + return STATUS_INVALID_PARAMETER; + } + + pbmiColors = (RGBQUAD*)((PCHAR)pbmiUnsafe + dwSize); + + pbmhDst->bV5Size = sizeof(BITMAPV5HEADER); + + if (dwSize == sizeof(BITMAPCOREHEADER)) + { + PBITMAPCOREHEADER pbch = (PBITMAPCOREHEADER)pbmiUnsafe; + + /* Manually copy the fields that are present */ + pbmhDst->bV5Width = pbch->bcWidth; + pbmhDst->bV5Height = pbch->bcHeight; + pbmhDst->bV5Planes = pbch->bcPlanes; + pbmhDst->bV5BitCount = pbch->bcBitCount; + + /* Set some default values */ + pbmhDst->bV5Compression = BI_RGB; + pbmhDst->bV5SizeImage = 0; + pbmhDst->bV5XPelsPerMeter = 72; + pbmhDst->bV5YPelsPerMeter = 72; + pbmhDst->bV5ClrUsed = 0; + pbmhDst->bV5ClrImportant = 0; + } + else + { + /* Copy valid fields */ + memcpy(pbmhDst, pbmiUnsafe, dwSize); + + /* Zero out the rest of the V5 header */ + memset((char*)pbmhDst + dwSize, 0, sizeof(BITMAPV5HEADER) - dwSize); + } + + + if (dwSize < sizeof(BITMAPV4HEADER)) + { + if (pbmhDst->bV5Compression == BI_BITFIELDS) + { + DWORD *pMasks = (DWORD*)pbmiColors; + pbmhDst->bV5RedMask = pMasks[0]; + pbmhDst->bV5GreenMask = pMasks[1]; + pbmhDst->bV5BlueMask = pMasks[2]; + pbmhDst->bV5AlphaMask = 0; + pbmhDst->bV5ClrUsed = 0; + } + +// pbmhDst->bV5CSType; +// pbmhDst->bV5Endpoints; +// pbmhDst->bV5GammaRed; +// pbmhDst->bV5GammaGreen; +// pbmhDst->bV5GammaBlue; + } + + if (dwSize < sizeof(BITMAPV5HEADER)) + { +// pbmhDst->bV5Intent; +// pbmhDst->bV5ProfileData; +// pbmhDst->bV5ProfileSize; +// pbmhDst->bV5Reserved; + } + + ulWidthBytes = ((pbmhDst->bV5Width * pbmhDst->bV5Planes * + pbmhDst->bV5BitCount + 31) & ~31) / 8; + + if (pbmhDst->bV5SizeImage == 0) + pbmhDst->bV5SizeImage = abs(ulWidthBytes * pbmhDst->bV5Height); + + if (pbmhDst->bV5ClrUsed == 0) + pbmhDst->bV5ClrUsed = pbmhDst->bV5BitCount == 1 ? 2 : + (pbmhDst->bV5BitCount == 4 ? 16 : + (pbmhDst->bV5BitCount == 8 ? 256 : 0)); + + if (pbmhDst->bV5Planes != 1) + { + return STATUS_INVALID_PARAMETER; + } + + if (pbmhDst->bV5BitCount != 0 && pbmhDst->bV5BitCount != 1 && + pbmhDst->bV5BitCount != 4 && pbmhDst->bV5BitCount != 8 && + pbmhDst->bV5BitCount != 16 && pbmhDst->bV5BitCount != 24 && + pbmhDst->bV5BitCount != 32) + { + DPRINT("Invalid bit count: %d\n", pbmhDst->bV5BitCount); + return STATUS_INVALID_PARAMETER; + } + + if ((pbmhDst->bV5BitCount == 0 && + pbmhDst->bV5Compression != BI_JPEG && pbmhDst->bV5Compression != BI_PNG)) + { + DPRINT("Bit count 0 is invalid for compression %d.\n", pbmhDst->bV5Compression); + return STATUS_INVALID_PARAMETER; + } + + if (pbmhDst->bV5Compression == BI_BITFIELDS && + pbmhDst->bV5BitCount != 16 && pbmhDst->bV5BitCount != 32) + { + DPRINT("Bit count %d is invalid for compression BI_BITFIELDS.\n", pbmhDst->bV5BitCount); + return STATUS_INVALID_PARAMETER; + } + + return STATUS_SUCCESS; +} + + +HBITMAP +NTAPI +UserLoadImage(PCWSTR pwszName) +{ + NTSTATUS Status; + HANDLE hFile, hSection; + BITMAPFILEHEADER *pbmfh; + LPBITMAPINFO pbmi; + ULONG cjInfoSize; + PVOID pvBits; + HBITMAP hbmp = 0; + BITMAPV5INFO bmiLocal; + + /* Open the file */ + hFile = W32kOpenFile(pwszName, FILE_READ_DATA); + if (hFile == INVALID_HANDLE_VALUE) + return NULL; + + /* Create a section */ + hSection = W32kCreateFileSection(hFile, SEC_COMMIT, PAGE_READONLY, 0); + ZwClose(hFile); + if (!hSection) + return NULL; + + /* Map the section */ + pbmfh = W32kMapViewOfSection(hSection, PAGE_READONLY, 0); + ZwClose(hSection); + if (!pbmfh) + return NULL; + + /* Get a pointer to the BITMAPINFO */ + pbmi = (LPBITMAPINFO)(pbmfh + 1); + + /* Create a normalized local BITMAPINFO */ + _SEH2_TRY + { + Status = ProbeAndConvertBitmapInfo(&bmiLocal, pbmi); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END + + if (NT_SUCCESS(Status)) + { + cjInfoSize = bmiLocal.bmiHeader.bV5Size + + bmiLocal.bmiHeader.bV5ClrUsed * sizeof(RGBQUAD); + pvBits = (PVOID)((PCHAR)pbmi + cjInfoSize); + + // FIXME: use Gre... so that the BITMAPINFO doesn't get probed + hbmp = NtGdiCreateDIBitmapInternal(NULL, + bmiLocal.bmiHeader.bV5Width, + bmiLocal.bmiHeader.bV5Height, + CBM_INIT, + pvBits, + pbmi, + DIB_RGB_COLORS, + bmiLocal.bmiHeader.bV5Size, + bmiLocal.bmiHeader.bV5SizeImage, + 0, + 0); + } + + /* Unmap our section, we don't need it anymore */ + ZwUnmapViewOfSection(NtCurrentProcess(), pbmfh); + + DPRINT("Leaving UserLoadImage, hbmp = %p\n", hbmp); + return hbmp; +} diff --git a/reactos/subsystems/win32/win32k/misc/registry.c b/reactos/subsystems/win32/win32k/misc/registry.c new file mode 100644 index 00000000000..f03de06e5f6 --- /dev/null +++ b/reactos/subsystems/win32/win32k/misc/registry.c @@ -0,0 +1,206 @@ +/* + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server + * PURPOSE: Registry loading and storing + * FILE: subsystem/win32/win32k/misc/registry.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +#include + +#define NDEBUG +#include + +BOOL +NTAPI +RegReadUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING usCurrentUserKey, usKeyName, usValueName; + WCHAR awcBuffer[MAX_PATH]; + HKEY hkey; + PKEY_VALUE_PARTIAL_INFORMATION pInfo; + ULONG cbInfoSize, cbReqSize; + + /* Get the path of the current user's profile */ + Status = RtlFormatCurrentUserKeyPath(&usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Initialize empty key name */ + RtlInitEmptyUnicodeString(&usKeyName, awcBuffer, sizeof(awcBuffer)); + + /* Append the current user key name */ + Status = RtlAppendUnicodeStringToString(&usKeyName, &usCurrentUserKey); + + /* Free the current user key name */ + RtlFreeUnicodeString(&usCurrentUserKey); + + /* Check for success */ + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Append a '\', we can trust in enough space left. */ + usKeyName.Buffer[usKeyName.Length / sizeof(WCHAR)] = '\\'; + usKeyName.Length += sizeof(WCHAR); + + /* Append the subkey name */ + Status = RtlAppendUnicodeToString(&usKeyName, pwszKeyName); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &usKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Open the key */ + Status = ZwOpenKey(&hkey, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Check if the local buffer is sufficient */ + cbInfoSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + cbDataSize; + if (cbInfoSize <= sizeof(awcBuffer)) + { + pInfo = (PVOID)awcBuffer; + } + else + { + /* It's not, allocate a sufficient buffer */ + pInfo = ExAllocatePoolWithTag(PagedPool, cbInfoSize, TAG_TEMP); + if (!pInfo) + { + ZwClose(hkey); + return FALSE; + } + } + + /* Query the value */ + RtlInitUnicodeString(&usValueName, pwszValueName); + Status = ZwQueryValueKey(hkey, + &usValueName, + KeyValuePartialInformation, + (PVOID)pInfo, + cbInfoSize, + &cbReqSize); + if (NT_SUCCESS(Status)) + { + /* Did we get the right type */ + if (pInfo->Type == ulType) + { + /* Copy the contents to the caller */ + RtlCopyMemory(pvData, pInfo->Data, cbDataSize); + } + } + + /* Cleanup */ + ZwClose(hkey); + if (pInfo != (PVOID)awcBuffer) + ExFreePoolWithTag(pInfo, TAG_TEMP); + + return NT_SUCCESS(Status); +} + +BOOL +NTAPI +RegWriteUserSetting( + IN PCWSTR pwszKeyName, + IN PCWSTR pwszValueName, + IN ULONG ulType, + OUT PVOID pvData, + IN ULONG cbDataSize) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING usCurrentUserKey, usKeyName, usValueName; + WCHAR awcBuffer[MAX_PATH]; + HKEY hkey; + + // FIXME: logged in user versus current process user? + /* Get the path of the current user's profile */ + Status = RtlFormatCurrentUserKeyPath(&usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlFormatCurrentUserKeyPath failed\n"); + return FALSE; + } + + /* Initialize empty key name */ + RtlInitEmptyUnicodeString(&usKeyName, awcBuffer, sizeof(awcBuffer)); + + /* Append the current user key name */ + Status = RtlAppendUnicodeStringToString(&usKeyName, &usCurrentUserKey); + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Free the current user key name */ + RtlFreeUnicodeString(&usCurrentUserKey); + + /* Append a '\', we can trust in enough space left. */ + usKeyName.Buffer[usKeyName.Length / sizeof(WCHAR)] = '\\'; + usKeyName.Length += sizeof(WCHAR); + + /* Append the subkey name */ + Status = RtlAppendUnicodeToString(&usKeyName, pwszKeyName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlAppendUnicodeToString failed with Status=%lx, buf:%d,%d\n", Status, usKeyName.Length, usKeyName.MaximumLength); + return FALSE; + } + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + &usKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + /* Open or create the key */ + Status = ZwCreateKey(&hkey, + KEY_READ | KEY_WRITE, + &ObjectAttributes, + 0, + NULL, + 0, + NULL); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create key: 0x%x\n", Status); + return FALSE; + } + + /* Initialize the value name string */ + RtlInitUnicodeString(&usValueName, pwszValueName); + + Status = ZwSetValueKey(hkey, &usValueName, 0, ulType, pvData, cbDataSize); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to write reg key '%S' value '%S', Status = %lx\n", + pwszKeyName, pwszValueName, Status); + } + + /* Cleanup */ + ZwClose(hkey); + + return NT_SUCCESS(Status); +} + diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 0e5fba2ad67..f2d3e355b68 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -55,8 +55,6 @@ static KEVENT InputThreadsStart; static BOOLEAN InputThreadsRunning = FALSE; /* FUNCTIONS *****************************************************************/ -ULONG FASTCALL -IntSystemParametersInfo(UINT uiAction, UINT uiParam,PVOID pvParam, UINT fWinIni); DWORD IntLastInputTick(BOOL LastInputTickSetGet); #define ClearMouseInput(mi) \ @@ -885,7 +883,7 @@ RawInputThreadMain(PVOID StartContext) MasterTimer = ExAllocatePoolWithTag(NonPagedPool, sizeof(KTIMER), TAG_INPUT); if (!MasterTimer) - { + { DPRINT1("Win32K: Failed making Raw Input thread a win32 thread.\n"); return; } @@ -1065,18 +1063,6 @@ CLEANUP: END_CLEANUP; } -BOOL FASTCALL -IntSwapMouseButton(PWINSTATION_OBJECT WinStaObject, BOOL Swap) -{ - PSYSTEM_CURSORINFO CurInfo; - BOOL res; - - CurInfo = IntGetSysCursorInfo(WinStaObject); - res = CurInfo->SwapButtons; - CurInfo->SwapButtons = Swap; - return res; -} - BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi) { diff --git a/reactos/subsystems/win32/win32k/ntuser/metric.c b/reactos/subsystems/win32/win32k/ntuser/metric.c index 58eec348259..c93826993a1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/metric.c +++ b/reactos/subsystems/win32/win32k/ntuser/metric.c @@ -4,8 +4,7 @@ * PURPOSE: Window classes * FILE: subsys/win32k/ntuser/metric.c * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) - * REVISION HISTORY: - * 06-06-2001 CSH Created + * Timo Kreuzer (timo.kreuzer@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -20,9 +19,6 @@ static BOOL Setup = FALSE; /* FUNCTIONS *****************************************************************/ -// FIXME: These are only win xp default values, mostly hardcoded. They should be -// read from the registry. It must be possible to change or reinitialize the -// values, for example desk.cpl BOOL FASTCALL InitMetrics(VOID) @@ -31,21 +27,10 @@ InitMetrics(VOID) PWINSTATION_OBJECT WinStaObject; ULONG Width = 640, Height = 480; PSYSTEM_CURSORINFO CurInfo; - HDC hScreenDC; - PDC pScreenDC; + INT *piSysMet; - hScreenDC = IntGdiCreateDC(NULL, NULL, NULL, NULL, TRUE); - if (hScreenDC) - { - pScreenDC = DC_LockDc(hScreenDC); - if (pScreenDC) - { - Width = pScreenDC->ppdev->GDIInfo.ulHorzRes; - Height = pScreenDC->ppdev->GDIInfo.ulVertRes; - DC_UnlockDc(pScreenDC); - } - NtGdiDeleteObjectApp(hScreenDC); - } + Width = pPrimarySurface->GDIInfo.ulHorzRes; + Height = pPrimarySurface->GDIInfo.ulVertRes; Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, KernelMode, @@ -60,103 +45,131 @@ InitMetrics(VOID) CurInfo = NULL; } - gpsi->SystemMetrics[SM_CXSCREEN] = Width; - gpsi->SystemMetrics[SM_CYSCREEN] = Height; - gpsi->SystemMetrics[SM_CXVSCROLL] = 16; - gpsi->SystemMetrics[SM_CYHSCROLL] = 16; - /* FIXME: "reg://Control Panel/Desktop/WindowMetrics/CaptionHeight" + 1 */ - gpsi->SystemMetrics[SM_CYCAPTION] = 19; - gpsi->SystemMetrics[SM_CXBORDER] = 1; - gpsi->SystemMetrics[SM_CYBORDER] = 1; - gpsi->SystemMetrics[SM_CXDLGFRAME] = 3; - gpsi->SystemMetrics[SM_CYDLGFRAME] = 3; - gpsi->SystemMetrics[SM_CYVTHUMB] = 16; - gpsi->SystemMetrics[SM_CXHTHUMB] = 16; - gpsi->SystemMetrics[SM_CXICON] = 32; - gpsi->SystemMetrics[SM_CYICON] = 32; - gpsi->SystemMetrics[SM_CXCURSOR] = 32; - gpsi->SystemMetrics[SM_CYCURSOR] = 32; - gpsi->SystemMetrics[SM_CYMENU] = 19; - /* FIXME: shouldn't we take borders etc into account??? */ - gpsi->SystemMetrics[SM_CXFULLSCREEN] = gpsi->SystemMetrics[SM_CXSCREEN]; - gpsi->SystemMetrics[SM_CYFULLSCREEN] = gpsi->SystemMetrics[SM_CYSCREEN]; - gpsi->SystemMetrics[SM_CYKANJIWINDOW] = 0; - gpsi->SystemMetrics[SM_MOUSEPRESENT] = 1; - gpsi->SystemMetrics[SM_CYVSCROLL] = 16; - gpsi->SystemMetrics[SM_CXHSCROLL] = 16; - gpsi->SystemMetrics[SM_DEBUG] = 0; - gpsi->SystemMetrics[SM_SWAPBUTTON] = CurInfo ? CurInfo->SwapButtons : 0; - gpsi->SystemMetrics[SM_RESERVED1] = 0; - gpsi->SystemMetrics[SM_RESERVED2] = 0; - gpsi->SystemMetrics[SM_RESERVED3] = 0; - gpsi->SystemMetrics[SM_RESERVED4] = 0; - gpsi->SystemMetrics[SM_CXMIN] = 112; - gpsi->SystemMetrics[SM_CYMIN] = 27; - gpsi->SystemMetrics[SM_CXSIZE] = 18; - gpsi->SystemMetrics[SM_CYSIZE] = 18; - gpsi->SystemMetrics[SM_CXFRAME] = 4; - gpsi->SystemMetrics[SM_CYFRAME] = 4; - gpsi->SystemMetrics[SM_CXMINTRACK] = 112; - gpsi->SystemMetrics[SM_CYMINTRACK] = 27; - gpsi->SystemMetrics[SM_CXDOUBLECLK] = CurInfo ? CurInfo->DblClickWidth : 4; - gpsi->SystemMetrics[SM_CYDOUBLECLK] = CurInfo ? CurInfo->DblClickWidth : 4; - gpsi->SystemMetrics[SM_CXICONSPACING] = 64; - gpsi->SystemMetrics[SM_CYICONSPACING] = 64; - gpsi->SystemMetrics[SM_MENUDROPALIGNMENT] = 0; - gpsi->SystemMetrics[SM_PENWINDOWS] = 0; - gpsi->SystemMetrics[SM_DBCSENABLED] = 0; - gpsi->SystemMetrics[SM_CMOUSEBUTTONS] = 2; - gpsi->SystemMetrics[SM_SECURE] = 0; - gpsi->SystemMetrics[SM_CXEDGE] = 2; - gpsi->SystemMetrics[SM_CYEDGE] = 2; - gpsi->SystemMetrics[SM_CXMINSPACING] = 160; - gpsi->SystemMetrics[SM_CYMINSPACING] = 24; - gpsi->SystemMetrics[SM_CXSMICON] = 16; - gpsi->SystemMetrics[SM_CYSMICON] = 16; - gpsi->SystemMetrics[SM_CYSMCAPTION] = 15; - gpsi->SystemMetrics[SM_CXSMSIZE] = 12; - gpsi->SystemMetrics[SM_CYSMSIZE] = 14; - gpsi->SystemMetrics[SM_CXMENUSIZE] = 18; - gpsi->SystemMetrics[SM_CYMENUSIZE] = 18; - gpsi->SystemMetrics[SM_ARRANGE] = 8; - gpsi->SystemMetrics[SM_CXMINIMIZED] = 160; - gpsi->SystemMetrics[SM_CYMINIMIZED] = 24; - gpsi->SystemMetrics[SM_CXMAXTRACK] = gpsi->SystemMetrics[SM_CYSCREEN] + 12; - gpsi->SystemMetrics[SM_CYMAXTRACK] = gpsi->SystemMetrics[SM_CYSCREEN] + 12; - /* This seems to be 8 pixels greater than the screen width */ - gpsi->SystemMetrics[SM_CXMAXIMIZED] = gpsi->SystemMetrics[SM_CXSCREEN] + 8; - /* This seems to be 20 pixels less than the screen height, taskbar maybe? */ - gpsi->SystemMetrics[SM_CYMAXIMIZED] = gpsi->SystemMetrics[SM_CYSCREEN] - 20; - gpsi->SystemMetrics[SM_NETWORK] = 3; - gpsi->SystemMetrics[64] = 0; - gpsi->SystemMetrics[65] = 0; - gpsi->SystemMetrics[66] = 0; - gpsi->SystemMetrics[SM_CLEANBOOT] = 0; - gpsi->SystemMetrics[SM_CXDRAG] = 4; - gpsi->SystemMetrics[SM_CYDRAG] = 4; - gpsi->SystemMetrics[SM_SHOWSOUNDS] = 0; - gpsi->SystemMetrics[SM_CXMENUCHECK] = 13; - gpsi->SystemMetrics[SM_CYMENUCHECK] = 13; - gpsi->SystemMetrics[SM_SLOWMACHINE] = 0; - gpsi->SystemMetrics[SM_MIDEASTENABLED] = 0; - gpsi->SystemMetrics[SM_MOUSEWHEELPRESENT] = 1; - gpsi->SystemMetrics[SM_XVIRTUALSCREEN] = 0; - gpsi->SystemMetrics[SM_YVIRTUALSCREEN] = 0; - gpsi->SystemMetrics[SM_CXVIRTUALSCREEN] = Width; - gpsi->SystemMetrics[SM_CYVIRTUALSCREEN] = Height; - gpsi->SystemMetrics[SM_CMONITORS] = 1; - gpsi->SystemMetrics[SM_SAMEDISPLAYFORMAT] = 1; - gpsi->SystemMetrics[SM_IMMENABLED] = 0; - gpsi->SystemMetrics[SM_CXFOCUSBORDER] = 1; - gpsi->SystemMetrics[SM_CYFOCUSBORDER] = 1; - gpsi->SystemMetrics[SM_TABLETPC] = 0; - gpsi->SystemMetrics[SM_MEDIACENTER] = 0; - gpsi->SystemMetrics[SM_STARTER] = 0; - gpsi->SystemMetrics[SM_SERVERR2] = 0; + piSysMet = (INT*)gpsi->SystemMetrics; + + /* Screen sizes */ + piSysMet[SM_CXSCREEN] = Width; + piSysMet[SM_CYSCREEN] = Height; + piSysMet[SM_XVIRTUALSCREEN] = 0; + piSysMet[SM_YVIRTUALSCREEN] = 0; + piSysMet[SM_CXVIRTUALSCREEN] = Width; + piSysMet[SM_CYVIRTUALSCREEN] = Height; + + /* NC area sizes */ + piSysMet[SM_CYCAPTION] = gspv.ncm.iCaptionHeight + 1; // 19 + piSysMet[SM_CYSMCAPTION] = gspv.ncm.iSmCaptionHeight + 1; // 15; + piSysMet[SM_CXSIZE] = gspv.ncm.iCaptionHeight; // 18; + piSysMet[SM_CYSIZE] = gspv.ncm.iCaptionHeight; // 18; + piSysMet[SM_CXSMSIZE] = gspv.ncm.iSmCaptionWidth; // 12; xp: piSysMet(SM_CYSMCAPTION) - 1 + piSysMet[SM_CYSMSIZE] = gspv.ncm.iSmCaptionHeight; // 14; + piSysMet[SM_CXBORDER] = 1; // seems to be hardcoded + piSysMet[SM_CYBORDER] = 1; // seems to be hardcoded + piSysMet[SM_CXFOCUSBORDER] = 1; + piSysMet[SM_CYFOCUSBORDER] = 1; + piSysMet[SM_CXDLGFRAME] = 3; + piSysMet[SM_CYDLGFRAME] = 3; + piSysMet[SM_CXEDGE] = 2; + piSysMet[SM_CYEDGE] = 2; + piSysMet[SM_CXFRAME] = piSysMet[SM_CXDLGFRAME] + gspv.ncm.iBorderWidth; // 4 + piSysMet[SM_CYFRAME] = piSysMet[SM_CYDLGFRAME] + gspv.ncm.iBorderWidth; // 4 #if (_WIN32_WINNT >= 0x0600) - gpsi->SystemMetrics[90] = 0; - gpsi->SystemMetrics[SM_MOUSEHORIZONTALWHEELPRESENT] = 0; - gpsi->SystemMetrics[SM_CXPADDEDBORDER] = 0; + piSysMet[SM_CXPADDEDBORDER] = 0; +#endif + + /* Window sizes */ + DPRINT("ncm.iCaptionWidth=%d,GetSystemMetrics(SM_CYSIZE)=%d,GetSystemMetrics(SM_CXFRAME)=%d,avcwCaption=%d \n", + gspv.ncm.iCaptionWidth, piSysMet[SM_CYSIZE],piSysMet[SM_CXFRAME], gspv.tmCaptionFont.tmAveCharWidth); + + piSysMet[SM_CXMIN] = 3 * max(gspv.ncm.iCaptionWidth, 8) // 112 + + piSysMet[SM_CYSIZE] + 4 + + 4 * gspv.tmCaptionFont.tmAveCharWidth + + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMIN] = piSysMet[SM_CYCAPTION] + 2 * piSysMet[SM_CYFRAME];// 27 + piSysMet[SM_CXMAXIMIZED] = piSysMet[SM_CXSCREEN] + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMAXIMIZED] = piSysMet[SM_CYSCREEN] - 20; + piSysMet[SM_CXFULLSCREEN] = piSysMet[SM_CXSCREEN]; + piSysMet[SM_CYFULLSCREEN] = piSysMet[SM_CYMAXIMIZED] - piSysMet[SM_CYMIN]; + piSysMet[SM_CYKANJIWINDOW] = 0; + piSysMet[SM_CXMINIMIZED] = gspv.mm.iWidth + 6; + piSysMet[SM_CYMINIMIZED] = piSysMet[SM_CYCAPTION] + 5; + piSysMet[SM_CXMINSPACING] = piSysMet[SM_CXMINIMIZED] + gspv.mm.iHorzGap; + piSysMet[SM_CYMINSPACING] = piSysMet[SM_CYMINIMIZED] + gspv.mm.iVertGap; + piSysMet[SM_CXMAXTRACK] = piSysMet[SM_CXVIRTUALSCREEN] + 4 + + 2 * piSysMet[SM_CXFRAME]; + piSysMet[SM_CYMAXTRACK] = piSysMet[SM_CYVIRTUALSCREEN] + 4 + + 2 * piSysMet[SM_CYFRAME]; + + /* Icon */ + piSysMet[SM_CXVSCROLL] = gspv.ncm.iScrollWidth; //16; + piSysMet[SM_CYVTHUMB] = gspv.ncm.iScrollHeight; //16; + piSysMet[SM_CYHSCROLL] = gspv.ncm.iScrollWidth; //16; + piSysMet[SM_CXHTHUMB] = gspv.ncm.iScrollHeight; //16; + piSysMet[SM_CYVSCROLL] = gspv.ncm.iScrollHeight; // 16 + piSysMet[SM_CXHSCROLL] = gspv.ncm.iScrollHeight; // 16; + piSysMet[SM_CXICON] = 32; + piSysMet[SM_CYICON] = 32; + piSysMet[SM_CXSMICON] = 16; + piSysMet[SM_CYSMICON] = 16; + piSysMet[SM_CXICONSPACING] = gspv.im.iHorzSpacing;// 64; + piSysMet[SM_CYICONSPACING] = gspv.im.iVertSpacing; // 64; + piSysMet[SM_CXCURSOR] = 32; + piSysMet[SM_CYCURSOR] = 32; + piSysMet[SM_CXMINTRACK] = piSysMet[SM_CXMIN]; // 117 + piSysMet[SM_CYMINTRACK] = piSysMet[SM_CYMIN]; // 27 + piSysMet[SM_CXDRAG] = 4; + piSysMet[SM_CYDRAG] = 4; + piSysMet[SM_ARRANGE] = gspv.mm.iArrange; // 8; + + /* Menu */ + piSysMet[SM_CYMENU] = gspv.ncm.iMenuHeight + 1;//19; + piSysMet[SM_MENUDROPALIGNMENT] = gspv.bMenuDropAlign; + piSysMet[SM_CXMENUCHECK] = ((1 + gspv.tmMenuFont.tmHeight + + gspv.tmMenuFont.tmExternalLeading) & ~1) - 1; // 13; + piSysMet[SM_CYMENUCHECK] = piSysMet[SM_CXMENUCHECK]; + piSysMet[SM_CXMENUSIZE] = gspv.ncm.iMenuWidth; //18; + piSysMet[SM_CYMENUSIZE] = gspv.ncm.iMenuHeight; //18; + + /* Mouse */ + piSysMet[SM_MOUSEPRESENT] = 1; + piSysMet[SM_MOUSEWHEELPRESENT] = 1; + piSysMet[SM_CMOUSEBUTTONS] = 2; + piSysMet[SM_SWAPBUTTON] = gspv.bMouseBtnSwap ? 1 : 0; //CurInfo ? CurInfo->SwapButtons : 0; + piSysMet[SM_CXDOUBLECLK] = gspv.iDblClickWidth;//CurInfo ? CurInfo->DblClickWidth : 4; + piSysMet[SM_CYDOUBLECLK] = gspv.iDblClickHeight;//CurInfo ? CurInfo->DblClickWidth : 4; +#if (_WIN32_WINNT >= 0x0600) + piSysMet[SM_MOUSEHORIZONTALWHEELPRESENT] = 0; +#endif + + /* Version info */ + piSysMet[SM_TABLETPC] = 0; + piSysMet[SM_MEDIACENTER] = 0; + piSysMet[SM_STARTER] = 0; + piSysMet[SM_SERVERR2] = 0; + piSysMet[SM_PENWINDOWS] = 0; + + /* Other */ + piSysMet[SM_DEBUG] = 0; + piSysMet[SM_NETWORK] = 3; + piSysMet[SM_SLOWMACHINE] = 0; + piSysMet[SM_SECURE] = 0; + piSysMet[SM_DBCSENABLED] = 0; + piSysMet[SM_CLEANBOOT] = 0; + piSysMet[SM_SHOWSOUNDS] = gspv.bShowSounds; + piSysMet[SM_MIDEASTENABLED] = 0; + piSysMet[SM_CMONITORS] = 1; + piSysMet[SM_SAMEDISPLAYFORMAT] = 1; + piSysMet[SM_IMMENABLED] = 0; + + /* Reserved */ + piSysMet[SM_RESERVED1] = 0; + piSysMet[SM_RESERVED2] = 0; + piSysMet[SM_RESERVED3] = 0; + piSysMet[SM_RESERVED4] = 0; + piSysMet[64] = 0; + piSysMet[65] = 0; + piSysMet[66] = 0; +#if (_WIN32_WINNT >= 0x0600) + piSysMet[90] = 0; #endif gpsi->SRVINFO_Flags |= SRVINFO_METRICS; @@ -174,14 +187,9 @@ ULONG FASTCALL UserGetSystemMetrics(ULONG Index) { ASSERT(gpsi); + ASSERT(Setup); DPRINT("UserGetSystemMetrics(%d)\n", Index); - // FIXME: Do this when loading - if (!Setup) - { - InitMetrics(); - } - /* Get metrics from array */ if (Index < SM_CMETRICS) { diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index ece9477109c..8dfee1a98bf 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -136,31 +136,16 @@ APIENTRY NtUserGetDoubleClickTime(VOID) { UINT Result; - NTSTATUS Status; - PWINSTATION_OBJECT WinStaObject; - PSYSTEM_CURSORINFO CurInfo; - DECLARE_RETURN(UINT); DPRINT("Enter NtUserGetDoubleClickTime\n"); UserEnterShared(); - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObject); - if (!NT_SUCCESS(Status)) - RETURN( (DWORD)FALSE); + // FIXME: Check if this works on non-interactive winsta + Result = gspv.iDblClickTime; - CurInfo = IntGetSysCursorInfo(WinStaObject); - Result = CurInfo->DblClickSpeed; - - ObDereferenceObject(WinStaObject); - RETURN( Result); - -CLEANUP: - DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n",_ret_); + DPRINT("Leave NtUserGetDoubleClickTime, ret=%i\n", Result); UserLeave(); - END_CLEANUP; + return Result; } BOOL diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index e7d573b7dc3..c012aed9a70 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -809,44 +809,6 @@ NtUserHardErrorControl( return 0; } -/* - Called from win32csr. - */ -NTSTATUS -APIENTRY -NtUserInitialize( - DWORD dwWinVersion, - HANDLE hPowerRequestEvent, - HANDLE hMediaRequestEvent) -{ - UserEnterExclusive(); - UNIMPLEMENTED; -// Check to see we have the right version. -// Initialize Power Request List. -// Initialize Media Change. -// Initialize CSRSS -// { -// Startup DxGraphics. -// calls ** IntGdiGetLanguageID() and sets it **. -// Enables Fonts drivers, Initialize Font table & Stock Fonts. -// } -// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) -// Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" -// Create Event for Diconnect Desktop. -// Initialize Video. -// { -// DrvInitConsole. -// DrvChangeDisplaySettings. -// Update Shared Device Caps. -// Initialize User Screen. -// } -// Create ThreadInfo for this Thread! -// Set Global SERVERINFO Error flags. -// Load Resources. - UserLeave(); - return STATUS_SUCCESS; -} - DWORD APIENTRY NtUserMinMaximize( diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index 0589711ab10..56f88d8be45 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -34,6 +34,10 @@ #include ERESOURCE UserLock; +BOOL gbInitialized; + +BOOL +InitSysParams(); /* FUNCTIONS **********************************************************/ @@ -66,9 +70,90 @@ NTSTATUS FASTCALL InitUserImpl(VOID) DPRINT("Global Server Data -> %x\n", gpsi); } } + + InitSysParams(); + return STATUS_SUCCESS; } + +NTSTATUS +NTAPI +UserInitialize( + HANDLE hPowerRequestEvent, + HANDLE hMediaRequestEvent) +{ +// Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) +// Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" +// Create Event for Diconnect Desktop. +// Initialize Video. +// { +// DrvInitConsole. +// DrvChangeDisplaySettings. +// Update Shared Device Caps. +// Initialize User Screen. +// } +// Create ThreadInfo for this Thread! +// Set Global SERVERINFO Error flags. +// Load Resources. + + NtUserUpdatePerUserSystemParameters(0, TRUE); + + return STATUS_SUCCESS; +} + +/* + Called from win32csr. + */ +NTSTATUS +APIENTRY +NtUserInitialize( + DWORD dwWinVersion, + HANDLE hPowerRequestEvent, + HANDLE hMediaRequestEvent) +{ + NTSTATUS Status; + + DPRINT1("Enter NtUserInitialize(%lx, %p, %p)\n", + dwWinVersion, hPowerRequestEvent, hMediaRequestEvent); + + /* Check the Windows version */ + if (dwWinVersion != 0) + { + return STATUS_UNSUCCESSFUL; + } + + /* Acquire exclusive lock */ + UserEnterExclusive(); + + /* Check if we are already initialized */ + if (gbInitialized) + { + UserLeave(); + return STATUS_UNSUCCESSFUL; + } + +// Initialize Power Request List. +// Initialize Media Change. +// InitializeGreCSRSS(); +// { +// Startup DxGraphics. +// calls ** IntGdiGetLanguageID() and sets it **. +// Enables Fonts drivers, Initialize Font table & Stock Fonts. +// } + + /* Initialize USER */ + Status = UserInitialize(hPowerRequestEvent, hMediaRequestEvent); + + /* Set us as initialized */ + gbInitialized = TRUE; + + /* Return */ + UserLeave(); + return Status; +} + + /* RETURN True if current thread owns the lock (possibly shared) diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index fff7ab7be27..1bea638910c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -1559,10 +1559,10 @@ UserDrawCaptionText(HDC hDc, #endif nclm.cbSize = sizeof(nclm); - if(!IntSystemParametersInfo(SPI_GETNONCLIENTMETRICS, + if(!UserSystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nclm, 0)) { - DPRINT1("%s: IntSystemParametersInfo() failed!\n", __FUNCTION__); + DPRINT1("%s: UserSystemParametersInfo() failed!\n", __FUNCTION__); return FALSE; } diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 4eba2f34219..6c13dd5cd27 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -228,23 +228,12 @@ NtUserCallOneParam( case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON: { - PWINSTATION_OBJECT WinSta; - NTSTATUS Status; DWORD Result; - - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinSta); - if (!NT_SUCCESS(Status)) - RETURN( (DWORD)FALSE); - - /* FIXME - Result = (DWORD)IntSwapMouseButton(WinStaObject, (BOOL)Param); */ - Result = 0; - - ObDereferenceObject(WinSta); - RETURN( Result); + + Result = gspv.bMouseBtnSwap; + gspv.bMouseBtnSwap = Param ? TRUE : FALSE; + gpsi->SystemMetrics[SM_SWAPBUTTON] = gspv.bMouseBtnSwap; + RETURN(Result); } case ONEPARAM_ROUTINE_SWITCHCARETSHOWING: diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index e178b4e80ed..c10eeca5e22 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -1,13 +1,16 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel + * COPYRIGHT: GPL, see COPYING in the top level directory + * PROJECT: ReactOS win32 kernel mode subsystem server * PURPOSE: System parameters functions - * FILE: subsystem/win32/win32k/ntuser/sysparam.c - * PROGRAMER: Ge van Geldorp (ge@gse.nl) - * REVISION HISTORY: - * 2008/03/20 Split from misc.c + * FILE: subsystem/win32/win32k/ntuser/sysparams.c + * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ +// TODO: +// - check all values that are in Winsta in ros +// - does setting invalid fonts work? +// - save appropriate text metrics + #include #define NDEBUG @@ -15,1545 +18,1486 @@ #include -VOID FASTCALL -IntGetFontMetricSetting(LPWSTR lpValueName, PLOGFONTW font) +#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl(TAG('R', 'o', 's', 'D'), (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) +HBITMAP NTAPI UserLoadImage(PCWSTR); +BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING); + +BOOL gbDebug = 0; +SPIVALUES gspv; +BOOL gbSpiInitialized = FALSE; +PWINSTATION_OBJECT gpwinstaCurrent = NULL; + +// HACK! We initialize SPI before we have a proper surface to get this from. +#define dpi 96 +//(pPrimarySurface->GDIInfo.ulLogPixelsY) +#define REG2METRIC(reg) (reg > 0 ? reg : ((-(reg) * dpi + 720) / 1440)) +#define METRIC2REG(met) (-((((met) * 1440)- 0) / dpi)) + +#define REQ_INTERACTIVE_WINSTA(err) \ + if (gpwinstaCurrent != InputWindowStation) \ + { \ + SetLastWin32Error(err); \ + return 0; \ + } + +#define DPRINTX if (gbDebug) DPRINT1 + +static const WCHAR* KEY_MOUSE = L"Control Panel\\Mouse"; +static const WCHAR* VAL_MOUSE1 = L"MouseThreshold1"; +static const WCHAR* VAL_MOUSE2 = L"MouseThreshold2"; +static const WCHAR* VAL_MOUSE3 = L"MouseSpeed"; +static const WCHAR* VAL_DBLCLKWIDTH = L"DoubleClickWidth"; +static const WCHAR* VAL_DBLCLKHEIGHT = L"DoubleClickHeight"; +static const WCHAR* VAL_DBLCLKTIME = L"DoubleClickSpeed"; +static const WCHAR* VAL_SWAP = L"SwapMouseButtons"; + +static const WCHAR* KEY_DESKTOP = L"Control Panel\\Desktop"; +static const WCHAR* VAL_SCRTO = L"ScreenSaveTimeOut"; +static const WCHAR* VAL_SCRACT = L"ScreenSaveActive"; +static const WCHAR* VAL_GRID = L"GridGranularity"; +static const WCHAR* VAL_DRAG = L"DragFullWindows"; +static const WCHAR* VAL_DRAGHEIGHT = L"DragHeight"; +static const WCHAR* VAL_DRAGWIDTH = L"DragWidth"; +static const WCHAR* VAL_FNTSMOOTH = L"FontSmoothing"; + +static const WCHAR* KEY_MDALIGN = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"; +static const WCHAR* VAL_MDALIGN = L"MenuDropAlignment"; + +static const WCHAR* KEY_METRIC = L"Control Panel\\Desktop\\WindowMetrics"; +static const WCHAR* VAL_BORDER = L"BorderWidth"; +static const WCHAR* VAL_ICONSPC = L"IconSpacing"; +static const WCHAR* VAL_ICONVSPC = L"IconVerticalspacing"; +static const WCHAR* VAL_ITWRAP = L"IconTitleWrap"; + +static const WCHAR* KEY_SOUND = L"Control Panel\\Sound"; +static const WCHAR* VAL_BEEP = L"Beep"; + +static const WCHAR* KEY_KBD = L"Control Panel\\Keyboard"; +static const WCHAR* VAL_KBDSPD = L"KeyboardSpeed"; +static const WCHAR* VAL_KBDDELAY = L"KeyboardDelay"; + +static const WCHAR* KEY_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds"; +static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference"; +static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access"; +static const WCHAR* VAL_ON = L"On"; + + + +/** Loading the settings ******************************************************/ + +static +INT +SpiLoadInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - NTSTATUS Status; - /* Firefox 1.0.7 depends on the lfHeight value being negative */ - static LOGFONTW DefaultFont = { - -11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, - L"MS Sans Serif" - }; + WCHAR awcBuffer[12]; + ULONG cbSize; - RtlZeroMemory(&QueryTable, sizeof(QueryTable)); - - QueryTable[0].Name = lpValueName; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].EntryContext = font; - - Status = RtlQueryRegistryValues( - RTL_REGISTRY_USER, - L"Control Panel\\Desktop\\WindowMetrics", - QueryTable, - NULL, - NULL); - - if (!NT_SUCCESS(Status)) - { - RtlCopyMemory(font, &DefaultFont, sizeof(LOGFONTW)); - } -} - -static NTSTATUS FASTCALL -IntWriteSystemParametersSettings(PUNICODE_STRING SubKeyName, - PUNICODE_STRING KeyName, - ULONG Type, - PVOID Data, - ULONG DataSize) -{ - UNICODE_STRING KeyPath; - NTSTATUS Status; - HANDLE CurrentUserKey, KeyHandle; - OBJECT_ATTRIBUTES KeyAttributes, ObjectAttributes; - - /* Get a handle to the current users settings */ - Status = RtlFormatCurrentUserKeyPath(&KeyPath); - if(!NT_SUCCESS(Status)) - return Status; - - InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL); - /* Open the HKCU key */ - Status = ZwOpenKey(&CurrentUserKey, KEY_WRITE, &ObjectAttributes); - RtlFreeUnicodeString(&KeyPath); - if(!NT_SUCCESS(Status)) - return Status; - - - /* Open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, SubKeyName, OBJ_CASE_INSENSITIVE, CurrentUserKey, NULL); - Status = ZwOpenKey(&KeyHandle, KEY_WRITE, &KeyAttributes); - ZwClose(CurrentUserKey); - - if (NT_SUCCESS(Status)) + cbSize = sizeof(awcBuffer); + if (!RegReadUserSetting(pwszKey, pwszValue, REG_SZ, awcBuffer, cbSize)) { - ZwSetValueKey(KeyHandle, KeyName, 0, Type, Data, DataSize); - ZwClose(KeyHandle); + return iValue; } - return Status; + return _wtoi(awcBuffer); } -#if 0 -/* not used at the moment */ -/* FIXME: currently only supporting known DataSize */ -static NTSTATUS FASTCALL -IntReadSystemParametersSettings(PUNICODE_STRING SubKeyName, - PUNICODE_STRING KeyName, - ULONG Type, - PVOID Data, - ULONG DataSize) +static +INT +SpiLoadMouse(LPWSTR pwszValue, INT iValue) { - UNICODE_STRING KeyPath; - ULONG Length, ReqLength; - NTSTATUS Status; - HANDLE CurrentUserKey, KeyHandle; - OBJECT_ATTRIBUTES KeyAttributes, ObjectAttributes; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - - /* Get a handle to the current users settings */ - Status = RtlFormatCurrentUserKeyPath(&KeyPath); - if(!NT_SUCCESS(Status)) { - return Status; - } - - InitializeObjectAttributes(&ObjectAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL); - /* Open the HKCU key */ - Status = ZwOpenKey(&CurrentUserKey, KEY_READ, &ObjectAttributes); - if(!NT_SUCCESS(Status)) { - RtlFreeUnicodeString(&KeyPath); - return Status; - } - RtlFreeUnicodeString(&KeyPath); - - /* Open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, SubKeyName, OBJ_CASE_INSENSITIVE, CurrentUserKey, NULL); - Status = ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwClose(CurrentUserKey); - RtlFreeUnicodeString(&KeyPath); - if(!NT_SUCCESS(Status)) { - return Status; - } - - Length = sizeof(KEY_VALUE_PARTIAL_INFORMATION)+DataSize; - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, Length, TAG_WINSTA); - if(KeyValuePartialInfo) { - Status = ZwQueryValueKey(KeyHandle, KeyName, KeyValuePartialInformation, (PVOID)KeyValuePartialInfo, Length, &ReqLength); - if(NT_SUCCESS(Status)) { - RtlCopyMemory(Data, KeyValuePartialInfo->Data, DataSize); - } else { - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_WINSTA); - } else { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - ZwClose(KeyHandle); - - return Status; + return SpiLoadInt(KEY_MOUSE, pwszValue, iValue); } + +static +INT +SpiLoadMetric(LPWSTR pwszValue, INT iValue) +{ + INT iRegVal; + + iRegVal = SpiLoadInt(KEY_METRIC, pwszValue, METRIC2REG(iValue)); + DPRINT("Loaded metric setting '%S', iValue=%d(reg:%d), ret=%d(reg:%d)\n", + pwszValue, iValue, METRIC2REG(iValue), REG2METRIC(iRegVal), iRegVal); + return REG2METRIC(iRegVal); +} + +static +VOID +SpiLoadFont(PLOGFONTW plfOut, LPWSTR pwszValueName, PLOGFONTW plfDefault) +{ + BOOL bResult; + + bResult = RegReadUserSetting(KEY_METRIC, + pwszValueName, + REG_BINARY, + plfOut, + sizeof(LOGFONTW)); + if (!bResult) + *plfOut = *plfDefault; +} + +static +VOID +SpiFixupValues() +{ + /* Fixup values */ + gspv.ncm.iCaptionWidth = max(gspv.ncm.iCaptionWidth, 8); + gspv.ncm.iBorderWidth = max(gspv.ncm.iBorderWidth, 1); + gspv.ncm.iScrollWidth = max(gspv.ncm.iScrollWidth, 8); + gspv.ncm.iScrollHeight = max(gspv.ncm.iScrollHeight, 8); +// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, gspv.tmMenuFont.tmHeight); +// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, +// 2 + gspv.tmMenuFont.tmHeight + +// gspv.tmMenuFont.tmExternalLeading); + if (gspv.iDblClickTime == 0) gspv.iDblClickTime = 500; + + // FIXME: hack!!! + gspv.tmMenuFont.tmHeight = 11; + gspv.tmMenuFont.tmExternalLeading = 2; + + gspv.tmCaptionFont.tmHeight = 11; + gspv.tmCaptionFont.tmExternalLeading = 2; + +} + +static +VOID +SpiUpdatePerUserSystemParameters() +{ + static LOGFONTW lf1 = {-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, + FALSE, ANSI_CHARSET, 0, 0, DEFAULT_QUALITY, + VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"}; + static LOGFONTW lf2 = {-11, 0, 0, 0, FW_BOLD, FALSE, FALSE, + FALSE, ANSI_CHARSET, 0, 0, DEFAULT_QUALITY, + VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"}; + + DPRINT("Enter SpiUpdatePerUserSystemParameters\n"); + + /* Clear the structure */ + memset(&gspv, 0, sizeof(gspv)); + + /* Load mouse settings */ + gspv.caiMouse.FirstThreshold = SpiLoadMouse(L"MouseThreshold1", 6); + gspv.caiMouse.SecondThreshold = SpiLoadMouse(L"MouseThreshold2", 10); + gspv.caiMouse.Acceleration = SpiLoadMouse(L"MouseSpeed", 1); + + /* Load NONCLIENTMETRICS */ + gspv.ncm.cbSize = sizeof(NONCLIENTMETRICSW); + gspv.ncm.iBorderWidth = SpiLoadMetric(L"BorderWidth", 1); + gspv.ncm.iScrollWidth = SpiLoadMetric(L"ScrollWidth", 16); + gspv.ncm.iScrollHeight = SpiLoadMetric(L"ScrollHeight", 16); + gspv.ncm.iCaptionWidth = SpiLoadMetric(L"CaptionWidth", 19); + gspv.ncm.iCaptionHeight = SpiLoadMetric(L"CaptionHeight", 19); + gspv.ncm.iSmCaptionWidth = SpiLoadMetric(L"SmCaptionWidth", 12); + gspv.ncm.iSmCaptionHeight = SpiLoadMetric(L"SmCaptionHeight", 14); + gspv.ncm.iMenuWidth = SpiLoadMetric(L"MenuWidth", 18); + gspv.ncm.iMenuHeight = SpiLoadMetric(L"MenuHeight", 18); +#if (WINVER >= 0x0600) + gspv.ncm.iPaddedBorderWidth = SpiLoadMetric(L"PaddedBorderWidth", 18); +#endif + SpiLoadFont(&gspv.ncm.lfCaptionFont, L"CaptionFont", &lf2); + SpiLoadFont(&gspv.ncm.lfSmCaptionFont, L"SmCaptionFont", &lf1); + SpiLoadFont(&gspv.ncm.lfMenuFont, L"MenuFont", &lf1); + SpiLoadFont(&gspv.ncm.lfStatusFont, L"StatusFont", &lf1); + SpiLoadFont(&gspv.ncm.lfMessageFont, L"MessageFont", &lf1); + + /* Load MINIMIZEDMETRICS */ + gspv.mm.cbSize = sizeof(MINIMIZEDMETRICS); + gspv.mm.iWidth = SpiLoadMetric(L"MinWidth", 160); + gspv.mm.iHorzGap = SpiLoadMetric(L"MinHorzGap", 160); + gspv.mm.iVertGap = SpiLoadMetric(L"MinVertGap", 24); + gspv.mm.iArrange = SpiLoadInt(KEY_METRIC, L"MinArrange", ARW_HIDE); + + /* Load ICONMETRICS */ + gspv.im.cbSize = sizeof(ICONMETRICSW); + gspv.im.iHorzSpacing = SpiLoadMetric(L"IconSpacing", 64); + gspv.im.iVertSpacing = SpiLoadMetric(L"IconVerticalspacing", 64); + gspv.im.iTitleWrap = SpiLoadMetric(L"IconTitleWrap", 0); + SpiLoadFont(&gspv.im.lfFont, L"IconFont", &lf1); + + /* Some hardcoded values for now */ + gspv.tmCaptionFont.tmAveCharWidth = 6; + gspv.bBeep = TRUE; + gspv.bFlatMenu = FALSE; + gspv.iDblClickTime = 500; + gspv.uiFocusBorderWidth = 1; + gspv.uiFocusBorderHeight = 1; + gspv.bMenuDropAlign = 1; + gspv.bDropShadow = 1; + gspv.dwUserPrefMask = UPM_DEFAULT; + gspv.dwMenuShowDelay = 100; + + gspv.bMouseBtnSwap = FALSE; + gspv.iMouseSpeed = 10; + gspv.iMouseHoverTime = 80; + gspv.iMouseHoverWidth = 4; + gspv.iMouseHoverHeight = 4; + gspv.iDblClickTime = 500; + gspv.iDblClickWidth = 4; + gspv.iDblClickHeight = 4; + gspv.iWheelScrollLines = 3; +#if (_WIN32_WINNT >= 0x0600) + gspv.uiWheelScrollChars = 1; #endif -static ULONG FASTCALL -IntUpdateUserPreferencesMask(PWINSTATION_OBJECT WinStaObject, UINT fWinIni) + gspv.iScrSaverTimeout = 10; + gspv.bScrSaverActive = FALSE; + gspv.bScrSaverRunning = FALSE; +#if(WINVER >= 0x0600) + gspv.bScrSaverSecure = FALSE; +#endif + + /* Make sure we don't use broken values */ + SpiFixupValues(); + + /* Update SystemMetrics */ + InitMetrics(); +} + +BOOL +InitSysParams() +{ + SpiUpdatePerUserSystemParameters(); + gbSpiInitialized = TRUE; + return TRUE; +} + + +BOOL +APIENTRY +NtUserUpdatePerUserSystemParameters( + DWORD dwReserved, + BOOL bEnable) +{ + BOOL bResult; + + DPRINT("Enter NtUserUpdatePerUserSystemParameters\n"); + UserEnterExclusive(); + + SpiUpdatePerUserSystemParameters(); + bResult = IntDesktopUpdatePerUserSettings(bEnable); + + DPRINT("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult); + UserLeave(); + + return bResult; +} + + +/** Storing the settings ******************************************************/ + +static +VOID +SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz) +{ + RegWriteUserSetting(pwszKey, + pwszValue, + REG_SZ, + (PWSTR)pwsz, + wcslen(pwsz) * sizeof(WCHAR)); +} + +static +VOID +SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue) +{ + WCHAR awcBuffer[15]; + + _itow(iValue, awcBuffer, 10); + RegWriteUserSetting(pwszKey, + pwszValue, + REG_SZ, + awcBuffer, + (wcslen(awcBuffer) + 1) * sizeof(WCHAR)); +} + +static +VOID +SpiStoreMetric(LPCWSTR pwszValue, INT iValue) +{ + SpiStoreSzInt(KEY_METRIC, pwszValue, METRIC2REG(iValue)); +} + +static +VOID +SpiStoreFont(PCWSTR pwszValue, LOGFONTW* plogfont) +{ + RegWriteUserSetting(KEY_METRIC, + pwszValue, + REG_BINARY, + plogfont, + sizeof(LOGFONTW)); +} + + +/** Get/Set value *************************************************************/ + +// FIXME: get rid of the flags and only use this from um. kernel can access data directly. +static +UINT_PTR +SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect, BOOL bToUser) { NTSTATUS Status = STATUS_SUCCESS; - UNICODE_STRING SubKeyName = RTL_CONSTANT_STRING(L"Control Panel\\Desktop"); - UNICODE_STRING UserPreferencesMask = RTL_CONSTANT_STRING(L"UserPreferencesMask"); - if (fWinIni & SPIF_UPDATEINIFILE) + if (bProtect) { - Status = IntWriteSystemParametersSettings( - &SubKeyName, - &UserPreferencesMask, - REG_BINARY, - &WinStaObject->UserPreferences, - sizeof(USERPREFERENCESMASK)); - if(!NT_SUCCESS(Status)) + _SEH2_TRY { - DPRINT1("Registry update of UserPreferencesMask failed (%0X)\n",Status); + if (bToUser) + { + ProbeForWrite(pvDst, cbSize, 1); + } + else + { + ProbeForRead(pvSrc, cbSize, 1); + } + memcpy(pvDst, pvSrc, cbSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END + } + else + { + memcpy(pvDst, pvSrc, cbSize); + } + + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + DPRINT("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d, bToUser=%d\n", pvDst, pvSrc, bProtect, bToUser); + } + return NT_SUCCESS(Status); +} + +static inline +UINT_PTR +SpiGet(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_ACCESS_DENIED); + return SpiMemCopy(pvParam, pvData, cbSize, fl & SPIF_PROTECT, TRUE); +} + +static inline +UINT_PTR +SpiSet(PVOID pvData, PVOID pvParam, ULONG cbSize, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + return SpiMemCopy(pvData, pvParam, cbSize, fl & SPIF_PROTECT, FALSE); +} + +static inline +UINT_PTR +SpiGetEx(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl) +{ + ULONG cbBufSize; + /* Get the cbSite member from UM memory */ + if (!SpiSet(&cbBufSize, pvParam, sizeof(ULONG), fl)) + return 0; + /* Verify the correct size */ + if (cbBufSize != cbSize) + return 0; + return SpiGet(pvParam, pvData, cbSize, fl); +} + +static inline +UINT_PTR +SpiGetInt(PVOID pvParam, PVOID piValue, FLONG fl) +{ + return SpiGet(pvParam, piValue, sizeof(INT), fl); +} + +static inline +UINT_PTR +SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *pbData = bValue ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSz(pwszKey, pwszValue, bValue ? L"Yes" : L"No"); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *pbData = iValue ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(pwszKey, pwszValue, iValue); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *(INT*)pvData = iValue; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(pwszKey, pwszValue, iValue); + } + return (UINT_PTR)pwszKey; +} + +static inline +UINT_PTR +SpiSetMetric(PVOID pvData, INT iValue, PCWSTR pwszValue, FLONG fl) +{ + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + *(INT*)pvData = iValue; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(pwszValue, iValue); + } + return (UINT_PTR)KEY_METRIC; +} + +static inline +UINT_PTR +SpiSetUserPref(DWORD dwMask, PVOID pvValue, FLONG fl) +{ + DWORD dwRegMask; + BOOL bValue = pvValue ? 1 : 0; + + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + + /* Set or clear bit according to bValue */ + gspv.dwUserPrefMask = bValue ? gspv.dwUserPrefMask | dwMask : + gspv.dwUserPrefMask & ~dwMask; + + if (fl & SPIF_UPDATEINIFILE) + { + /* Read current value */ + RegReadUserSetting(KEY_DESKTOP, + L"UserPreferencesMask", + REG_BINARY, + &dwRegMask, + sizeof(DWORD)); + + /* Set or clear bit according to bValue */ + dwRegMask = bValue ? dwRegMask | dwMask : dwRegMask & ~dwMask; + + /* write back value */ + RegWriteUserSetting(KEY_DESKTOP, + L"UserPreferencesMask", + REG_BINARY, + &dwRegMask, + sizeof(DWORD)); + } + + return (UINT_PTR)KEY_DESKTOP; +} + +static inline +UINT_PTR +SpiGetUserPref(DWORD dwMask, PVOID pvParam, FLONG fl) +{ + INT iValue = gspv.dwUserPrefMask & dwMask ? 1 : 0; + return SpiGetInt(pvParam, &iValue, fl); +} + +static +UINT_PTR +SpiSetWallpaper(PVOID pvParam, FLONG fl) +{ + UNICODE_STRING ustr; + WCHAR awc[MAX_PATH]; + BOOL bResult; + HBITMAP hbmp, hOldBitmap; + SURFACE *psurfBmp; + ULONG ulTile, ulStyle; + + REQ_INTERACTIVE_WINSTA(ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION); + + if (!pvParam) + { + /* FIXME: Reset Wallpaper to registry value */ + return (UINT_PTR)KEY_DESKTOP; + } + + /* Capture UNICODE_STRING */ + bResult = SpiMemCopy(&ustr, pvParam, sizeof(UNICODE_STRING), fl & SPIF_PROTECT, 0); + if (!bResult) return 0; + if (ustr.Length > MAX_PATH * sizeof(WCHAR)) + return 0; + + /* Copy the string buffer name */ + bResult = SpiMemCopy(gspv.awcWallpaper, ustr.Buffer, ustr.Length, fl & SPIF_PROTECT, 0); + if (!bResult) return 0; + + /* Update the UNICODE_STRING */ + gspv.ustrWallpaper.Buffer = gspv.awcWallpaper; + gspv.ustrWallpaper.MaximumLength = MAX_PATH * sizeof(WCHAR); + gspv.ustrWallpaper.Length = ustr.Length; + gspv.awcWallpaper[ustr.Length / sizeof(WCHAR)] = 0; + + DPRINT("SpiSetWallpaper, name=%S\n", gspv.awcWallpaper); + + /* Update registry */ + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSz(KEY_DESKTOP, L"Wallpaper", gspv.awcWallpaper); + } + + /* Got a filename? */ + if (gspv.awcWallpaper[0] != 0) + { + /* Convert file name to nt file name */ + ustr.Buffer = awc; + ustr.MaximumLength = MAX_PATH * sizeof(WCHAR); + ustr.Length = 0; + if (!W32kDosPathNameToNtPathName(gspv.awcWallpaper, &ustr)) + { + DPRINT1("RtlDosPathNameToNtPathName_U failed\n"); + return 0; + } + + /* Load the Bitmap */ + hbmp = UserLoadImage(ustr.Buffer); + if (!hbmp) + { + DPRINT1("UserLoadImage failed\n"); + return 0; + } + + /* Try to get the size of the wallpaper */ + if(!(psurfBmp = SURFACE_LockSurface(hbmp))) + { + GreDeleteObject(hbmp); + return 0; + } + + gpwinstaCurrent->cxWallpaper = psurfBmp->SurfObj.sizlBitmap.cx; + gpwinstaCurrent->cyWallpaper = psurfBmp->SurfObj.sizlBitmap.cy; + gpwinstaCurrent->WallpaperMode = wmCenter; + + SURFACE_UnlockSurface(psurfBmp); + + /* Change the bitmap's ownership */ + GDIOBJ_SetOwnership(hbmp, NULL); + + /* Yes, Windows really loads the current setting from the registry. */ + ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0); + ulStyle = SpiLoadInt(KEY_DESKTOP, L"WallpaperStyle", 0); + DPRINT("SpiSetWallpaper: ulTile=%ld, ulStyle=%d\n", ulTile, ulStyle); + + /* Check the values we found in the registry */ + if(ulTile && !ulStyle) + { + gpwinstaCurrent->WallpaperMode = wmTile; + } + else if(!ulTile && ulStyle == 2) + { + gpwinstaCurrent->WallpaperMode = wmStretch; } } - return Status; + else + { + /* Remove wallpaper */ + gpwinstaCurrent->cxWallpaper = 0; + gpwinstaCurrent->cyWallpaper = 0; + hbmp = 0; + } + + /* Take care of the old wallpaper, if any */ + hOldBitmap = gpwinstaCurrent->hbmWallpaper; + if(hOldBitmap != NULL) + { + /* Delete the old wallpaper */ + GDIOBJ_SetOwnership(hOldBitmap, PsGetCurrentProcess()); + GreDeleteObject(hOldBitmap); + } + + /* Set the new wallpaper */ + gpwinstaCurrent->hbmWallpaper = hbmp; + + NtUserRedrawWindow(UserGetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE); + + + return (UINT_PTR)KEY_DESKTOP; } -ULONG FASTCALL -IntSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) +static +UINT_PTR +SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl) { - PWINSTATION_OBJECT WinStaObject; - NTSTATUS Status; - BOOL bChanged = FALSE; + switch (uiAction) + { + case SPI_GETBEEP: + return SpiGetInt(pvParam, &gspv.bBeep, fl); - static BOOL bInitialized = FALSE; - static LOGFONTW IconFont; - static NONCLIENTMETRICSW pMetrics; - static MINIMIZEDMETRICS MinimizedMetrics; - static BOOL GradientCaptions = TRUE; - static UINT FocusBorderHeight = 1; - static UINT FocusBorderWidth = 1; - static ANIMATIONINFO anim; - static STICKYKEYS StickyKeys = {sizeof(STICKYKEYS), 0x1fa}; - static FILTERKEYS FilterKeys = {sizeof(FILTERKEYS), 0, 0, 0, 0, 0}; - static TOGGLEKEYS ToggleKeys = {sizeof(TOGGLEKEYS), 0}; - static MOUSEKEYS MouseKeys = {sizeof(MOUSEKEYS), 0, 0, 0, 0, 0, 0}; - static BOOL KeyboardPref = FALSE; - static BOOL ShowSounds = FALSE; - static ACCESSTIMEOUT AccessTimeout = {sizeof(ACCESSTIMEOUT), 0, 0}; - static DWORD CaretWidth = 1; - static SERIALKEYS SerialKeys = {sizeof(SERIALKEYS), 0, 0, 0, 0, 0, 0}; + case SPI_SETBEEP: + return SpiSetYesNo(&gspv.bBeep, uiParam, KEY_SOUND, VAL_BEEP, fl); - if (!bInitialized) - { - RtlZeroMemory(&IconFont, sizeof(LOGFONTW)); - RtlZeroMemory(&pMetrics, sizeof(NONCLIENTMETRICSW)); + case SPI_GETMOUSE: + return SpiGet(pvParam, &gspv.caiMouse, 3 * sizeof(INT), fl); - IntGetFontMetricSetting(L"CaptionFont", &pMetrics.lfCaptionFont); - IntGetFontMetricSetting(L"SmCaptionFont", &pMetrics.lfSmCaptionFont); - IntGetFontMetricSetting(L"MenuFont", &pMetrics.lfMenuFont); - IntGetFontMetricSetting(L"StatusFont", &pMetrics.lfStatusFont); - IntGetFontMetricSetting(L"MessageFont", &pMetrics.lfMessageFont); - IntGetFontMetricSetting(L"IconFont", &IconFont); - - pMetrics.iBorderWidth = 1; - pMetrics.iScrollWidth = UserGetSystemMetrics(SM_CXVSCROLL); - pMetrics.iScrollHeight = UserGetSystemMetrics(SM_CYHSCROLL); - pMetrics.iCaptionWidth = UserGetSystemMetrics(SM_CXSIZE); - pMetrics.iCaptionHeight = UserGetSystemMetrics(SM_CYSIZE); - pMetrics.iSmCaptionWidth = UserGetSystemMetrics(SM_CXSMSIZE); - pMetrics.iSmCaptionHeight = UserGetSystemMetrics(SM_CYSMSIZE); - pMetrics.iMenuWidth = UserGetSystemMetrics(SM_CXMENUSIZE); - pMetrics.iMenuHeight = UserGetSystemMetrics(SM_CYMENUSIZE); - pMetrics.cbSize = sizeof(NONCLIENTMETRICSW); - - MinimizedMetrics.cbSize = sizeof(MINIMIZEDMETRICS); - MinimizedMetrics.iWidth = UserGetSystemMetrics(SM_CXMINIMIZED); - MinimizedMetrics.iHorzGap = UserGetSystemMetrics(SM_CXMINSPACING); - MinimizedMetrics.iVertGap = UserGetSystemMetrics(SM_CYMINSPACING); - MinimizedMetrics.iArrange = ARW_HIDE; - - bInitialized = TRUE; - } - - switch(uiAction) - { - case SPI_GETDRAGFULLWINDOWS: - /* FIXME: Implement this, don't just return constant */ - *(PBOOL)pvParam = FALSE; - break; - - case SPI_SETKEYBOARDCUES: - case SPI_SETMENUANIMATION: - case SPI_SETMENUFADE: - case SPI_SETTOOLTIPANIMATION: - case SPI_SETTOOLTIPFADE: - case SPI_SETDOUBLECLKWIDTH: - case SPI_SETDOUBLECLKHEIGHT: - case SPI_SETDOUBLECLICKTIME: - case SPI_SETDESKWALLPAPER: - case SPI_SETSCREENSAVERRUNNING: - case SPI_SETSCREENSAVETIMEOUT: - case SPI_SETFLATMENU: - case SPI_SETMOUSEHOVERTIME: - case SPI_SETMOUSEHOVERWIDTH: - case SPI_SETMOUSEHOVERHEIGHT: - case SPI_SETMOUSE: - case SPI_SETMOUSESPEED: - case SPI_SETMOUSEBUTTONSWAP: - /* We will change something, so set the flag here */ - bChanged = TRUE; - case SPI_GETKEYBOARDCUES: - case SPI_GETMENUANIMATION: - case SPI_GETMENUFADE: - case SPI_GETTOOLTIPANIMATION: - case SPI_GETTOOLTIPFADE: - case SPI_GETDESKWALLPAPER: - case SPI_GETWHEELSCROLLLINES: - case SPI_GETWHEELSCROLLCHARS: - case SPI_GETSCREENSAVERRUNNING: - case SPI_GETSCREENSAVETIMEOUT: - case SPI_GETSCREENSAVEACTIVE: - case SPI_GETFLATMENU: - case SPI_GETMOUSEHOVERTIME: - case SPI_GETMOUSEHOVERWIDTH: - case SPI_GETMOUSEHOVERHEIGHT: - case SPI_GETMOUSE: - case SPI_GETMOUSESPEED: - { - PSYSTEM_CURSORINFO CurInfo; - - Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, - KernelMode, - 0, - &WinStaObject); - if(!NT_SUCCESS(Status)) + case SPI_SETMOUSE: + if (!SpiSet(&gspv.caiMouse, pvParam, 3 * sizeof(INT), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - SetLastNtError(Status); - return (DWORD)FALSE; + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE1, gspv.caiMouse.FirstThreshold); + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE2, gspv.caiMouse.SecondThreshold); + SpiStoreSzInt(KEY_MOUSE, VAL_MOUSE3, gspv.caiMouse.Acceleration); } + return (UINT_PTR)KEY_MOUSE; - switch(uiAction) - { - case SPI_GETKEYBOARDCUES: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bKeyboardCues; - break; - case SPI_GETMENUANIMATION: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bMenuAnimation; - break; - case SPI_GETMENUFADE: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bMenuFade; - break; - case SPI_GETTOOLTIPANIMATION: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bTooltipAnimation; - break; - case SPI_GETTOOLTIPFADE: - ASSERT(pvParam); - *((BOOL*)pvParam) = (BOOL)WinStaObject->UserPreferences.bTooltipFade; - break; - case SPI_SETKEYBOARDCUES: - WinStaObject->UserPreferences.bKeyboardCues = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETMENUANIMATION: - WinStaObject->UserPreferences.bMenuAnimation = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETMENUFADE: - WinStaObject->UserPreferences.bMenuFade = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETTOOLTIPANIMATION: - WinStaObject->UserPreferences.bTooltipAnimation = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_SETTOOLTIPFADE: - WinStaObject->UserPreferences.bTooltipFade = (BOOL)pvParam; - IntUpdateUserPreferencesMask(WinStaObject,fWinIni); - break; - case SPI_GETFLATMENU: - ASSERT(pvParam); - *((UINT*)pvParam) = WinStaObject->FlatMenu; - break; - case SPI_SETFLATMENU: - WinStaObject->FlatMenu = (BOOL)pvParam; - break; - case SPI_GETSCREENSAVETIMEOUT: - ASSERT(pvParam); - *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut; - break; - case SPI_SETSCREENSAVETIMEOUT: - WinStaObject->ScreenSaverTimeOut = uiParam; - break; - case SPI_GETSCREENSAVERRUNNING: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning; - break; - case SPI_SETSCREENSAVERRUNNING: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning; - WinStaObject->ScreenSaverRunning = uiParam; - break; - case SPI_SETSCREENSAVEACTIVE: - WinStaObject->ScreenSaverActive = uiParam; - break; - case SPI_GETSCREENSAVEACTIVE: - if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverActive; - break; - case SPI_GETWHEELSCROLLLINES: - ASSERT(pvParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->WheelScroLines; - /* FIXME add this value to scroll list as scroll value ?? */ - break; - case SPI_GETWHEELSCROLLCHARS: - ASSERT(pvParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->WheelScroChars; - // FIXME add this value to scroll list as scroll value ?? - break; - case SPI_SETDOUBLECLKWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum value? */ - CurInfo->DblClickWidth = uiParam; - break; - case SPI_SETDOUBLECLKHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum value? */ - CurInfo->DblClickHeight = uiParam; - break; - case SPI_SETDOUBLECLICKTIME: - CurInfo = IntGetSysCursorInfo(WinStaObject); - /* FIXME limit the maximum time to 1000 ms? */ - CurInfo->DblClickSpeed = uiParam; - break; - case SPI_GETMOUSEHOVERTIME: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *((UINT*)pvParam) = CurInfo->MouseHoverTime; - break; - case SPI_SETMOUSEHOVERTIME: - /* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx - * copy text from it, if some agument why xp and 2003 behovir diffent - * only if they do not have SP install - * " Windows Server 2003 and Windows XP: The operating system does not - * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until - * Windows Server 2003 SP1 and Windows XP SP2 " - */ - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverTime = uiParam; - if(CurInfo->MouseHoverTime < USER_TIMER_MINIMUM) - { - CurInfo->MouseHoverTime = USER_TIMER_MINIMUM; - } - if(CurInfo->MouseHoverTime > USER_TIMER_MAXIMUM) - { - CurInfo->MouseHoverTime = USER_TIMER_MAXIMUM; - } + case SPI_GETBORDER: + return SpiGetInt(pvParam, &gspv.ncm.iBorderWidth, fl); - break; - case SPI_GETMOUSEHOVERWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseHoverWidth; - break; - case SPI_GETMOUSEHOVERHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseHoverHeight; - break; - case SPI_SETMOUSEHOVERWIDTH: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverWidth = uiParam; - break; - case SPI_SETMOUSEHOVERHEIGHT: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseHoverHeight = uiParam; - break; - case SPI_SETMOUSEBUTTONSWAP: - { - UNICODE_STRING SubKeyName = RTL_CONSTANT_STRING(L"Control Panel\\Mouse"); - UNICODE_STRING SwapMouseButtons = RTL_CONSTANT_STRING(L"SwapMouseButtons"); - WCHAR szBuffer[10]; + case SPI_SETBORDER: + uiParam = max(uiParam, 1); + return SpiSetInt(&gspv.ncm.iBorderWidth, uiParam, KEY_METRIC, VAL_BORDER, fl); - swprintf(szBuffer, L"%u", uiParam); - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->SwapButtons = uiParam; - IntWriteSystemParametersSettings(&SubKeyName, &SwapMouseButtons, REG_SZ, szBuffer, (wcslen(szBuffer)+1) * sizeof(WCHAR)); - break; - } - case SPI_SETMOUSE: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->CursorAccelerationInfo = *(PCURSORACCELERATION_INFO)pvParam; - break; - case SPI_GETMOUSE: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PCURSORACCELERATION_INFO)pvParam = CurInfo->CursorAccelerationInfo; - break; - case SPI_SETMOUSESPEED: - CurInfo = IntGetSysCursorInfo(WinStaObject); - CurInfo->MouseSpeed = (UINT)pvParam; - /* Limit value to 1...20 range */ - if(CurInfo->MouseSpeed < 1) - { - CurInfo->MouseSpeed = 1; - } - else if(CurInfo->MouseSpeed > 20) - { - CurInfo->MouseSpeed = 20; - } - break; - case SPI_GETMOUSESPEED: - CurInfo = IntGetSysCursorInfo(WinStaObject); - *(PUINT)pvParam = CurInfo->MouseSpeed; - break; - case SPI_SETDESKWALLPAPER: - { - /* This function expects different parameters than the user mode version! + case SPI_GETKEYBOARDSPEED: + return SpiGetInt(pvParam, &gspv.dwKbdSpeed, fl); - We let the user mode code load the bitmap, it passed the handle to - the bitmap. We'll change it's ownership to system and replace it with - the current wallpaper bitmap */ - HBITMAP hOldBitmap, hNewBitmap; - UNICODE_STRING Key = RTL_CONSTANT_STRING(L"Control Panel\\Desktop"); - UNICODE_STRING Tile = RTL_CONSTANT_STRING(L"TileWallpaper"); - UNICODE_STRING Style = RTL_CONSTANT_STRING(L"WallpaperStyle"); - UNICODE_STRING KeyPath; - OBJECT_ATTRIBUTES KeyAttributes; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - HANDLE CurrentUserKey = NULL; - HANDLE KeyHandle = NULL; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - ULONG Length = 0; - ULONG ResLength = 0; - ULONG TileNum = 0; - ULONG StyleNum = 0; - ASSERT(pvParam); + case SPI_SETKEYBOARDSPEED: + return SpiSetInt(&gspv.dwKbdSpeed, uiParam, KEY_KBD, VAL_KBDSPD, fl); - hNewBitmap = *(HBITMAP*)pvParam; - if(hNewBitmap != NULL) - { - SURFACE *psurfBmp; - /* try to get the size of the wallpaper */ - if(!(psurfBmp = SURFACE_LockSurface(hNewBitmap))) - { - ObDereferenceObject(WinStaObject); - return FALSE; - } - WinStaObject->cxWallpaper = psurfBmp->SurfObj.sizlBitmap.cx; - WinStaObject->cyWallpaper = psurfBmp->SurfObj.sizlBitmap.cy; - - SURFACE_UnlockSurface(psurfBmp); - - /* change the bitmap's ownership */ - GDIOBJ_SetOwnership(hNewBitmap, NULL); - } - hOldBitmap = (HBITMAP)InterlockedExchange((LONG*)&WinStaObject->hbmWallpaper, (LONG)hNewBitmap); - if(hOldBitmap != NULL) - { - /* delete the old wallpaper */ - GreDeleteObject(hOldBitmap); - } - - /* Set the style */ - /*default value is center */ - WinStaObject->WallpaperMode = wmCenter; - - /* Get a handle to the current users settings */ - RtlFormatCurrentUserKeyPath(&KeyPath); - InitializeObjectAttributes(&ObjectAttributes,&KeyPath,OBJ_CASE_INSENSITIVE,NULL,NULL); - ZwOpenKey(&CurrentUserKey, KEY_READ, &ObjectAttributes); - RtlFreeUnicodeString(&KeyPath); - - /* open up the settings to read the values */ - InitializeObjectAttributes(&KeyAttributes, &Key, OBJ_CASE_INSENSITIVE, - CurrentUserKey, NULL); - ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwClose(CurrentUserKey); - - /* read the tile value in the registry */ - Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - 0, 0, &ResLength); - - /* fall back to .DEFAULT if we didnt find values */ - if(Status == STATUS_INVALID_HANDLE) - { - RtlInitUnicodeString (&KeyPath,L"\\Registry\\User\\.Default\\Control Panel\\Desktop"); - InitializeObjectAttributes(&KeyAttributes, &KeyPath, OBJ_CASE_INSENSITIVE, - NULL, NULL); - ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - 0, 0, &ResLength); - } - - ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); - Length = ResLength; - - if(!KeyValuePartialInfo) - { - NtClose(KeyHandle); - return FALSE; - } - - Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, Length, &ResLength); - if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) - { - ZwClose(KeyHandle); - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - return FALSE; - } - - Tile.Length = KeyValuePartialInfo->DataLength; - Tile.MaximumLength = KeyValuePartialInfo->DataLength; - Tile.Buffer = (PWSTR)KeyValuePartialInfo->Data; - - Status = RtlUnicodeStringToInteger(&Tile, 0, &TileNum); - if(!NT_SUCCESS(Status)) - { - TileNum = 0; - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - - /* start over again and look for the style*/ - ResLength = 0; - Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, - 0, 0, &ResLength); - - ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); - Length = ResLength; - - if(!KeyValuePartialInfo) - { - ZwClose(KeyHandle); - return FALSE; - } - - Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, Length, &ResLength); - if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) - { - ZwClose(KeyHandle); - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - return FALSE; - } - - Style.Length = KeyValuePartialInfo->DataLength; - Style.MaximumLength = KeyValuePartialInfo->DataLength; - Style.Buffer = (PWSTR)KeyValuePartialInfo->Data; - - Status = RtlUnicodeStringToInteger(&Style, 0, &StyleNum); - if(!NT_SUCCESS(Status)) - { - StyleNum = 0; - } - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - - /* Check the values we found in the registry */ - if(TileNum && !StyleNum) - { - WinStaObject->WallpaperMode = wmTile; - } - else if(!TileNum && StyleNum == 2) - { - WinStaObject->WallpaperMode = wmStretch; - } - - ZwClose(KeyHandle); - break; - } - case SPI_GETDESKWALLPAPER: - /* This function expects different parameters than the user mode version! - We basically return the current wallpaper handle - if any. The user - mode version should load the string from the registry and return it - without calling this function */ - - ASSERT(pvParam); - *(HBITMAP*)pvParam = (HBITMAP)WinStaObject->hbmWallpaper; - break; - } - - /* FIXME save the value to the registry */ - - ObDereferenceObject(WinStaObject); + case SPI_LANGDRIVER: + DPRINT1("SPI_LANGDRIVER is unimplemented\n"); break; - } - case SPI_SETWORKAREA: - { - RECTL *rc; + + case SPI_GETSCREENSAVETIMEOUT: + return SpiGetInt(pvParam, &gspv.iScrSaverTimeout, fl); + + case SPI_SETSCREENSAVETIMEOUT: + return SpiSetInt(&gspv.iScrSaverTimeout, uiParam, KEY_DESKTOP, VAL_SCRTO, fl); + + case SPI_GETSCREENSAVEACTIVE: + return SpiGetInt(pvParam, &gspv.bScrSaverActive, fl); + + case SPI_SETSCREENSAVEACTIVE: + return SpiSetInt(&gspv.bScrSaverActive, uiParam, KEY_DESKTOP, VAL_SCRACT, fl); + + case SPI_GETGRIDGRANULARITY: + return SpiGetInt(pvParam, &gspv.uiGridGranularity, fl); + + case SPI_SETGRIDGRANULARITY: + return SpiSetInt(&gspv.uiGridGranularity, uiParam, KEY_DESKTOP, VAL_GRID, fl); + + case SPI_GETDESKWALLPAPER: + uiParam = min(uiParam, gspv.ustrWallpaper.Length + 1); + return SpiGet(pvParam, gspv.awcWallpaper, uiParam, fl); + + case SPI_SETDESKWALLPAPER: + return SpiSetWallpaper(pvParam, fl); + + case SPI_SETDESKPATTERN: + DPRINT1("SPI_SETDESKPATTERN is unimplemented\n"); + break; + + case SPI_GETKEYBOARDDELAY: + return SpiGetInt(pvParam, &gspv.iKbdDelay, fl); + + case SPI_SETKEYBOARDDELAY: + return SpiSetInt(&gspv.iKbdDelay, uiParam, KEY_KBD, VAL_KBDDELAY, fl); + + case SPI_ICONHORIZONTALSPACING: + if (pvParam) + { + return SpiGetInt(pvParam, &gspv.im.iHorzSpacing, fl); + } + uiParam = max(uiParam, 32); + return SpiSetMetric(&gspv.im.iHorzSpacing, uiParam, VAL_ICONSPC, fl); + + case SPI_ICONVERTICALSPACING: + if (pvParam) + { + return SpiGetInt(pvParam, &gspv.im.iVertSpacing, fl); + } + uiParam = max(uiParam, 32); + return SpiSetMetric(&gspv.im.iVertSpacing, uiParam, VAL_ICONVSPC, fl); + + case SPI_GETICONTITLEWRAP: + return SpiGetInt(pvParam, &gspv.im.iTitleWrap, fl); + + case SPI_SETICONTITLEWRAP: + return SpiSetInt(&gspv.im.iTitleWrap, uiParam, KEY_METRIC, VAL_ITWRAP, fl); + + case SPI_GETMENUDROPALIGNMENT: + return SpiGetInt(pvParam, &gspv.bMenuDropAlign, fl); + + case SPI_SETMENUDROPALIGNMENT: + return SpiSetBool(&gspv.bMenuDropAlign, uiParam, KEY_MDALIGN, VAL_MDALIGN, fl); + + case SPI_SETDOUBLECLKWIDTH: + return SpiSetInt(&gspv.iDblClickWidth, uiParam, KEY_MOUSE, VAL_DBLCLKWIDTH, fl); + + case SPI_SETDOUBLECLKHEIGHT: + return SpiSetInt(&gspv.iDblClickHeight, uiParam, KEY_MOUSE, VAL_DBLCLKHEIGHT, fl); + + case SPI_GETICONTITLELOGFONT: + return SpiGet(pvParam, &gspv.im.lfFont, sizeof(LOGFONTW), fl); + + case SPI_SETICONTITLELOGFONT: + if (!SpiSet(&gspv.im.lfFont, pvParam, sizeof(LOGFONTW), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreFont(L"IconFont", &gspv.im.lfFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_SETDOUBLECLICKTIME: + return SpiSetInt(&gspv.iDblClickTime, uiParam, KEY_MOUSE, VAL_DBLCLKTIME, fl); + + case SPI_SETMOUSEBUTTONSWAP: + return SpiSetInt(&gspv.bMouseBtnSwap, uiParam, KEY_MOUSE, VAL_SWAP, fl); + + case SPI_GETFASTTASKSWITCH: + return SpiGetInt(pvParam, &gspv.bFastTaskSwitch, fl); + + case SPI_SETFASTTASKSWITCH: + /* According to Winetest this one is unimplemented */ + return 0; + + case SPI_GETDRAGFULLWINDOWS: + return SpiGetInt(pvParam, &gspv.bDragFullWindows, fl); + + case SPI_SETDRAGFULLWINDOWS: + return SpiSetInt(&gspv.bDragFullWindows, uiParam, KEY_DESKTOP, VAL_DRAG, fl); + + case SPI_GETNONCLIENTMETRICS: + return SpiGet(pvParam, &gspv.ncm, sizeof(NONCLIENTMETRICSW), fl); + + case SPI_SETNONCLIENTMETRICS: + if (!SpiSet(&gspv.ncm, pvParam, sizeof(NONCLIENTMETRICSW), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"BorderWidth", gspv.ncm.iBorderWidth); + SpiStoreMetric(L"ScrollWidth", gspv.ncm.iScrollWidth); + SpiStoreMetric(L"ScrollHeight", gspv.ncm.iScrollHeight); + SpiStoreMetric(L"CaptionWidth", gspv.ncm.iCaptionWidth); + SpiStoreMetric(L"CaptionHeight", gspv.ncm.iCaptionHeight); + SpiStoreMetric(L"SmCaptionWidth", gspv.ncm.iSmCaptionWidth); + SpiStoreMetric(L"SmCaptionHeight", gspv.ncm.iSmCaptionHeight); + SpiStoreMetric(L"MenuWidth", gspv.ncm.iMenuWidth); + SpiStoreMetric(L"MenuHeight", gspv.ncm.iMenuHeight); +#if (WINVER >= 0x0600) + SpiStoreMetric(L"PaddedBorderWidth", gspv.ncm.iPaddedBorderWidth); +#endif + SpiStoreFont(L"CaptionFont", &gspv.ncm.lfCaptionFont); + SpiStoreFont(L"SmCaptionFont", &gspv.ncm.lfSmCaptionFont); + SpiStoreFont(L"MenuFont", &gspv.ncm.lfMenuFont); + SpiStoreFont(L"StatusFont", &gspv.ncm.lfStatusFont); + SpiStoreFont(L"MessageFont", &gspv.ncm.lfMessageFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETMINIMIZEDMETRICS: + return SpiGet(pvParam, &gspv.mm, sizeof(MINIMIZEDMETRICS), fl); + + case SPI_SETMINIMIZEDMETRICS: + if (!SpiSet(&gspv.mm, pvParam, sizeof(MINIMIZEDMETRICS), fl)) + return 0; + gspv.mm.iWidth = max(0, gspv.mm.iWidth); + gspv.mm.iHorzGap = max(0, gspv.mm.iHorzGap); + gspv.mm.iVertGap = max(0, gspv.mm.iVertGap); + gspv.mm.iArrange = gspv.mm.iArrange & 0xf; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"MinWidth", gspv.mm.iWidth); + SpiStoreMetric(L"MinHorzGap", gspv.mm.iHorzGap); + SpiStoreMetric(L"MinVertGap", gspv.mm.iVertGap); + SpiStoreMetric(L"MinArrange", gspv.mm.iArrange); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETICONMETRICS: + return SpiGet(pvParam, &gspv.im, sizeof(ICONMETRICS), fl); + + case SPI_SETICONMETRICS: + if (!SpiSet(&gspv.im, pvParam, sizeof(ICONMETRICS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreMetric(L"IconSpacing", gspv.im.iHorzSpacing); + SpiStoreMetric(L"IconVerticalspacing", gspv.im.iVertSpacing); + SpiStoreMetric(L"IconTitleWrap", gspv.im.iTitleWrap); + SpiStoreFont(L"IconFont", &gspv.im.lfFont); + } + return (UINT_PTR)KEY_METRIC; + + case SPI_GETWORKAREA: // FIXME: the workarea should be part of the MONITOR + { PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PDESKTOP Desktop = pti->Desktop; + PDESKTOP pdesktop = pti->Desktop; + RECTL rclWorkarea; - if(!Desktop) - { - /* FIXME - Set last error */ - return FALSE; - } + if(!pdesktop) + return 0; - ASSERT(pvParam); - rc = pvParam; - Desktop->WorkArea = *rc; - bChanged = TRUE; + IntGetDesktopWorkArea(pdesktop, &rclWorkarea); + return SpiGet(pvParam, &rclWorkarea, sizeof(RECTL), fl); + } - break; - } - case SPI_GETWORKAREA: - { + case SPI_SETWORKAREA: // FIXME: the workarea should be part of the MONITOR + { PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PDESKTOP Desktop = pti->Desktop; + PDESKTOP pdesktop = pti->Desktop; + RECT rcWorkArea; - if(!Desktop) + if(!pdesktop) + return 0; + + if (!SpiSet(&rcWorkArea, pvParam, sizeof(RECTL), fl)) + return 0; + + /* Verify the new values */ + if (rcWorkArea.left < 0 || + rcWorkArea.top < 0 || + rcWorkArea.right > gpsi->SystemMetrics[SM_CXSCREEN] || + rcWorkArea.bottom > gpsi->SystemMetrics[SM_CYSCREEN] || + rcWorkArea.right <= rcWorkArea.left || + rcWorkArea.bottom <= rcWorkArea.top) + return 0; + + pdesktop->WorkArea = rcWorkArea; + if (fl & SPIF_UPDATEINIFILE) { - /* FIXME - Set last error */ - return FALSE; + // FIXME: what to do? } + return (UINT_PTR)KEY_DESKTOP; + } - ASSERT(pvParam); - IntGetDesktopWorkArea(Desktop, pvParam); - + case SPI_SETPENWINDOWS: + DPRINT1("SPI_SETPENWINDOWS is unimplemented\n"); break; - } - case SPI_SETGRADIENTCAPTIONS: - { - GradientCaptions = (pvParam != NULL); - /* FIXME - should be checked if the color depth is higher than 8bpp? */ - bChanged = TRUE; - break; - } - case SPI_GETGRADIENTCAPTIONS: - { - HDC hDC; - BOOL Ret = GradientCaptions; - hDC = IntGetScreenDC(); - if(!hDC) + case SPI_GETFILTERKEYS: + return SpiGet(pvParam, &gspv.filterkeys, sizeof(FILTERKEYS), fl); + + case SPI_SETFILTERKEYS: + if (!SpiSet(&gspv.filterkeys, pvParam, sizeof(FILTERKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - return FALSE; + // FIXME: what to do? } - Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret; + return (UINT_PTR)KEY_DESKTOP; - ASSERT(pvParam); - *((PBOOL)pvParam) = Ret; - break; - } - case SPI_SETFONTSMOOTHING: - { - IntEnableFontRendering(uiParam != 0); - bChanged = TRUE; - break; - } - case SPI_GETFONTSMOOTHING: - { - ASSERT(pvParam); - *((BOOL*)pvParam) = IntIsFontRenderingEnabled(); - break; - } - case SPI_SETFONTSMOOTHINGTYPE: - { - if (*((UINT*)pvParam) == FE_FONTSMOOTHINGCLEARTYPE) + case SPI_GETTOGGLEKEYS: + return SpiGet(pvParam, &gspv.togglekeys, sizeof(TOGGLEKEYS), fl); + + case SPI_SETTOGGLEKEYS: + if (!SpiSet(&gspv.togglekeys, pvParam, sizeof(TOGGLEKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) { - DPRINT1("ReactOS does not support ClearType smoothing but it is returned TRUE\n"); + // FIXME: what to do? } - bChanged = TRUE; - break; - } - case SPI_GETFONTSMOOTHINGTYPE: - { - /* We do not support ClearType. Only standard smoothing */ - DPRINT1("ReactOS does not support ClearType smoothing. Returned FE_FONTSMOOTHINGSTANDARD\n"); - *((UINT*)pvParam) = FE_FONTSMOOTHINGSTANDARD; - break; - } - case SPI_GETICONTITLELOGFONT: - { - ASSERT(pvParam); - *((LOGFONTW*)pvParam) = IconFont; - break; - } - case SPI_GETNONCLIENTMETRICS: - { - ASSERT(pvParam); - *((NONCLIENTMETRICSW*)pvParam) = pMetrics; - break; - } - case SPI_GETANIMATION: - { - ASSERT(pvParam); - *(( ANIMATIONINFO*)pvParam) = anim; - break; - } - case SPI_SETANIMATION: - { - ASSERT(pvParam); - anim = *((ANIMATIONINFO*)pvParam); - bChanged = TRUE; - } - case SPI_SETNONCLIENTMETRICS: - { - ASSERT(pvParam); - pMetrics = *((NONCLIENTMETRICSW*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETMINIMIZEDMETRICS: - { - ASSERT(pvParam); - *((MINIMIZEDMETRICS*)pvParam) = MinimizedMetrics; - break; - } - case SPI_SETMINIMIZEDMETRICS: - { - ASSERT(pvParam); - MinimizedMetrics = *((MINIMIZEDMETRICS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETFOCUSBORDERHEIGHT: - { - ASSERT(pvParam); - *((UINT*)pvParam) = FocusBorderHeight; - break; - } - case SPI_GETFOCUSBORDERWIDTH: - { - ASSERT(pvParam); - *((UINT*)pvParam) = FocusBorderWidth; - break; - } - case SPI_SETFOCUSBORDERHEIGHT: - { - FocusBorderHeight = (UINT)pvParam; - bChanged = TRUE; - break; - } - case SPI_SETFOCUSBORDERWIDTH: - { - FocusBorderWidth = (UINT)pvParam; - bChanged = TRUE; - break; - } - case SPI_GETSTICKYKEYS: - { - *((STICKYKEYS*)pvParam) = StickyKeys; - break; - } - case SPI_SETSTICKYKEYS: - { - StickyKeys = *((STICKYKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETFILTERKEYS: - { - *((FILTERKEYS*)pvParam) = FilterKeys; - break; - } - case SPI_SETFILTERKEYS: - { - FilterKeys = *((FILTERKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETTOGGLEKEYS: - { - *((TOGGLEKEYS*)pvParam) = ToggleKeys; - break; - } - case SPI_SETTOGGLEKEYS: - { - ToggleKeys = *((TOGGLEKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETSERIALKEYS: - { - *((SERIALKEYS*)pvParam) = SerialKeys; - break; - } - case SPI_SETSERIALKEYS: - { - SerialKeys = *((SERIALKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETMOUSEKEYS: - { - *((MOUSEKEYS*)pvParam) = MouseKeys; - break; - } - case SPI_SETMOUSEKEYS: - { - MouseKeys = *((MOUSEKEYS*)pvParam); - bChanged = TRUE; - break; - } - case SPI_GETKEYBOARDPREF: - { - *((BOOL*)pvParam) = KeyboardPref; - break; - } - case SPI_SETKEYBOARDPREF: - { - KeyboardPref = (BOOL)uiParam; - bChanged = TRUE; - break; - } - case SPI_GETSHOWSOUNDS: - { - *((BOOL*)pvParam) = ShowSounds; - break; - } - case SPI_SETSHOWSOUNDS: - { - ShowSounds = (BOOL)uiParam; - bChanged = TRUE; - break; - } - case SPI_GETACCESSTIMEOUT: - { - *((ACCESSTIMEOUT*)pvParam) = AccessTimeout; - break; - } - case SPI_SETACCESSTIMEOUT: - { - AccessTimeout = *((ACCESSTIMEOUT*)pvParam); - bChanged = TRUE; - break; - } + return (UINT_PTR)KEY_DESKTOP; - case SPI_GETCARETWIDTH: - { - *((DWORD*)pvParam) = CaretWidth; - break; - } + case SPI_GETMOUSEKEYS: + return SpiGet(pvParam, &gspv.mousekeys, sizeof(MOUSEKEYS), fl); - case SPI_SETCARETWIDTH: - { - CaretWidth = *((DWORD*)pvParam); - bChanged = TRUE; - break; - } + case SPI_SETMOUSEKEYS: + if (!SpiSet(&gspv.mousekeys, pvParam, sizeof(MOUSEKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; - default: - { - DPRINT1("FIXME: Unsupported SPI Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n", - uiAction, uiParam, pvParam, fWinIni); - return FALSE; - } - } - /* Did we change something ? */ - if (bChanged) - { - /* Shall we send a WM_SETTINGCHANGE message ? */ - if (fWinIni & (SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)) - { - /* Broadcast WM_SETTINGCHANGE to all toplevel windows */ - /* FIXME: lParam should be pointer to a string containing the reg key */ - UserPostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)uiAction, 0); - } - } - return TRUE; + case SPI_GETSHOWSOUNDS: + return SpiGetInt(pvParam, &gspv.bShowSounds, fl); + + case SPI_SETSHOWSOUNDS: + return SpiSetBool(&gspv.bShowSounds, uiParam, KEY_SHOWSNDS, VAL_ON, fl); + + case SPI_GETSTICKYKEYS: + if (uiParam != sizeof(STICKYKEYS)) + return 0; + return SpiGetEx(pvParam, &gspv.stickykeys, sizeof(STICKYKEYS), fl); + + case SPI_SETSTICKYKEYS: + if (!SpiSet(&gspv.stickykeys, pvParam, sizeof(STICKYKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETACCESSTIMEOUT: + if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT)) + return 0; + return SpiGetEx(pvParam, &gspv.accesstimeout, sizeof(ACCESSTIMEOUT), fl); + + case SPI_SETACCESSTIMEOUT: + if (!SpiSet(&gspv.accesstimeout, pvParam, sizeof(ACCESSTIMEOUT), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETSERIALKEYS: + return SpiGet(pvParam, &gspv.serialkeys, sizeof(SERIALKEYS), fl); + + case SPI_SETSERIALKEYS: + if (!SpiSet(&gspv.serialkeys, pvParam, sizeof(SERIALKEYS), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETSOUNDSENTRY: + return SpiGet(pvParam, &gspv.soundsentry, sizeof(SOUNDSENTRY), fl); + + case SPI_SETSOUNDSENTRY: + if (!SpiSet(&gspv.soundsentry, pvParam, sizeof(SOUNDSENTRY), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETHIGHCONTRAST: + return SpiGet(pvParam, &gspv.highcontrast, sizeof(HIGHCONTRAST), fl); + + case SPI_SETHIGHCONTRAST: + if (!SpiSet(&gspv.highcontrast, pvParam, sizeof(HIGHCONTRAST), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETKEYBOARDPREF: + return SpiGetInt(pvParam, &gspv.bKbdPref, fl); + + case SPI_SETKEYBOARDPREF: + return SpiSetBool(&gspv.bKbdPref, uiParam, KEY_KDBPREF, VAL_ON, fl); + + case SPI_GETSCREENREADER: + return SpiGetInt(pvParam, &gspv.bScreenReader, fl); + + case SPI_SETSCREENREADER: + return SpiSetBool(&gspv.bScreenReader, uiParam, KEY_SCRREAD, VAL_ON, fl); + + case SPI_GETANIMATION: + return SpiGet(pvParam, &gspv.animationinfo, sizeof(ANIMATIONINFO), fl); + + case SPI_SETANIMATION: + if (!SpiSet(&gspv.animationinfo, pvParam, sizeof(ANIMATIONINFO), fl)) + return 0; + if (fl & SPIF_UPDATEINIFILE) + { + // FIXME: what to do? + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_GETFONTSMOOTHING: + return SpiGetInt(pvParam, &gspv.bFontSmoothing, fl); + + case SPI_SETFONTSMOOTHING: + gspv.bFontSmoothing = uiParam ? TRUE : FALSE; + if (fl & SPIF_UPDATEINIFILE) + { + SpiStoreSzInt(KEY_DESKTOP, VAL_FNTSMOOTH, uiParam ? 2 : 0); + } + return (UINT_PTR)KEY_DESKTOP; + + case SPI_SETDRAGWIDTH: + return SpiSetInt(&gspv.iDragWidth, uiParam, KEY_DESKTOP, VAL_DRAGWIDTH, fl); + + case SPI_SETDRAGHEIGHT: + return SpiSetInt(&gspv.iDragHeight, uiParam, KEY_DESKTOP, VAL_DRAGHEIGHT, fl); + + case SPI_SETHANDHELD: + return SpiSetBool(&gspv.bHandHeld, uiParam, KEY_DESKTOP, L"HandHeld", fl); + + case SPI_GETLOWPOWERTIMEOUT: + return SpiGetInt(pvParam, &gspv.iLowPwrTimeout, fl); + + case SPI_GETPOWEROFFTIMEOUT: + return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl); + + case SPI_SETLOWPOWERTIMEOUT: + return SpiSetInt(&gspv.iLowPwrTimeout, uiParam, KEY_DESKTOP, L"LowPowerTimeOut", fl); + + case SPI_SETPOWEROFFTIMEOUT: + return SpiSetInt(&gspv.iPwrOffTimeout, uiParam, KEY_DESKTOP, L"PowerOffTimeOut", fl); + + case SPI_GETLOWPOWERACTIVE: + return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl); + + case SPI_GETPOWEROFFACTIVE: + return SpiGetInt(pvParam, &gspv.bPwrOffActive, fl); + + case SPI_SETLOWPOWERACTIVE: + return SpiSetBool(&gspv.bLowPwrActive, uiParam, KEY_DESKTOP, L"LowPowerActive", fl); + + case SPI_SETPOWEROFFACTIVE: + return SpiSetBool(&gspv.bPwrOffActive, uiParam, KEY_DESKTOP, L"PowerOffActive", fl); + + case SPI_SETCURSORS: + DPRINT1("SPI_SETCURSORS is unimplemented\n"); + break; + + case SPI_SETICONS: + DPRINT1("SPI_SETICONS is unimplemented\n"); + break; + + case SPI_GETDEFAULTINPUTLANG: + DPRINT1("SPI_GETDEFAULTINPUTLANG is unimplemented\n"); + break; + + case SPI_SETDEFAULTINPUTLANG: + DPRINT1("SPI_SETDEFAULTINPUTLANG is unimplemented\n"); + break; + + case SPI_SETLANGTOGGLE: + DPRINT1("SPI_SETLANGTOGGLE is unimplemented\n"); + break; + + case SPI_GETWINDOWSEXTENSION: + DPRINT1("SPI_GETWINDOWSEXTENSION is unimplemented\n"); + break; + + case SPI_GETMOUSETRAILS: + return SpiGetInt(pvParam, &gspv.iMouseTrails, fl); + + case SPI_SETMOUSETRAILS: + return SpiSetInt(&gspv.iMouseTrails, uiParam, KEY_MOUSE, L"MouseTrails", fl); + + case SPI_GETSNAPTODEFBUTTON: + return SpiGetInt(pvParam, &gspv.bSnapToDefBtn, fl); + + case SPI_SETSNAPTODEFBUTTON: + return SpiSetBool(&gspv.bSnapToDefBtn, uiParam, KEY_MOUSE, L"SnapToDefaultButton", fl); + + case SPI_GETMOUSEHOVERWIDTH: + return SpiGetInt(pvParam, &gspv.iMouseHoverWidth, fl); + + case SPI_SETMOUSEHOVERWIDTH: + return SpiSetInt(&gspv.iMouseHoverWidth, uiParam, KEY_MOUSE, L"MouseHoverWidth", fl); + + case SPI_GETMOUSEHOVERHEIGHT: + return SpiGetInt(pvParam, &gspv.iMouseHoverHeight, fl); + + case SPI_SETMOUSEHOVERHEIGHT: + return SpiSetInt(&gspv.iMouseHoverHeight, uiParam, KEY_MOUSE, L"MouseHoverHeight", fl); + + case SPI_GETMOUSEHOVERTIME: + return SpiGetInt(pvParam, &gspv.iMouseHoverTime, fl); + + case SPI_SETMOUSEHOVERTIME: + /* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx + * copy text from it, if some agument why xp and 2003 behovir diffent + * only if they do not have SP install + * " Windows Server 2003 and Windows XP: The operating system does not + * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until + * Windows Server 2003 SP1 and Windows XP SP2 " + */ + return SpiSetInt(&gspv.iMouseHoverTime, uiParam, KEY_MOUSE, L"MouseHoverTime", fl); + + case SPI_GETWHEELSCROLLLINES: + return SpiGetInt(pvParam, &gspv.iWheelScrollLines, fl); + + case SPI_SETWHEELSCROLLLINES: + return SpiSetInt(&gspv.iWheelScrollLines, uiParam, KEY_DESKTOP, L"WheelScrollLines", fl); + + case SPI_GETMENUSHOWDELAY: + return SpiGetInt(pvParam, &gspv.dwMenuShowDelay, fl); + + case SPI_SETMENUSHOWDELAY: + return SpiSetInt(&gspv.dwMenuShowDelay, uiParam, KEY_DESKTOP, L"MenuShowDelay", fl); + +#if (_WIN32_WINNT >= 0x0600) + case SPI_GETWHEELSCROLLCHARS: + return SpiGetInt(pvParam, &gspv.uiWheelScrollChars, fl); + + case SPI_SETWHEELSCROLLCHARS: + return SpiSetInt(&gspv.uiWheelScrollChars, uiParam, KEY_DESKTOP, L"WheelScrollChars", fl); +#endif + case SPI_GETSHOWIMEUI: + return SpiGetInt(pvParam, &gspv.bShowImeUi, fl); + + case SPI_SETSHOWIMEUI: + return SpiSetBool(&gspv.bShowImeUi, uiParam, KEY_DESKTOP, L"", fl); + + case SPI_GETMOUSESPEED: + return SpiGetInt(pvParam, &gspv.iMouseSpeed, fl); + + case SPI_SETMOUSESPEED: + // vgl SETMOUSE + return SpiSetInt(&gspv.iMouseSpeed, uiParam, KEY_MOUSE, L"MouseSpeed", fl); + + case SPI_GETSCREENSAVERRUNNING: + return SpiGetInt(pvParam, &gspv.bScrSaverRunning, fl); + + case SPI_SETSCREENSAVERRUNNING: + // FIXME: also return value? + return SpiSetBool(&gspv.bScrSaverRunning, uiParam, KEY_MOUSE, L"", fl); + +#if(WINVER >= 0x0600) + case SPI_GETAUDIODESCRIPTION: + return SpiGet(pvParam, &gspv.audiodesription, sizeof(AUDIODESCRIPTION), fl); + + case SPI_SETAUDIODESCRIPTION: + DPRINT1("SPI_SETAUDIODESCRIPTION is unimplemented\n"); + break; + + case SPI_GETSCREENSAVESECURE: + return SpiGetInt(pvParam, &gspv.bScrSaverSecure, fl); + + case SPI_SETSCREENSAVESECURE: + return SpiSetBool(&gspv.bScrSaverSecure, uiParam, KEY_DESKTOP, L"ScreenSaverIsSecure", fl); +#endif + + case SPI_GETACTIVEWINDOWTRACKING: + return SpiGetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl); + + case SPI_SETACTIVEWINDOWTRACKING: + return SpiSetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl); + + case SPI_GETMENUANIMATION: + return SpiGetUserPref(UPM_MENUANIMATION, pvParam, fl); + + case SPI_SETMENUANIMATION: + return SpiSetUserPref(UPM_MENUANIMATION, pvParam, fl); + + case SPI_GETCOMBOBOXANIMATION: + return SpiGetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl); + + case SPI_SETCOMBOBOXANIMATION: + return SpiSetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl); + + case SPI_GETLISTBOXSMOOTHSCROLLING: + return SpiGetUserPref(UPM_LISTBOXSMOOTHSCROLLING, pvParam, fl); + + case SPI_SETLISTBOXSMOOTHSCROLLING: + return SpiSetUserPref(UPM_LISTBOXSMOOTHSCROLLING, pvParam, fl); + + case SPI_GETGRADIENTCAPTIONS: + return SpiGetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl); + + case SPI_SETGRADIENTCAPTIONS: + return SpiSetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl); + + case SPI_GETKEYBOARDCUES: + return SpiGetUserPref(UPM_KEYBOARDCUES, pvParam, fl); + + case SPI_SETKEYBOARDCUES: + return SpiSetUserPref(UPM_KEYBOARDCUES, pvParam, fl); + + case SPI_GETACTIVEWNDTRKZORDER: + return SpiGetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl); + + case SPI_SETACTIVEWNDTRKZORDER: + return SpiSetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl); + + case SPI_GETHOTTRACKING: + return SpiGetUserPref(UPM_HOTTRACKING, pvParam, fl); + + case SPI_SETHOTTRACKING: + return SpiSetUserPref(UPM_HOTTRACKING, pvParam, fl); + + case SPI_GETMENUFADE: + return SpiGetUserPref(UPM_MENUFADE, pvParam, fl); + + case SPI_SETMENUFADE: + return SpiSetUserPref(UPM_MENUFADE, pvParam, fl); + + case SPI_GETSELECTIONFADE: + return SpiGetUserPref(UPM_SELECTIONFADE, pvParam, fl); + + case SPI_SETSELECTIONFADE: + return SpiSetUserPref(UPM_SELECTIONFADE, pvParam, fl); + + case SPI_GETTOOLTIPANIMATION: + return SpiGetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl); + + case SPI_SETTOOLTIPANIMATION: + return SpiSetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl); + + case SPI_GETTOOLTIPFADE: + return SpiGetUserPref(UPM_TOOLTIPFADE, pvParam, fl); + + case SPI_SETTOOLTIPFADE: + return SpiSetUserPref(UPM_TOOLTIPFADE, pvParam, fl); + + case SPI_GETCURSORSHADOW: + return SpiGetUserPref(UPM_CURSORSHADOW, pvParam, fl); + + case SPI_SETCURSORSHADOW: + return SpiSetUserPref(UPM_CURSORSHADOW, pvParam, fl); + + case SPI_GETUIEFFECTS: + return SpiGetUserPref(UPM_UIEFFECTS, pvParam, fl); + + case SPI_SETUIEFFECTS: + return SpiSetUserPref(UPM_UIEFFECTS, pvParam, fl); + + case SPI_GETMOUSESONAR: + return SpiGetInt(pvParam, &gspv.bMouseSonar, fl); + + case SPI_SETMOUSESONAR: + return SpiSetBool(&gspv.bMouseSonar, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSECLICKLOCK: + return SpiGetInt(pvParam, &gspv.bMouseClickLock, fl); + + case SPI_SETMOUSECLICKLOCK: + return SpiSetBool(&gspv.bMouseClickLock, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSEVANISH: + return SpiGetInt(pvParam, &gspv.bMouseVanish, fl); + + case SPI_SETMOUSEVANISH: + return SpiSetBool(&gspv.bMouseVanish, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFLATMENU: + return SpiGetInt(pvParam, &gspv.bFlatMenu, fl); + + case SPI_SETFLATMENU: + return SpiSetBool(&gspv.bFlatMenu, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETDROPSHADOW: + return SpiGetInt(pvParam, &gspv.bDropShadow, fl); + + case SPI_SETDROPSHADOW: + return SpiSetBool(&gspv.bDropShadow, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETBLOCKSENDINPUTRESETS: + return SpiGetInt(pvParam, &gspv.bBlockSendInputResets, fl); + + case SPI_SETBLOCKSENDINPUTRESETS: + return SpiSetBool(&gspv.bBlockSendInputResets, uiParam, KEY_MOUSE, L"", fl); + +#if(_WIN32_WINNT >= 0x0600) + case SPI_GETDISABLEOVERLAPPEDCONTENT: + return SpiGetInt(pvParam, &gspv.bDisableOverlappedContent, fl); + + case SPI_SETDISABLEOVERLAPPEDCONTENT: + return SpiSetBool(&gspv.bDisableOverlappedContent, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCLIENTAREAANIMATION: + return SpiGetInt(pvParam, &gspv.bClientAnimation, fl); + + case SPI_SETCLIENTAREAANIMATION: + return SpiSetBool(&gspv.bClientAnimation, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCLEARTYPE: + return SpiGetInt(pvParam, &gspv.bClearType, fl); + + case SPI_SETCLEARTYPE: + return SpiSetBool(&gspv.bClearType, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETSPEECHRECOGNITION: + return SpiGetInt(pvParam, &gspv.bSpeechRecognition, fl); + + case SPI_SETSPEECHRECOGNITION: + return SpiSetBool(&gspv.bSpeechRecognition, uiParam, KEY_MOUSE, L"", fl); +#endif + + case SPI_GETFOREGROUNDLOCKTIMEOUT: + return SpiGetInt(pvParam, &gspv.dwForegroundLockTimeout, fl); + + case SPI_SETFOREGROUNDLOCKTIMEOUT: + return SpiSetInt(&gspv.dwForegroundLockTimeout, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETACTIVEWNDTRKTIMEOUT: + return SpiGetInt(pvParam, &gspv.dwActiveTrackingTimeout, fl); + + case SPI_SETACTIVEWNDTRKTIMEOUT: + return SpiSetInt(&gspv.dwActiveTrackingTimeout, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOREGROUNDFLASHCOUNT: + return SpiGetInt(pvParam, &gspv.dwForegroundFlashCount, fl); + + case SPI_SETFOREGROUNDFLASHCOUNT: + return SpiSetInt(&gspv.dwForegroundFlashCount, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETCARETWIDTH: + return SpiGetInt(pvParam, &gspv.dwCaretWidth, fl); + + case SPI_SETCARETWIDTH: + return SpiSetInt(&gspv.dwCaretWidth, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETMOUSECLICKLOCKTIME: + return SpiGetInt(pvParam, &gspv.dwMouseClickLockTime, fl); + + case SPI_SETMOUSECLICKLOCKTIME: + return SpiSetInt(&gspv.dwMouseClickLockTime, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGTYPE: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingType, fl); + + case SPI_SETFONTSMOOTHINGTYPE: + return SpiSetInt(&gspv.uiFontSmoothingType, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGCONTRAST: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingContrast, fl); + + case SPI_SETFONTSMOOTHINGCONTRAST: + return SpiSetInt(&gspv.uiFontSmoothingContrast, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOCUSBORDERWIDTH: + return SpiGetInt(pvParam, &gspv.uiFocusBorderWidth, fl); + + case SPI_SETFOCUSBORDERWIDTH: + return SpiSetInt(&gspv.uiFocusBorderWidth, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFOCUSBORDERHEIGHT: + return SpiGetInt(pvParam, &gspv.uiFocusBorderHeight, fl); + + case SPI_SETFOCUSBORDERHEIGHT: + return SpiSetInt(&gspv.uiFocusBorderHeight, uiParam, KEY_MOUSE, L"", fl); + + case SPI_GETFONTSMOOTHINGORIENTATION: + return SpiGetInt(pvParam, &gspv.uiFontSmoothingOrientation, fl); + + case SPI_SETFONTSMOOTHINGORIENTATION: + return SpiSetInt(&gspv.uiFontSmoothingOrientation, uiParam, KEY_MOUSE, L"", fl); + + /* The following are undocumented, but valid SPI values */ + case 0x1010: + case 0x1011: + case 0x1028: + case 0x1029: + case 0x102A: + case 0x102B: + case 0x102C: + case 0x102D: + case 0x102E: + case 0x102F: + case 0x1030: + case 0x1031: + case 0x1032: + case 0x1033: + case 0x1034: + case 0x1035: + case 0x1036: + case 0x1037: + case 0x1038: + case 0x1039: + case 0x103A: + case 0x103B: + case 0x103C: + case 0x103D: + DPRINT1("Undocumented SPI value %x is unimplemented\n", uiAction); + break; + + default: + DPRINT1("Invalid SPI value: %d\n", uiAction); + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + return 0; } -static BOOL -UserSystemParametersInfo_StructSet( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni, - PVOID pBuffer, /* private kmode buffer */ - UINT cbSize /* size of buffer and expected size usermode data, pointed by pvParam */ - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("UserSystemParametersInfo_StructSet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n", - uiAction, uiParam, fWinIni); - - _SEH2_TRY - { - ProbeForRead(pvParam, cbSize, 1); - RtlCopyMemory(pBuffer,pvParam,cbSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - if(*(PUINT)pBuffer != cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, pBuffer, fWinIni); -} - -static BOOL -UserSystemParametersInfo_StructGet( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni, - PVOID pBuffer, /* private kmode buffer */ - UINT cbSize /* size of buffer and expected size usermode data, pointed by pvParam */ - ) -{ - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("UserSystemParametersInfo_StructGet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n",uiAction, uiParam, fWinIni); - - _SEH2_TRY - { - ProbeForRead(pvParam, cbSize, 1); - /* Copy only first UINT describing structure size*/ - *((PUINT)pBuffer) = *((PUINT)pvParam); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - if(*((PUINT)pBuffer) != cbSize) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return( FALSE); - } - if(!IntSystemParametersInfo(uiAction, uiParam, pBuffer, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, cbSize, 1); - RtlCopyMemory(pvParam,pBuffer,cbSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); -} - -/* - * @implemented - */ -BOOL FASTCALL +BOOL +FASTCALL UserSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) { - NTSTATUS Status = STATUS_SUCCESS; + ULONG_PTR ulResult; - /* FIXME: Support Windows Vista SPI Actions */ + if (!gbSpiInitialized) + { + KeRosDumpStackFrames(NULL, 20); + return FALSE; + } - switch(uiAction) - { -#if 1 /* only for 32bit applications */ - case SPI_SETLOWPOWERACTIVE: - case SPI_SETLOWPOWERTIMEOUT: - case SPI_SETPOWEROFFACTIVE: - case SPI_SETPOWEROFFTIMEOUT: -#endif - case SPI_SETICONS: - case SPI_SETSCREENSAVETIMEOUT: - case SPI_SETSCREENSAVEACTIVE: - case SPI_SETDOUBLECLKWIDTH: - case SPI_SETDOUBLECLKHEIGHT: - case SPI_SETDOUBLECLICKTIME: - case SPI_SETFONTSMOOTHING: - case SPI_SETMOUSEHOVERTIME: - case SPI_SETMOUSEHOVERWIDTH: - case SPI_SETMOUSEHOVERHEIGHT: - case SPI_SETMOUSETRAILS: - case SPI_SETSNAPTODEFBUTTON: - case SPI_SETBEEP: - case SPI_SETBLOCKSENDINPUTRESETS: - case SPI_SETKEYBOARDDELAY: - case SPI_SETKEYBOARDPREF: - case SPI_SETKEYBOARDSPEED: - case SPI_SETMOUSEBUTTONSWAP: - case SPI_SETWHEELSCROLLLINES: - case SPI_SETMENUSHOWDELAY: - case SPI_SETMENUDROPALIGNMENT: - case SPI_SETICONTITLEWRAP: - case SPI_SETCURSORS: - case SPI_SETDESKPATTERN: - case SPI_SETBORDER: - case SPI_SETDRAGHEIGHT: - case SPI_SETDRAGWIDTH: - case SPI_SETSHOWIMEUI: - case SPI_SETSCREENREADER: - case SPI_SETSHOWSOUNDS: - return IntSystemParametersInfo(uiAction, uiParam, NULL, fWinIni); + /* Get a pointer to the current Windowstation */ + gpwinstaCurrent = IntGetWinStaObj(); - /* NOTICE: from the IntSystemParametersInfo implementation it uses pvParam */ - case SPI_SETSCREENSAVERRUNNING: - case SPI_SETFLATMENU: - case SPI_SETMOUSESPEED: - case SPI_SETGRADIENTCAPTIONS: - case SPI_SETFOCUSBORDERHEIGHT: - case SPI_SETFOCUSBORDERWIDTH: - case SPI_SETLANGTOGGLE: - case SPI_SETMENUFADE: - case SPI_SETDROPSHADOW: - case SPI_SETACTIVEWINDOWTRACKING: - case SPI_SETACTIVEWNDTRKZORDER: - case SPI_SETACTIVEWNDTRKTIMEOUT: - case SPI_SETCARETWIDTH: - case SPI_SETFOREGROUNDFLASHCOUNT: - case SPI_SETFOREGROUNDLOCKTIMEOUT: - case SPI_SETFONTSMOOTHINGORIENTATION: - case SPI_SETFONTSMOOTHINGTYPE: - case SPI_SETFONTSMOOTHINGCONTRAST: - case SPI_SETKEYBOARDCUES: - case SPI_SETCOMBOBOXANIMATION: - case SPI_SETCURSORSHADOW: - case SPI_SETHOTTRACKING: - case SPI_SETLISTBOXSMOOTHSCROLLING: - case SPI_SETMENUANIMATION: - case SPI_SETSELECTIONFADE: - case SPI_SETTOOLTIPANIMATION: - case SPI_SETTOOLTIPFADE: - case SPI_SETUIEFFECTS: - case SPI_SETMOUSECLICKLOCK: - case SPI_SETMOUSESONAR: - case SPI_SETMOUSEVANISH: - return IntSystemParametersInfo(uiAction, 0, pvParam, fWinIni); + if (!gpwinstaCurrent) + { + DPRINT1("UserSystemParametersInfo called without active windowstation.\n"); + //KeRosDumpStackFrames(NULL, 0); + } - /* Get SPI msg here */ + /* Do the actual operation */ + ulResult = SpiGetSet(uiAction, uiParam, pvParam, fWinIni); -#if 1 /* only for 32bit applications */ - case SPI_GETLOWPOWERACTIVE: - case SPI_GETLOWPOWERTIMEOUT: - case SPI_GETPOWEROFFACTIVE: - case SPI_GETPOWEROFFTIMEOUT: -#endif + /* Did we change something? */ + if (ulResult > 1) + { + SpiFixupValues(); - case SPI_GETSCREENSAVERRUNNING: - case SPI_GETSCREENSAVETIMEOUT: - case SPI_GETSCREENSAVEACTIVE: - case SPI_GETKEYBOARDCUES: - case SPI_GETFONTSMOOTHING: - case SPI_GETGRADIENTCAPTIONS: - case SPI_GETFOCUSBORDERHEIGHT: - case SPI_GETFOCUSBORDERWIDTH: - case SPI_GETWHEELSCROLLLINES: - case SPI_GETWHEELSCROLLCHARS: - case SPI_GETFLATMENU: - case SPI_GETMOUSEHOVERHEIGHT: - case SPI_GETMOUSEHOVERWIDTH: - case SPI_GETMOUSEHOVERTIME: - case SPI_GETMOUSESPEED: - case SPI_GETMOUSETRAILS: - case SPI_GETSNAPTODEFBUTTON: - case SPI_GETBEEP: - case SPI_GETBLOCKSENDINPUTRESETS: - case SPI_GETKEYBOARDDELAY: - case SPI_GETKEYBOARDPREF: - case SPI_GETMENUDROPALIGNMENT: - case SPI_GETMENUFADE: - case SPI_GETMENUSHOWDELAY: - case SPI_GETICONTITLEWRAP: - case SPI_GETDROPSHADOW: - case SPI_GETFONTSMOOTHINGCONTRAST: - case SPI_GETFONTSMOOTHINGORIENTATION: - case SPI_GETFONTSMOOTHINGTYPE: - case SPI_GETACTIVEWINDOWTRACKING: - case SPI_GETACTIVEWNDTRKZORDER: - case SPI_GETBORDER: - case SPI_GETCOMBOBOXANIMATION: - case SPI_GETCURSORSHADOW: - case SPI_GETHOTTRACKING: - case SPI_GETLISTBOXSMOOTHSCROLLING: - case SPI_GETMENUANIMATION: - case SPI_GETSELECTIONFADE: - case SPI_GETTOOLTIPANIMATION: - case SPI_GETTOOLTIPFADE: - case SPI_GETUIEFFECTS: - case SPI_GETMOUSECLICKLOCK: - case SPI_GETMOUSECLICKLOCKTIME: - case SPI_GETMOUSESONAR: - case SPI_GETMOUSEVANISH: - case SPI_GETSCREENREADER: - case SPI_GETSHOWSOUNDS: - { - /* pvParam is PINT,PUINT or PBOOL */ - UINT Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(UINT ), 1); - *(PUINT)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } + /* Update system metrics */ + InitMetrics(); - case SPI_GETACTIVEWNDTRKTIMEOUT: - case SPI_GETKEYBOARDSPEED: - case SPI_GETCARETWIDTH: - case SPI_GETDRAGFULLWINDOWS: - case SPI_GETFOREGROUNDFLASHCOUNT: - case SPI_GETFOREGROUNDLOCKTIMEOUT: - { - /* pvParam is PDWORD */ - DWORD Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(DWORD ), 1); - *(PDWORD)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_GETICONMETRICS: - { - ICONMETRICSW Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETICONMETRICS: - { - ICONMETRICSW Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETMINIMIZEDMETRICS: - { - MINIMIZEDMETRICS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni,&Buffer,sizeof(Buffer)); - } - case SPI_SETMINIMIZEDMETRICS: - { - MINIMIZEDMETRICS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni,&Buffer,sizeof(Buffer)); - } - case SPI_GETNONCLIENTMETRICS: - { - NONCLIENTMETRICSW Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETNONCLIENTMETRICS: - { - NONCLIENTMETRICSW Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETANIMATION: - { - ANIMATIONINFO Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETANIMATION: - { - ANIMATIONINFO Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETACCESSTIMEOUT: - { - ACCESSTIMEOUT Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETACCESSTIMEOUT: - { - ACCESSTIMEOUT Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETFILTERKEYS: - { - FILTERKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, - &Buffer,sizeof(Buffer)); - } - case SPI_SETFILTERKEYS: - { - FILTERKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, - &Buffer,sizeof(Buffer)); - } - case SPI_GETSTICKYKEYS: - { - STICKYKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETSTICKYKEYS: - { - STICKYKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_GETTOGGLEKEYS: - { - TOGGLEKEYS Buffer; - return UserSystemParametersInfo_StructGet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETTOGGLEKEYS: - { - TOGGLEKEYS Buffer; - return UserSystemParametersInfo_StructSet(uiAction, uiParam, pvParam, fWinIni, &Buffer,sizeof(Buffer)); - } - case SPI_SETWORKAREA: - { - RECT rc; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( RECT ), 1); - RtlCopyMemory(&rc,pvParam,sizeof(RECT)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni); - } - case SPI_GETWORKAREA: - { - RECT rc; - if(!IntSystemParametersInfo(uiAction, uiParam, &rc, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( RECT ), 1); - RtlCopyMemory(pvParam,&rc,sizeof(RECT)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_SETMOUSE: - { - CURSORACCELERATION_INFO CursorAccelerationInfo; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( CURSORACCELERATION_INFO ), 1); - RtlCopyMemory(&CursorAccelerationInfo,pvParam,sizeof(CURSORACCELERATION_INFO)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &CursorAccelerationInfo, fWinIni); - } - case SPI_GETMOUSE: - { - CURSORACCELERATION_INFO CursorAccelerationInfo; - if(!IntSystemParametersInfo(uiAction, uiParam, &CursorAccelerationInfo, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( CURSORACCELERATION_INFO ), 1); - RtlCopyMemory(pvParam,&CursorAccelerationInfo,sizeof(CURSORACCELERATION_INFO)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_SETICONTITLELOGFONT: - { - LOGFONTW LogFont; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( LOGFONTW ), 1); - RtlCopyMemory(&LogFont,pvParam,sizeof(LOGFONTW)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &LogFont, fWinIni); - } - case SPI_GETICONTITLELOGFONT: - { - LOGFONTW LogFont; - if(!IntSystemParametersInfo(uiAction, uiParam, &LogFont, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( LOGFONTW ), 1); - RtlCopyMemory(pvParam,&LogFont,sizeof(LOGFONTW)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_ICONVERTICALSPACING: - case SPI_ICONHORIZONTALSPACING: - { - UINT Ret; - if(!IntSystemParametersInfo(uiAction, uiParam, &Ret, fWinIni)) - { - return( FALSE); - } - if(NULL != pvParam) - { - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof(UINT ), 1); - *(PUINT)pvParam = Ret; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - } - return( TRUE); - } - case SPI_SETDEFAULTINPUTLANG: - case SPI_SETDESKWALLPAPER: - /* !!! As opposed to the user mode version this version accepts a handle to the bitmap! */ - { - HANDLE Handle; - _SEH2_TRY - { - ProbeForRead(pvParam, sizeof( HANDLE ), 1); - Handle = *(PHANDLE)pvParam; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return IntSystemParametersInfo(uiAction, uiParam, &Handle, fWinIni); - } - case SPI_GETDEFAULTINPUTLANG: - case SPI_GETDESKWALLPAPER: - { - HANDLE Handle; - if(!IntSystemParametersInfo(uiAction, uiParam, &Handle, fWinIni)) - { - return( FALSE); - } - _SEH2_TRY - { - ProbeForWrite(pvParam, sizeof( HANDLE ), 1); - *(PHANDLE)pvParam = Handle; - RtlCopyMemory(pvParam,&Handle,sizeof(HANDLE)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return( FALSE); - } - return( TRUE); - } - case SPI_GETHIGHCONTRAST: - case SPI_SETHIGHCONTRAST: - case SPI_GETSOUNDSENTRY: - case SPI_SETSOUNDSENTRY: - { - /* FIXME: Support this accessibility SPI actions */ - DPRINT1("FIXME: Unsupported SPI Code: %lx \n",uiAction ); - break; - } - default : - { - SetLastNtError(ERROR_INVALID_PARAMETER); - DPRINT1("Invalid SPI Code: %lx \n",uiAction ); - break; - } - } - return( FALSE); + /* Send notification to toplevel windows, if requested */ + if (fWinIni & (SPIF_SENDCHANGE | SPIF_SENDWININICHANGE)) + { + /* Send WM_SETTINGCHANGE to all toplevel windows */ + co_IntSendMessageTimeout(HWND_BROADCAST, + WM_SETTINGCHANGE, + (WPARAM)uiAction, + (LPARAM)ulResult, + SMTO_NORMAL, + 100, + &ulResult); + } + ulResult = 1; + } + + /* Dereference the windowstation */ + if (gpwinstaCurrent) + { + ObDereferenceObject(gpwinstaCurrent); + gpwinstaCurrent = NULL; + } + + return ulResult; } -/* - * @implemented - */ BOOL APIENTRY NtUserSystemParametersInfo( - UINT uiAction, - UINT uiParam, - PVOID pvParam, - UINT fWinIni) + UINT uiAction, + UINT uiParam, + PVOID pvParam, + UINT fWinIni) { - DECLARE_RETURN(BOOLEAN); + BOOL bResult; - DPRINT("Enter NtUserSystemParametersInfo\n"); - UserEnterExclusive(); + DPRINT("Enter NtUserSystemParametersInfo(%d)\n", uiAction); + UserEnterExclusive(); - RETURN( UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni)); + //if (uiAction == SPI_SETMOUSE) gbDebug = 1; -CLEANUP: - DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; + // FIXME: get rid of the flags and only use this from um. kernel can access data directly. + /* Set UM memory protection flag */ + fWinIni |= SPIF_PROTECT; + + /* Call internal function */ + bResult = UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); + + //DPRINTX("NtUserSystemParametersInfo SPI_ICONHORIZONTALSPACING uiParam=%d, pvParam=%p, pvParam=%d bResult=%d\n", + // uiParam, pvParam, pvParam?*(UINT*)pvParam:0, bResult); + + DPRINT("Leave NtUserSystemParametersInfo, returning %d\n", bResult); + UserLeave(); + + //DPRINTX("NtUserSystemParametersInfo SPI_ICONHORIZONTALSPACING bResult=%d\n", bResult); + //gbDebug = 0; + + return bResult; } - - -BOOL APIENTRY -NtUserUpdatePerUserSystemParameters( - DWORD dwReserved, - BOOL bEnable) -{ - BOOL Result = TRUE; - DECLARE_RETURN(BOOLEAN); - - DPRINT("Enter NtUserUpdatePerUserSystemParameters\n"); - UserEnterExclusive(); - - Result &= IntDesktopUpdatePerUserSettings(bEnable); - RETURN( Result); - -CLEANUP: - DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; -} - -/* EOF */ diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 4c590b51d21..563fcbcd441 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -537,40 +537,25 @@ NtUserCreateWindowStation( /* FIXME: Obtain the following information from the registry */ - CurInfo->WheelScroLines = 3; - CurInfo->WheelScroChars = 3; +// CurInfo->WheelScroLines = 3; +// CurInfo->WheelScroChars = 3; CurInfo->SwapButtons = FALSE; CurInfo->DblClickSpeed = 500; CurInfo->DblClickWidth = 4; CurInfo->DblClickHeight = 4; - CurInfo->MouseSpeed = 10; - CurInfo->CursorAccelerationInfo.FirstThreshold = 6; - CurInfo->CursorAccelerationInfo.SecondThreshold = 10; - CurInfo->CursorAccelerationInfo.Acceleration = 1; +// CurInfo->MouseSpeed = 10; +// CurInfo->CursorAccelerationInfo.FirstThreshold = 6; +// CurInfo->CursorAccelerationInfo.SecondThreshold = 10; +// CurInfo->CursorAccelerationInfo.Acceleration = 1; - CurInfo->MouseHoverTime = 80; - CurInfo->MouseHoverWidth = 4; - CurInfo->MouseHoverHeight = 4; +// CurInfo->MouseHoverTime = 80; +// CurInfo->MouseHoverWidth = 4; +// CurInfo->MouseHoverHeight = 4; - WindowStationObject->ScreenSaverActive = FALSE; - WindowStationObject->ScreenSaverTimeOut = 10; +// WindowStationObject->ScreenSaverActive = FALSE; +// WindowStationObject->ScreenSaverTimeOut = 10; WindowStationObject->SystemCursor = CurInfo; - - RtlZeroMemory(&WindowStationObject->UserPreferences, sizeof(USERPREFERENCESMASK)); - /* Set all fields with default value = 1 : */ - WindowStationObject->UserPreferences.bMenuAnimation = 1; - WindowStationObject->UserPreferences.bComboBoxAnimation = 1; - WindowStationObject->UserPreferences.bListBoxSmoothScrolling = 1; - WindowStationObject->UserPreferences.bGradientCaptions = 1; - WindowStationObject->UserPreferences.bHotTracking = 1; - WindowStationObject->UserPreferences.bMenuFade = 1; - WindowStationObject->UserPreferences.bSelectionFade = 1; - WindowStationObject->UserPreferences.bMenuFade = 1; - WindowStationObject->UserPreferences.bTooltipAnimation = 1; - WindowStationObject->UserPreferences.bTooltipFade = 1; - WindowStationObject->UserPreferences.bCursorShadow = 1; - WindowStationObject->UserPreferences.bUiEffects = 1; /* END FIXME loading from register */ diff --git a/reactos/subsystems/win32/win32k/win32k.rbuild b/reactos/subsystems/win32/win32k/win32k.rbuild index 81afe2768c5..9e9a9a19b7e 100644 --- a/reactos/subsystems/win32/win32k/win32k.rbuild +++ b/reactos/subsystems/win32/win32k/win32k.rbuild @@ -86,9 +86,11 @@ driver.c err.c + file.c math.c rtlstr.c copy.c + registry.c usrheap.c