Author: akhaldi Date: Fri Jan 2 11:20:35 2015 New Revision: 65936
URL: http://svn.reactos.org/svn/reactos?rev=65936&view=rev Log: [MSGINA] Remember the previous choice in the shutdown dialog. Brought to you by Ricardo Hanke. CORE-8992
Modified: trunk/reactos/dll/win32/msgina/shutdown.c
Modified: trunk/reactos/dll/win32/msgina/shutdown.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msgina/shutdown.c... ============================================================================== --- trunk/reactos/dll/win32/msgina/shutdown.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msgina/shutdown.c [iso-8859-1] Fri Jan 2 11:20:35 2015 @@ -10,10 +10,95 @@ #include <powrprof.h> #include <strsafe.h> #include <wingdi.h> +#include <winreg.h> #include <stdlib.h>
int g_shutdownCode = 0; BOOL g_logoffHideState = FALSE; + +int LoadShutdownSelState(void) +{ + HKEY hKey; + DWORD dwValue, dwTemp, dwSize; + + + /* default to shutdown */ + dwValue = 1; + + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Explorer", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) + { + return dwValue; + } + + dwSize = sizeof(dwTemp); + if (RegQueryValueExW(hKey, L"Shutdown Setting", NULL, NULL, (LPBYTE)&dwTemp, &dwSize) == ERROR_SUCCESS) + { + switch(dwTemp) + { + case 0x01: /* Log off */ + dwValue = 0; + break; + + case 0x02: /* Shut down */ + dwValue = 1; + break; + + case 0x04: /* Reboot */ + dwValue = 2; + break; + + case 0x10: /* Sleep */ + dwValue = 3; + break; + + case 0x40: /* Hibernate */ + dwValue = 4; + break; + } + } + + RegCloseKey(hKey); + + return dwValue; +} + +VOID SaveShutdownSelState(int ShutdownCode) +{ + HKEY hKey; + DWORD dwValue = 0; + + + if (RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Explorer", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) != ERROR_SUCCESS) + { + return; + } + + switch(ShutdownCode) + { + case 0: /* Log off */ + dwValue = 0x01; + break; + + case 1: /* Shut down */ + dwValue = 0x02; + break; + + case 2: /* Reboot */ + dwValue = 0x04; + break; + + case 3: /* Sleep */ + dwValue = 0x10; + break; + + case 4: /* Hibernate */ + dwValue = 0x40; + break; + } + + RegSetValueExW(hKey, L"Shutdown Setting", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(dwValue)); + RegCloseKey(hKey); +}
VOID UpdateShutdownShellDesc(HWND hwnd) { @@ -109,6 +194,7 @@ case WM_INITDIALOG: { int defSelect = 0; + int tmpSelect, lastState; WCHAR userBuffer[256]; DWORD userBufferSize = _countof(userBuffer); WCHAR tmpBuffer[256]; @@ -125,35 +211,57 @@ /* Clears the content before it's used */ SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_RESETCONTENT, 0, 0);
+ lastState = LoadShutdownSelState(); + if(!g_logoffHideState) { /* Log off */ LoadStringW(hDllInstance, IDS_SHUTDOWN_LOGOFF, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); GetUserNameW(userBuffer, &userBufferSize); StringCchPrintfW(tmpBuffer2, 512, tmpBuffer, userBuffer); - SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer2); + tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer2); + if (lastState == 0) + { + defSelect = tmpSelect; + } }
/* Shut down - DEFAULT */ LoadStringW(hDllInstance, IDS_SHUTDOWN_SHUTDOWN, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); - defSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + if (lastState == 1) + { + defSelect = tmpSelect; + }
/* Restart */ LoadStringW(hDllInstance, IDS_SHUTDOWN_RESTART, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); - SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + if (lastState == 2) + { + defSelect = tmpSelect; + }
/* Sleep */ if (IsPwrSuspendAllowed()) { LoadStringW(hDllInstance, IDS_SHUTDOWN_SLEEP, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); - SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + if (lastState == 3) + { + defSelect = tmpSelect; + } }
/* Hibernate */ if (IsPwrHibernateAllowed()) { LoadStringW(hDllInstance, IDS_SHUTDOWN_HIBERNATE, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); - SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); + if (lastState == 4) + { + defSelect = tmpSelect; + } }
/* Sets the default shut down selection */ @@ -192,6 +300,7 @@ { case IDOK: g_shutdownCode = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + SaveShutdownSelState(g_shutdownCode); EndDialog(hwnd, IDOK); break; case IDCANCEL: