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.…
==============================================================================
--- 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: