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?rev=65936&r1=65935&r2=65936&view=diff
==============================================================================
--- 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:


Reply via email to