[POWERCFG] Fix the initialization of the power schemes page
[reactos.git] / dll / cpl / powercfg / powershemes.c
index f6ec02e..dd839bb 100644 (file)
 
 #include "powercfg.h"
 
+
+typedef struct _POWER_SCHEME
+{
+    LIST_ENTRY ListEntry;
+    UINT uId;
+    LPTSTR pszName;
+    LPTSTR pszDescription;
+    POWER_POLICY PowerPolicy;
+} POWER_SCHEME, *PPOWER_SCHEME;
+
+
+typedef struct _POWER_SCHEMES_PAGE_DATA
+{
+    LIST_ENTRY PowerSchemesList;
+    PPOWER_SCHEME pActivePowerScheme;
+} POWER_SCHEMES_PAGE_DATA, *PPOWER_SCHEMES_PAGE_DATA;
+
+
 UINT Sec[]=
 {
-       60,
-       120,
-       180,
-       300,
-       600,
-       900,
-       1200,
-       1500,
-       1800,
-       2700,
-       3600,
-       7200,
-       10800,
-       14400,
-       18000,
-       0
+    60,
+    120,
+    180,
+    300,
+    600,
+    900,
+    1200,
+    1500,
+    1800,
+    2700,
+    3600,
+    7200,
+    10800,
+    14400,
+    18000,
+    0
 };
 
-HWND hList = 0;
-HWND hPos = 0;
 
-unsigned aps = 0;
+static
+PPOWER_SCHEME
+AddPowerScheme(
+    PPOWER_SCHEMES_PAGE_DATA pPageData,
+    UINT uId,
+    DWORD dwName,
+    LPTSTR pszName,
+    DWORD dwDescription,
+    LPWSTR pszDescription,
+    PPOWER_POLICY pp)
+{
+    PPOWER_SCHEME pScheme;
+
+    pScheme = HeapAlloc(GetProcessHeap(),
+                        HEAP_ZERO_MEMORY,
+                        sizeof(POWER_SCHEME));
+    if (pScheme == NULL)
+        return NULL;
+
+    pScheme->pszName = HeapAlloc(GetProcessHeap(),
+                                 HEAP_ZERO_MEMORY,
+                                 dwName + sizeof(TCHAR));
+
+    pScheme->pszDescription = HeapAlloc(GetProcessHeap(),
+                                        HEAP_ZERO_MEMORY,
+                                        dwDescription + sizeof(TCHAR));
+    if (pScheme->pszName == NULL || pScheme->pszDescription == NULL)
+    {
+        HeapFree(GetProcessHeap(), 0, pScheme->pszName);
+        HeapFree(GetProcessHeap(), 0, pScheme->pszDescription);
+        HeapFree(GetProcessHeap(), 0, pScheme);
+        return NULL;
+    }
 
-#define MAX_POWER_POLICY       20
+    pScheme->uId = uId;
+    _tcscpy(pScheme->pszName, pszName);
+    _tcscpy(pScheme->pszDescription, pszDescription);
 
-POWER_POLICY gPP[MAX_POWER_POLICY];
-UINT guiIndex = 0;
-HWND hwndDialog;
+    CopyMemory(&pScheme->PowerPolicy, pp, sizeof(POWER_POLICY));
+
+    InsertTailList(&pPageData->PowerSchemesList, &pScheme->ListEntry);
+
+    return pScheme;
+}
 
 
+static
+VOID
+DeletePowerScheme(
+    PPOWER_SCHEME pScheme)
+{
+    RemoveEntryList(&pScheme->ListEntry);
+
+    HeapFree(GetProcessHeap(), 0, pScheme->pszName);
+    HeapFree(GetProcessHeap(), 0, pScheme->pszDescription);
+    HeapFree(GetProcessHeap(), 0, pScheme);
+}
+
+
+static
 BOOLEAN
-Pos_InitData(VOID)
+CALLBACK
+EnumPowerSchemeCallback(
+    UINT uiIndex,
+    DWORD dwName,
+    LPTSTR pszName,
+    DWORD dwDesc,
+    LPWSTR pszDesc,
+    PPOWER_POLICY pp,
+    LPARAM lParam)
 {
-       SYSTEM_POWER_CAPABILITIES spc;
-/*
-       RECT rectCtl, rectDlg, rectCtl2;
-       LONG movetop = 0;
-       LONG moveright = 0;
-
-       if (GetWindowRect(hPos,&rectDlg))
-               {
-                       if (GetWindowRect(GetDlgItem(hPos, IDC_SAT),&rectCtl2))
-                       {
-                               if (GetWindowRect(GetDlgItem(hPos, IDC_MONITOR),&rectCtl))
-                               {
-                                       movetop=rectCtl.top - rectCtl2.top;
-                                       MoveWindow(GetDlgItem(hPos, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
-                                       if (GetWindowRect(GetDlgItem(hPos, IDC_DISK),&rectCtl))
-                                       {
-                                               MoveWindow(GetDlgItem(hPos, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
-                                       }
-                                       if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBY),&rectCtl))
-                                       {
-                                               MoveWindow(GetDlgItem(hPos, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
-                                       }
-                                       if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATE),&rectCtl))
-                                       {
-                                               MoveWindow(GetDlgItem(hPos, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
-                                       }
-                                       if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORDCLIST),&rectCtl2))
-                                       {
-                                               movetop=movetop-8;
-                                               if (GetWindowRect(GetDlgItem(hPos, IDC_MONITORACLIST),&rectCtl))
-                                               {
-                                                       moveright=rectCtl.right - rectCtl2.right;
-                                                       MoveWindow(GetDlgItem(hPos, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
-                                                       if (GetWindowRect(GetDlgItem(hPos, IDC_DISKACLIST),&rectCtl))
-                                                       {
-                                                               MoveWindow(GetDlgItem(hPos, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
-                                                       }
-                                                       if (GetWindowRect(GetDlgItem(hPos, IDC_STANDBYACLIST),&rectCtl))
-                                                       {
-                                                               MoveWindow(GetDlgItem(hPos, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
-                                                       }
-                                                       if (GetWindowRect(GetDlgItem(hPos, IDC_HYBERNATEACLIST),&rectCtl))
-                                                       {
-                                                               MoveWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
-                                                       }
-                                               }
-                                               if (GetWindowRect(GetDlgItem(hPos, IDC_GRPDETAIL),&rectCtl))
-                                               {
-                                                       MoveWindow(GetDlgItem(hPos, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-*/
+    if (ValidatePowerPolicies(0, pp))
+    {
+        AddPowerScheme((PPOWER_SCHEMES_PAGE_DATA)lParam,
+                       uiIndex,
+                       dwName,
+                       pszName,
+                       dwDesc,
+                       pszDesc,
+                       pp);
+    }
 
-       if (!GetPwrCapabilities(&spc))
-       {
-               return FALSE;
-       }
-
-       if (!spc.SystemBatteriesPresent)
-       {
-               ShowWindow(GetDlgItem(hPos, IDC_SAT),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_IAC),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_SAC),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_IDC),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_SDC),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_MONITORDCLIST),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_DISKDCLIST),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_STANDBYDCLIST),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_HYBERNATEDCLIST),FALSE);
-               ShowWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST), spc.HiberFilePresent);
-
-       }
-       else
-       {
-               ShowWindow(GetDlgItem(hPos, IDC_HYBERNATEDCLIST), spc.HiberFilePresent);
-               ShowWindow(GetDlgItem(hPos, IDC_HYBERNATEACLIST), FALSE);
-       }
-
-
-       if (!(spc.SystemS1 ||spc.SystemS2 || spc.SystemS3))
-       {
-               ShowWindow(GetDlgItem(hPos, IDC_STANDBYACLIST), TRUE);
-               ShowWindow(GetDlgItem(hPos, IDC_STANDBYDCLIST), TRUE);
-               ShowWindow(GetDlgItem(hPos, IDC_STANDBY), TRUE);
-       }
-
-       ShowWindow(GetDlgItem(hPos, IDC_HYBERNATE), spc.HiberFilePresent);
-
-       return TRUE;
+    return TRUE;
 }
 
+static
+VOID
+BuildSchemesList(
+    PPOWER_SCHEMES_PAGE_DATA pPageData)
+{
+    InitializeListHead(&pPageData->PowerSchemesList);
 
-static VOID
-LoadConfig(HWND hwndDlg)
+    EnumPwrSchemes(EnumPowerSchemeCallback, (LPARAM)pPageData);
+}
+
+
+static
+VOID
+DestroySchemesList(
+    PPOWER_SCHEMES_PAGE_DATA pPageData)
+{
+    PLIST_ENTRY ListEntry;
+    PPOWER_SCHEME pScheme;
+
+    while (!IsListEmpty(&pPageData->PowerSchemesList))
+    {
+        ListEntry = pPageData->PowerSchemesList.Flink;
+        pScheme = CONTAINING_RECORD(ListEntry, POWER_SCHEME, ListEntry);
+        DeletePowerScheme(pScheme);
+    }
+
+    pPageData->pActivePowerScheme = NULL;
+}
+
+
+BOOLEAN
+Pos_InitData(
+    HWND hwndDlg)
 {
-       INT i=0, iCurSel=0;
-       UINT uiIndex;
-       TCHAR szProfile[MAX_PATH];
-       TCHAR szTemp[MAX_PATH];
-       TCHAR szConfig[MAX_PATH];
-       POWER_POLICY pp;
-
-       iCurSel = (INT)SendDlgItemMessage(hwndDlg, IDC_ENERGYLIST,
-               CB_GETCURSEL,
-               0,
-               0);
-       if (iCurSel == CB_ERR)
-               return;
-
-       memcpy(&pp, &gPP[iCurSel], sizeof(POWER_POLICY));
-
-       uiIndex = (UINT)SendDlgItemMessage(hwndDlg, IDC_ENERGYLIST, CB_GETCURSEL, 0, 0);
-       if(uiIndex != (UINT)CB_ERR)
-       {
-               SendDlgItemMessage(hwndDlg, IDC_ENERGYLIST, CB_GETLBTEXT, uiIndex, (LPARAM)szProfile);
-               if(LoadString(hApplet, IDS_CONFIG1, szTemp, MAX_PATH))
-               {
-                       _stprintf(szConfig,szTemp,szProfile);
-                       SetWindowText(GetDlgItem(hwndDlg, IDC_GRPDETAIL),szConfig);
-               }
-       }
-
-       for(i=0;i<16;i++)
-       {
-               if (Sec[i]==pp.user.VideoTimeoutAc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_MONITORACLIST,
-                                           CB_SETCURSEL,
-                                               i,
-                                               (LPARAM)0);
-               }
-
-               if (Sec[i]==pp.user.VideoTimeoutDc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_MONITORDCLIST,
-                                           CB_SETCURSEL,
-                                                i,
-                                                (LPARAM)0);
-               }
-               if (Sec[i]==pp.user.SpindownTimeoutAc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_DISKACLIST,
-                                          CB_SETCURSEL,
-                                          i-2,
-                                          (LPARAM)0);
-               }
-               if (Sec[i]==pp.user.SpindownTimeoutDc) // IdleTimeoutDc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_DISKDCLIST,
-                                          CB_SETCURSEL,
-                                          i-2,
-                                          (LPARAM)0);
-               }
-               if (Sec[i]==pp.user.IdleTimeoutAc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_STANDBYACLIST,
-                                          CB_SETCURSEL,
-                                          i,
-                                          (LPARAM)0);
-               }
-               if (Sec[i]==pp.user.IdleTimeoutDc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_STANDBYDCLIST,
-                                          CB_SETCURSEL,
-                                          i,
-                                          (LPARAM)0);
-               }
-
-               if (Sec[i]==pp.mach.DozeS4TimeoutAc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_HYBERNATEACLIST,
-                                          CB_SETCURSEL,
-                                          i,
-                                       (LPARAM)0);
-               }
-               if (Sec[i]==pp.mach.DozeS4TimeoutDc)
-               {
-                       SendDlgItemMessage(hwndDlg, IDC_HYBERNATEDCLIST,
-                                          CB_SETCURSEL,
-                                          i,
-                                          (LPARAM)0);
-               }
-       }
+    SYSTEM_POWER_CAPABILITIES spc;
+/*
+    RECT rectCtl, rectDlg, rectCtl2;
+    LONG movetop = 0;
+    LONG moveright = 0;
+
+    if (GetWindowRect(hwndDlg,&rectDlg))
+        {
+            if (GetWindowRect(GetDlgItem(hwndDlg, IDC_SAT),&rectCtl2))
+            {
+                if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITOR),&rectCtl))
+                {
+                    movetop=rectCtl.top - rectCtl2.top;
+                    MoveWindow(GetDlgItem(hwndDlg, IDC_MONITOR),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
+                    if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISK),&rectCtl))
+                    {
+                        MoveWindow(GetDlgItem(hwndDlg, IDC_DISK),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
+                    }
+                    if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBY),&rectCtl))
+                    {
+                        MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBY),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
+                    }
+                    if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HYBERNATE),&rectCtl))
+                    {
+                        MoveWindow(GetDlgItem(hwndDlg, IDC_HYBERNATE),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
+                    }
+                    if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORDCLIST),&rectCtl2))
+                    {
+                        movetop=movetop-8;
+                        if (GetWindowRect(GetDlgItem(hwndDlg, IDC_MONITORACLIST),&rectCtl))
+                        {
+                            moveright=rectCtl.right - rectCtl2.right;
+                            MoveWindow(GetDlgItem(hwndDlg, IDC_MONITORACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
+                            if (GetWindowRect(GetDlgItem(hwndDlg, IDC_DISKACLIST),&rectCtl))
+                            {
+                                MoveWindow(GetDlgItem(hwndDlg, IDC_DISKACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
+                            }
+                            if (GetWindowRect(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),&rectCtl))
+                            {
+                                MoveWindow(GetDlgItem(hwndDlg, IDC_STANDBYACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
+                            }
+                            if (GetWindowRect(GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST),&rectCtl))
+                            {
+                                MoveWindow(GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top-movetop,rectCtl.right-rectCtl.left-moveright,rectCtl.bottom-rectCtl.top,FALSE);
+                            }
+                        }
+                        if (GetWindowRect(GetDlgItem(hwndDlg, IDC_GRPDETAIL),&rectCtl))
+                        {
+                            MoveWindow(GetDlgItem(hwndDlg, IDC_GRPDETAIL),rectCtl.left-rectDlg.left,rectCtl.top-rectDlg.top,rectCtl.right-rectCtl.left,rectCtl.bottom-rectCtl.top,FALSE);
+                        }
+                    }
+                }
+            }
+        }
+    }
+*/
+
+    if (!GetPwrCapabilities(&spc))
+    {
+        return FALSE;
+    }
+
+    if (!spc.SystemBatteriesPresent)
+    {
+        ShowWindow(GetDlgItem(hwndDlg, IDC_SAT), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_IAC), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_SAC), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_IDC), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_SDC), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_MONITORDCLIST), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_DISKDCLIST), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_STANDBYDCLIST), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_HYBERNATEDCLIST), SW_HIDE);
+    }
+
+    if (!(spc.SystemS1 || spc.SystemS2 || spc.SystemS3))
+    {
+        ShowWindow(GetDlgItem(hwndDlg, IDC_STANDBY), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_STANDBYACLIST), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_STANDBYDCLIST), SW_HIDE);
+    }
+
+    if (!spc.HiberFilePresent)
+    {
+        ShowWindow(GetDlgItem(hwndDlg, IDC_HYBERNATE), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST), SW_HIDE);
+        ShowWindow(GetDlgItem(hwndDlg, IDC_HYBERNATEDCLIST), SW_HIDE);
+    }
+
+    return TRUE;
 }
 
 
-BOOLEAN CALLBACK
-callback_EnumPwrScheme(UINT uiIndex, DWORD dwName, LPTSTR sName, DWORD dwDesc,
-                       LPWSTR sDesc, PPOWER_POLICY pp,LPARAM lParam)
+static
+VOID
+LoadConfig(
+    HWND hwndDlg)
 {
-       int index;
-
-       UNREFERENCED_PARAMETER(lParam);
-       UNREFERENCED_PARAMETER(sDesc);
-       UNREFERENCED_PARAMETER(dwDesc);
-       UNREFERENCED_PARAMETER(dwName);
-
-       if (ValidatePowerPolicies(0,pp))
-       {
-               if (guiIndex >= MAX_POWER_POLICY)
-               {
-                       // FIXME:
-                       // Implement store power policy dynamically
-                       return FALSE;
-               }
-
-
-               memcpy(&gPP[guiIndex], pp, sizeof(POWER_POLICY));
-               guiIndex++;
-
-               index = (int) SendMessage(hList,
-                          CB_ADDSTRING,
-                          0,
-                          (LPARAM)sName);
-               if (index == CB_ERR)
-                       return FALSE;
-
-               SendMessage(hList,
-                          CB_SETITEMDATA,
-                          index,
-                          (LPARAM)uiIndex);
-
-               if (aps == uiIndex)
-               {
-                       SendMessage(hList,
-                          CB_SELECTSTRING,
-                          TRUE,
-                          (LPARAM)sName);
-                       LoadConfig(GetParent(hList));
-               }
-       }
-       return TRUE;
+    PPOWER_SCHEME pScheme;
+    INT i = 0, iCurSel = 0;
+    TCHAR szTemp[MAX_PATH];
+    TCHAR szConfig[MAX_PATH];
+    PPOWER_POLICY pp;
+
+    iCurSel = (INT)SendDlgItemMessage(hwndDlg,
+                                      IDC_ENERGYLIST,
+                                      CB_GETCURSEL,
+                                      0,
+                                      0);
+    if (iCurSel == CB_ERR)
+        return;
+
+    pScheme = (PPOWER_SCHEME)SendDlgItemMessage(hwndDlg,
+                                                IDC_ENERGYLIST,
+                                                CB_GETITEMDATA,
+                                                (WPARAM)iCurSel,
+                                                0);
+    if (pScheme == (PPOWER_SCHEME)CB_ERR)
+        return;
+
+    if (LoadString(hApplet, IDS_CONFIG1, szTemp, MAX_PATH))
+    {
+        _stprintf(szConfig, szTemp, pScheme->pszName);
+        SetWindowText(GetDlgItem(hwndDlg, IDC_GRPDETAIL), szConfig);
+    }
+
+    pp = &pScheme->PowerPolicy;
+
+    for (i = 0; i < 16; i++)
+    {
+        if (Sec[i] == pp->user.VideoTimeoutAc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_MONITORACLIST,
+                        CB_SETCURSEL,
+                        i,
+                        (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->user.VideoTimeoutDc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_MONITORDCLIST,
+                        CB_SETCURSEL,
+                         i,
+                         (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->user.SpindownTimeoutAc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_DISKACLIST,
+                       CB_SETCURSEL,
+                       i - 2,
+                       (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->user.SpindownTimeoutDc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_DISKDCLIST,
+                       CB_SETCURSEL,
+                       i - 2,
+                       (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->user.IdleTimeoutAc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_STANDBYACLIST,
+                       CB_SETCURSEL,
+                       i,
+                       (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->user.IdleTimeoutDc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_STANDBYDCLIST,
+                       CB_SETCURSEL,
+                       i,
+                       (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->mach.DozeS4TimeoutAc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_HYBERNATEACLIST,
+                       CB_SETCURSEL,
+                       i,
+                    (LPARAM)0);
+        }
+
+        if (Sec[i] == pp->mach.DozeS4TimeoutDc)
+        {
+            SendDlgItemMessage(hwndDlg, IDC_HYBERNATEDCLIST,
+                       CB_SETCURSEL,
+                       i,
+                       (LPARAM)0);
+        }
+    }
 }
 
 
 static VOID
 Pos_InitPage(HWND hwndDlg)
 {
-       int ifrom=0,i=0,imin=0;
-       HWND hwnd = NULL;
-       TCHAR szName[MAX_PATH];
-       LRESULT index;
-
-       for(i=1;i<9;i++)
-       {
-               switch(i)
-               {
-               case 1:
-                       hwnd=GetDlgItem(hwndDlg, IDC_MONITORACLIST);
-                       imin=IDS_TIMEOUT1;
-                       break;
-               case 2:
-                       hwnd=GetDlgItem(hwndDlg, IDC_STANDBYACLIST);
-                       imin=IDS_TIMEOUT1;
-                       break;
-               case 3:
-                       hwnd=GetDlgItem(hwndDlg, IDC_DISKACLIST);
-                       imin=IDS_TIMEOUT3;
-                       break;
-               case 4:
-                       hwnd=GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST);
-                       imin=IDS_TIMEOUT3;
-                       break;
-               case 5:
-                       hwnd=GetDlgItem(hwndDlg, IDC_MONITORDCLIST);
-                       imin=IDS_TIMEOUT1;
-                       break;
-               case 6:
-                       hwnd=GetDlgItem(hwndDlg, IDC_STANDBYDCLIST);
-                       imin=IDS_TIMEOUT1;
-                       break;
-               case 7:
-                       hwnd=GetDlgItem(hwndDlg, IDC_DISKDCLIST);
-                       imin=IDS_TIMEOUT3;
-                       break;
-               case 8:
-                       hwnd=GetDlgItem(hwndDlg, IDC_HYBERNATEDCLIST);
-                       imin=IDS_TIMEOUT3;
-                       break;
-               default:
-                       return;
-               }
-               for (ifrom=imin;ifrom<(IDS_TIMEOUT15+1);ifrom++)
-               {
-                       if (LoadString(hApplet, ifrom, szName, MAX_PATH))
-                       {
-                               index = SendMessage(hwnd,
-                                                                        CB_ADDSTRING,
-                                                                        0,
-                                                                       (LPARAM)szName);
-
-                               if (index == CB_ERR)
-                                       return;
-
-                               SendMessage(hwnd,
-                                                        CB_SETITEMDATA,
-                                                        index,
-                                                        (LPARAM)Sec[ifrom-IDS_TIMEOUT16]);
-                       }
-               }
-               if (LoadString(hApplet, IDS_TIMEOUT16, szName, MAX_PATH))
-               {
-                       index = SendMessage(hwnd,
-                                                                CB_ADDSTRING,
-                                                                0,
-                                                                (LPARAM)szName);
-                       if (index == CB_ERR)
-                               return;
-
-                       SendMessage(hwnd,
-                                            CB_SETITEMDATA,
-                                                index,
-                                                (LPARAM)Sec[0]);
-               }
-       }
+    int ifrom = 0, i = 0, imin = 0;
+    HWND hwnd = NULL;
+    TCHAR szName[MAX_PATH];
+    LRESULT index;
+
+    for (i = 1; i < 9; i++)
+    {
+        switch (i)
+        {
+            case 1:
+                hwnd = GetDlgItem(hwndDlg, IDC_MONITORACLIST);
+                imin = IDS_TIMEOUT1;
+                break;
+
+            case 2:
+                hwnd = GetDlgItem(hwndDlg, IDC_STANDBYACLIST);
+                imin = IDS_TIMEOUT1;
+                break;
+
+            case 3:
+                hwnd = GetDlgItem(hwndDlg, IDC_DISKACLIST);
+                imin = IDS_TIMEOUT3;
+                break;
+
+            case 4:
+                hwnd = GetDlgItem(hwndDlg, IDC_HYBERNATEACLIST);
+                imin = IDS_TIMEOUT3;
+                break;
+
+            case 5:
+                hwnd = GetDlgItem(hwndDlg, IDC_MONITORDCLIST);
+                imin = IDS_TIMEOUT1;
+                break;
+
+            case 6:
+                hwnd = GetDlgItem(hwndDlg, IDC_STANDBYDCLIST);
+                imin = IDS_TIMEOUT1;
+                break;
+
+            case 7:
+                hwnd = GetDlgItem(hwndDlg, IDC_DISKDCLIST);
+                imin = IDS_TIMEOUT3;
+                break;
+
+            case 8:
+                hwnd = GetDlgItem(hwndDlg, IDC_HYBERNATEDCLIST);
+                imin = IDS_TIMEOUT3;
+                break;
+
+            default:
+                return;
+        }
+
+        for (ifrom = imin; ifrom < (IDS_TIMEOUT15 + 1); ifrom++)
+        {
+            if (LoadString(hApplet, ifrom, szName, MAX_PATH))
+            {
+                index = SendMessage(hwnd,
+                                     CB_ADDSTRING,
+                                     0,
+                                    (LPARAM)szName);
+                if (index == CB_ERR)
+                    return;
+
+                SendMessage(hwnd,
+                             CB_SETITEMDATA,
+                             index,
+                             (LPARAM)Sec[ifrom - IDS_TIMEOUT16]);
+            }
+        }
+
+        if (LoadString(hApplet, IDS_TIMEOUT16, szName, MAX_PATH))
+        {
+            index = SendMessage(hwnd,
+                                 CB_ADDSTRING,
+                                 0,
+                                 (LPARAM)szName);
+            if (index == CB_ERR)
+                return;
+
+            SendMessage(hwnd,
+                         CB_SETITEMDATA,
+                         index,
+                         (LPARAM)Sec[0]);
+        }
+    }
 }
 
 
 static VOID
 Pos_SaveData(HWND hwndDlg)
 {
-       INT iCurSel=0,tmp=0;
-
-       iCurSel = (INT) SendDlgItemMessage(hwndDlg, IDC_ENERGYLIST,
-               CB_GETCURSEL,
-               0,
-               0);
-       if (iCurSel == CB_ERR)
-               return;
-
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_MONITORDCLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.VideoTimeoutAc = Sec[tmp];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_MONITORDCLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.VideoTimeoutDc = Sec[tmp];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_DISKACLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.SpindownTimeoutAc = Sec[tmp+2];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_DISKDCLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.SpindownTimeoutDc = Sec[tmp+2];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_STANDBYACLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.IdleTimeoutAc = Sec[tmp];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_STANDBYDCLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].user.IdleTimeoutDc = Sec[tmp];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_HYBERNATEACLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].mach.DozeS4TimeoutAc = Sec[tmp];
-       }
-    tmp = (INT) SendDlgItemMessage(hwndDlg, IDC_HYBERNATEDCLIST,
-                                  CB_GETCURSEL,
-                                  0,
-                                  (LPARAM)0);
-       if (tmp > 0 && tmp < 16)
-       {
-               gPP[iCurSel].mach.DozeS4TimeoutDc = Sec[tmp];
-       }
-
-    SetActivePwrScheme(iCurSel,NULL,&gPP[iCurSel]);
-       LoadConfig(hwndDlg);
+    PPOWER_SCHEME pScheme;
+    INT iCurSel, tmp;
+
+    iCurSel = (INT)SendDlgItemMessage(hwndDlg,
+                                      IDC_ENERGYLIST,
+                                      CB_GETCURSEL,
+                                      0,
+                                      0);
+    if (iCurSel == CB_ERR)
+        return;
+
+    pScheme = (PPOWER_SCHEME)SendDlgItemMessage(hwndDlg,
+                                                IDC_ENERGYLIST,
+                                                CB_GETITEMDATA,
+                                                (WPARAM)iCurSel,
+                                                0);
+    if (pScheme == (PPOWER_SCHEME)CB_ERR)
+        return;
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_MONITORACLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.VideoTimeoutAc = Sec[tmp];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_MONITORDCLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.VideoTimeoutDc = Sec[tmp];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_DISKACLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.SpindownTimeoutAc = Sec[tmp + 2];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_DISKDCLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.SpindownTimeoutDc = Sec[tmp + 2];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_STANDBYACLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.IdleTimeoutAc = Sec[tmp];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_STANDBYDCLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.user.IdleTimeoutDc = Sec[tmp];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_HYBERNATEACLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.mach.DozeS4TimeoutAc = Sec[tmp];
+    }
+
+    tmp = (INT)SendDlgItemMessage(hwndDlg, IDC_HYBERNATEDCLIST,
+                   CB_GETCURSEL,
+                   0,
+                   (LPARAM)0);
+    if (tmp > 0 && tmp < 16)
+    {
+        pScheme->PowerPolicy.mach.DozeS4TimeoutDc = Sec[tmp];
+    }
+
+    SetActivePwrScheme(iCurSel, NULL, &pScheme->PowerPolicy);
+    LoadConfig(hwndDlg);
 }
 
 
-static BOOLEAN
+static BOOL
 DelScheme(HWND hwnd)
 {
-       INT iCurSel;
-       HWND hList;
-       TCHAR szBuf[1024], szBufT[1024];
-       UINT DelScheme;
-
-       hList = GetDlgItem(hwnd, IDC_ENERGYLIST);
+    INT iCurSel;
+    HWND hList;
+    TCHAR szBuf[1024], szBufT[1024];
+    PPOWER_SCHEME pScheme;
 
-       iCurSel = SendMessage(hList, CB_GETCURSEL, 0, 0);
-       if (iCurSel == CB_ERR) return FALSE;
+    hList = GetDlgItem(hwnd, IDC_ENERGYLIST);
 
-       SendMessage(hList, CB_SETCURSEL, iCurSel, 0);
+    iCurSel = SendMessage(hList, CB_GETCURSEL, 0, 0);
+    if (iCurSel == CB_ERR)
+        return FALSE;
 
-       DelScheme = SendMessage(hList, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
-       if (DelScheme == (UINT)CB_ERR) return FALSE;
+    SendMessage(hList, CB_SETCURSEL, iCurSel, 0);
 
-       LoadString(hApplet, IDS_DEL_SCHEME_TITLE, szBufT, sizeof(szBufT) / sizeof(TCHAR));
-       LoadString(hApplet, IDS_DEL_SCHEME, szBuf, sizeof(szBuf) / sizeof(TCHAR));
+    pScheme = (PPOWER_SCHEME)SendMessage(hList, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
+    if (pScheme == (PPOWER_SCHEME)CB_ERR)
+        return FALSE;
 
-       if (MessageBox(hwnd, szBuf, szBufT, MB_YESNO | MB_ICONQUESTION) == IDYES)
-       {
-               UINT Current;
+    LoadString(hApplet, IDS_DEL_SCHEME_TITLE, szBufT, sizeof(szBufT) / sizeof(TCHAR));
+    LoadString(hApplet, IDS_DEL_SCHEME, szBuf, sizeof(szBuf) / sizeof(TCHAR));
 
-               if (GetActivePwrScheme(&Current))
-               {
-                       SendMessage(hList, CB_SETCURSEL, (WPARAM)0, 0);
-                       SendMessage(hList, CB_DELETESTRING, (WPARAM)iCurSel, 0);
-                       if (Current == DelScheme) Pos_SaveData(hwnd);
-               }
-
-               if (DeletePwrScheme(DelScheme) != 0) return TRUE;
-       }
+    if (MessageBox(hwnd, szBuf, szBufT, MB_YESNO | MB_ICONQUESTION) == IDYES)
+    {
+        UINT Current;
+
+        if (GetActivePwrScheme(&Current))
+        {
+            SendMessage(hList, CB_SETCURSEL, (WPARAM)0, 0);
+            SendMessage(hList, CB_DELETESTRING, (WPARAM)iCurSel, 0);
+            if (Current == pScheme->uId)
+                Pos_SaveData(hwnd);
+        }
+
+        if (DeletePwrScheme(pScheme->uId) != 0)
+            return TRUE;
+    }
 
-       return FALSE;
+    return FALSE;
 }
 
 
-static BOOLEAN
-CreateEnergyList(HWND hwnd)
+static BOOL
+CreateEnergyList(
+    HWND hwndDlg,
+    PPOWER_SCHEMES_PAGE_DATA pPageData)
 {
-       BOOLEAN retval;
-       POWER_POLICY pp;
-       SYSTEM_POWER_CAPABILITIES spc;
+    PLIST_ENTRY ListEntry;
+    PPOWER_SCHEME pScheme;
+    INT index;
+    POWER_POLICY pp;
+    SYSTEM_POWER_CAPABILITIES spc;
+    HWND hwndList;
+    unsigned aps = 0;
 
-       hList = hwnd;
+    hwndList = GetDlgItem(hwndDlg, IDC_ENERGYLIST);
 
-       if (!GetActivePwrScheme(&aps))
-               return FALSE;
+    if (!GetActivePwrScheme(&aps))
+        return FALSE;
 
-       if (!ReadGlobalPwrPolicy(&gGPP))
-               return FALSE;
+    if (!ReadGlobalPwrPolicy(&gGPP))
+        return FALSE;
 
-       if (!ReadPwrScheme(aps,&pp))
-               return FALSE;
+    if (!ReadPwrScheme(aps, &pp))
+        return FALSE;
 
-       if (!ValidatePowerPolicies(&gGPP,0))
-               return FALSE;
+    if (!ValidatePowerPolicies(&gGPP, 0))
+        return FALSE;
 
 /*
-       if (!SetActivePwrScheme(aps,&gGPP,&pp))
-               return FALSE;
+    if (!SetActivePwrScheme(aps, &gGPP, &pp))
+        return FALSE;
 */
 
-       if (!GetPwrCapabilities(&spc))
-               return FALSE;
+    if (!GetPwrCapabilities(&spc))
+        return FALSE;
 
-       if (CanUserWritePwrScheme())
-       {
-               // TODO:
-               // Enable write / delete powerscheme button
-       }
+    if (CanUserWritePwrScheme())
+    {
+        // TODO:
+        // Enable write / delete powerscheme button
+    }
 
-       Pos_InitPage(GetParent(hwnd));
+    Pos_InitPage(hwndDlg);
 
-       if (!GetActivePwrScheme(&aps))
-               return FALSE;
+    if (!GetActivePwrScheme(&aps))
+        return FALSE;
 
-       retval = EnumPwrSchemes(callback_EnumPwrScheme, aps);
+    ListEntry = pPageData->PowerSchemesList.Flink;
+    while (ListEntry != &pPageData->PowerSchemesList)
+    {
+        pScheme = CONTAINING_RECORD(ListEntry, POWER_SCHEME, ListEntry);
+
+        index = (int)SendMessage(hwndList,
+                                 CB_ADDSTRING,
+                                 0,
+                                 (LPARAM)pScheme->pszName);
+        if (index == CB_ERR)
+            break;
+
+        SendMessage(hwndList,
+                    CB_SETITEMDATA,
+                    index,
+                    (LPARAM)pScheme);
+
+        if (aps == pScheme->uId)
+        {
+            SendMessage(hwndList,
+                        CB_SELECTSTRING,
+                        TRUE,
+                        (LPARAM)pScheme->pszName);
+
+            LoadConfig(hwndDlg);
+        }
+
+        ListEntry = ListEntry->Flink;
+    }
 
-    if(SendMessage(hwnd, CB_GETCOUNT, 0, 0) > 0)
+    if (SendMessage(hwndList, CB_GETCOUNT, 0, 0) > 0)
     {
-        EnableWindow(GetDlgItem(hwndDialog, IDC_DELETE_BTN),TRUE);
-               EnableWindow(GetDlgItem(hwndDialog, IDC_SAVEAS_BTN),TRUE);
+        EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE_BTN), TRUE);
+        EnableWindow(GetDlgItem(hwndDlg, IDC_SAVEAS_BTN), TRUE);
     }
 
-       return retval;
+    return TRUE;
 }
 
 
 /* Property page dialog callback */
 INT_PTR CALLBACK
 PowerSchemesDlgProc(
-  HWND hwndDlg,
-  UINT uMsg,
-  WPARAM wParam,
-  LPARAM lParam
-)
+    HWND hwndDlg,
+    UINT uMsg,
+    WPARAM wParam,
+    LPARAM lParam)
 {
-  switch(uMsg)
-  {
-    case WM_INITDIALOG:
-               hPos = hwndDlg;
-               hwndDialog = hwndDlg;
-           if (!Pos_InitData())
-               {
-                       // TODO:
-                       // Initialization failed
-                       // Handle error
-                       MessageBox(hwndDlg,_T("Pos_InitData failed\n"), NULL, MB_OK);
-
-               }
-               if (!CreateEnergyList(GetDlgItem(hwndDlg, IDC_ENERGYLIST)))
-               {
-                       // TODO:
-                       // Initialization failed
-                       // Handle error
-                       MessageBox(hwndDlg,_T("CreateEnergyList failed\n"), NULL, MB_OK);
-               }
-               return TRUE;
-       case WM_COMMAND:
-               switch(LOWORD(wParam))
-               {
-               case IDC_ENERGYLIST:
-                       if (HIWORD(wParam) == CBN_SELCHANGE)
-                       {
-                               LoadConfig(hwndDlg);
-                               PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
-                       }
-                       break;
-               case IDC_DELETE_BTN:
-               {
-                       DelScheme(hwndDlg);
-               }
-               break;
-               case IDC_SAVEAS_BTN:
-               {
-
-               }
-               break;
-               case IDC_MONITORACLIST:
-               case IDC_MONITORDCLIST:
-               case IDC_DISKACLIST:
-               case IDC_DISKDCLIST:
-               case IDC_STANDBYACLIST:
-               case IDC_STANDBYDCLIST:
-               case IDC_HYBERNATEACLIST:
-               case IDC_HYBERNATEDCLIST:
-                       if (HIWORD(wParam) == CBN_SELCHANGE)
-                       {
-                               PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
-                       }
-                       break;
-               }
-               break;
-       case WM_NOTIFY:
-               {
-                       LPNMHDR lpnm = (LPNMHDR)lParam;
-                       if (lpnm->code == (UINT)PSN_APPLY)
-                       {
-                               Pos_SaveData(hwndDlg);
-                       }
-                       return TRUE;
-               }
-               break;
-  }
-  return FALSE;
+    PPOWER_SCHEMES_PAGE_DATA pPageData;
+
+    pPageData = (PPOWER_SCHEMES_PAGE_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
+
+    switch (uMsg)
+    {
+        case WM_INITDIALOG:
+            pPageData = (PPOWER_SCHEMES_PAGE_DATA)HeapAlloc(GetProcessHeap(),
+                                                            0,
+                                                            sizeof(PPOWER_SCHEMES_PAGE_DATA));
+            SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pPageData);
+
+            BuildSchemesList(pPageData);
+
+            if (!Pos_InitData(hwndDlg))
+            {
+                // TODO:
+                // Initialization failed
+                // Handle error
+                MessageBox(hwndDlg,_T("Pos_InitData failed\n"), NULL, MB_OK);
+            }
+
+            if (!CreateEnergyList(hwndDlg, pPageData))
+            {
+                // TODO:
+                // Initialization failed
+                // Handle error
+                MessageBox(hwndDlg,_T("CreateEnergyList failed\n"), NULL, MB_OK);
+            }
+            return TRUE;
+
+        case WM_DESTROY:
+            if (pPageData)
+            {
+                DestroySchemesList(pPageData);
+                HeapFree(GetProcessHeap(), 0, pPageData);
+                SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL);
+            }
+            break;
+
+        case WM_COMMAND:
+            switch(LOWORD(wParam))
+            {
+                case IDC_ENERGYLIST:
+                    if (HIWORD(wParam) == CBN_SELCHANGE)
+                    {
+                        LoadConfig(hwndDlg);
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                    break;
+
+                case IDC_DELETE_BTN:
+                    DelScheme(hwndDlg);
+                    break;
+
+                case IDC_SAVEAS_BTN:
+                    break;
+
+                case IDC_MONITORACLIST:
+                case IDC_MONITORDCLIST:
+                case IDC_DISKACLIST:
+                case IDC_DISKDCLIST:
+                case IDC_STANDBYACLIST:
+                case IDC_STANDBYDCLIST:
+                case IDC_HYBERNATEACLIST:
+                case IDC_HYBERNATEDCLIST:
+                    if (HIWORD(wParam) == CBN_SELCHANGE)
+                    {
+                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+                    }
+                    break;
+            }
+            break;
+
+        case WM_NOTIFY:
+            {
+                LPNMHDR lpnm = (LPNMHDR)lParam;
+                if (lpnm->code == (UINT)PSN_APPLY)
+                {
+                    Pos_SaveData(hwndDlg);
+                }
+                return TRUE;
+            }
+            break;
+    }
+
+    return FALSE;
 }