[CPL] Do not enable the "Apply" button unconditionally (#1876)
[reactos.git] / dll / cpl / wined3dcfg / general.c
index 1046494..b7a1782 100644 (file)
 
 #include <winreg.h>
 
-static LONG ReadSetting(HKEY hKey, PWCHAR szKey, PWCHAR szBuffer, DWORD dwSize)
+WINED3D_SETTINGS gwd3dsShaderLvl[] =
 {
-    return RegQueryValueExW(hKey, szKey, NULL, NULL, (LPBYTE)szBuffer, &dwSize);
-}
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {L"1.4", REG_DWORD, 1},
+    {L"2", REG_DWORD, 2},
+    {L"3", REG_DWORD, 3},
+};
 
-static VOID SaveSetting(HKEY hKey, PWCHAR szKey, PWCHAR szState)
+WINED3D_SETTINGS gwd3dsDisable[] =
 {
-    RegSetValueExW(hKey, szKey, 0, REG_SZ, (LPBYTE)szState, (wcslen(szState) + 1) * sizeof(WCHAR));
-}
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {VALUE_DISABLED, REG_SZ, 0}
+};
 
-static VOID InitSettings(HWND hWndDlg)
+WINED3D_SETTINGS gwd3dsEnable[] =
 {
-    HKEY hKey;
-    WCHAR szBuffer[MAX_KEY_LENGTH];
-    DWORD dwSize = MAX_KEY_LENGTH;
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {VALUE_ENABLED, REG_SZ, 0}
+};
 
-    if (RegOpenKeyExW(HKEY_CURRENT_USER,
-                      KEY_WINE,
-                      0,
-                      KEY_READ,
-                      &hKey) != ERROR_SUCCESS)
-    {
-        return;
-    }
+WINED3D_SETTINGS gwd3dsOffscreen[] =
+{
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {VALUE_BACKBUFFER, REG_SZ, 0},
+    {VALUE_FBO, REG_SZ, 0}
+};
 
-    if(ReadSetting(hKey, KEY_GLSL, szBuffer, dwSize) == ERROR_SUCCESS)
-        CheckDlgButton(hWndDlg, IDC_GLSL, (wcscmp(VALUE_DISABLED, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
+WINED3D_SETTINGS gwd3dsVidMem[] =
+{
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {L"8 MB", REG_SZ, 8},
+    {L"16 MB", REG_SZ, 16},
+    {L"32 MB", REG_SZ, 32},
+    {L"64 MB", REG_SZ, 64},
+    {L"128 MB", REG_SZ, 128},
+    {L"256 MB", REG_SZ, 256},
+    {L"512 MB", REG_SZ, 512},
+};
+
+WINED3D_SETTINGS gwd3dsDdRender[] =
+{
+    {VALUE_DEFAULT, REG_NONE, 0},
+    {VALUE_GDI, REG_SZ, 0}
+};
 
-    if(ReadSetting(hKey, KEY_MULTISAMPLING, szBuffer, dwSize) == ERROR_SUCCESS)
-        CheckDlgButton(hWndDlg, IDC_MULTISAMPLING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
 
-    if(ReadSetting(hKey, KEY_PIXELSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
-        CheckDlgButton(hWndDlg, IDC_PIXELSHADERS, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
+void InitControl(HWND hWndDlg, HKEY hKey, PWCHAR szKey, PWINED3D_SETTINGS pSettings, INT iControlId, INT iCount)
+{
+    WCHAR szBuffer[MAX_KEY_LENGTH];
+    DWORD dwSize = sizeof(szBuffer);
+    DWORD dwType = 0;
+    INT iCurrent;
+    INT iActive = 0;
 
-    if(ReadSetting(hKey, KEY_STRICTDRAWORDERING, szBuffer, dwSize) == ERROR_SUCCESS)
-        CheckDlgButton(hWndDlg, IDC_STRICTDRAWORDERING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
+    RegQueryValueExW(hKey, szKey, NULL, &dwType, (LPBYTE)szBuffer, &dwSize);
 
-    if(ReadSetting(hKey, KEY_VERTEXSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
-        CheckDlgButton(hWndDlg, IDC_VERTEXSHADERS, (wcscmp(VALUE_NONE, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
+    for(iCurrent = 0; iCurrent < iCount; iCurrent++)
+    {
+        SendDlgItemMessageW(hWndDlg, iControlId, CB_ADDSTRING, 0, (LPARAM)pSettings[iCurrent].szValue);
 
-    SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_FBO);
-    SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_BACKBUFFER);
+        if(dwSize && ((dwType == REG_DWORD && *szBuffer == pSettings[iCurrent].iValue) ||
+           (dwType == REG_SZ && !wcscmp(szBuffer, pSettings[iCurrent].szValue))))
+        {
+            iActive = iCurrent;
+        }
+    }
 
-    SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_FBO, (LPARAM)ITEM_FBO);
-    SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_BACKBUFFER, (LPARAM)ITEM_BACKBUFFER);
+    SendDlgItemMessageW(hWndDlg, iControlId, CB_SETCURSEL, iActive, 0);
 
-    if(ReadSetting(hKey, KEY_OFFSCREEN, szBuffer, dwSize) == ERROR_SUCCESS && !wcscmp(VALUE_BACKBUFFER, szBuffer))
-        SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 1, 0);
-    else
-        SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 0, 0);
+}
 
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READTEX);
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READDRAW);
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_DISABLED);
+static VOID InitSettings(HWND hWndDlg)
+{
+    HKEY hKey;
 
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READTEX, (LPARAM)ITEM_READTEX);
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READDRAW, (LPARAM)ITEM_READDRAW);
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_DISABLED, (LPARAM)ITEM_DISABLED);
+    if (RegCreateKeyExW(HKEY_CURRENT_USER, KEY_WINE, 0, NULL, 0, MAXIMUM_ALLOWED, NULL, &hKey, NULL) != ERROR_SUCCESS)
+        return;
 
-    SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 0, 0);
-
-    if(ReadSetting(hKey, KEY_LOCKING, szBuffer, dwSize) == ERROR_SUCCESS)
-    {
-        if(!wcscmp(VALUE_READDRAW, szBuffer))
-            SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 1, 0);
-        else if(!wcscmp(VALUE_DISABLED, szBuffer))
-            SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 2, 0);
-    }
+    INIT_CONTROL(GLSL, gwd3dsDisable);
+    INIT_CONTROL(OFFSCREEN, gwd3dsOffscreen);
+    INIT_CONTROL(VIDMEMSIZE, gwd3dsVidMem);
+    INIT_CONTROL(MULTISAMPLING, gwd3dsDisable);
+    INIT_CONTROL(STRICTDRAWORDERING, gwd3dsEnable);
+    INIT_CONTROL(ALWAYSOFFSCREEN, gwd3dsEnable);
+    INIT_CONTROL(DDRENDERER, gwd3dsDdRender);
+    INIT_CONTROL(PSLEVEL, gwd3dsShaderLvl);
+    INIT_CONTROL(VSLEVEL, gwd3dsShaderLvl);
+    INIT_CONTROL(GSLEVEL, gwd3dsShaderLvl);
 
     RegCloseKey(hKey);
 }
 
-static VOID WriteSettings(HWND hWndDlg)
+
+static VOID SaveSetting(HWND hWnd, HKEY hKey, PWCHAR szKey, PWINED3D_SETTINGS pCfg, INT iControlId, INT iCount)
 {
-    HKEY hKey;
-    INT iCurSel;
+    INT iSel = 0;
+
+    iSel = (INT)SendDlgItemMessageW(hWnd, iControlId, CB_GETCURSEL, 0, 0);
 
-    if (RegOpenKeyExW(HKEY_CURRENT_USER,
-                      KEY_WINE,
-                      0,
-                      KEY_WRITE,
-                      &hKey) != ERROR_SUCCESS)
+    if(iSel < 0 || iSel > iCount)
+        return;
+
+    if(pCfg[iSel].iType == REG_NONE)
     {
+        RegDeleteValueW(hKey, szKey);
         return;
     }
 
-    SaveSetting(hKey, KEY_GLSL, (IsDlgButtonChecked(hWndDlg, IDC_GLSL) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
-    SaveSetting(hKey, KEY_MULTISAMPLING, (IsDlgButtonChecked(hWndDlg, IDC_MULTISAMPLING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
-    SaveSetting(hKey, KEY_PIXELSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_PIXELSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
-    SaveSetting(hKey, KEY_STRICTDRAWORDERING, (IsDlgButtonChecked(hWndDlg, IDC_STRICTDRAWORDERING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
-    SaveSetting(hKey, KEY_VERTEXSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_VERTEXSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_NONE);
-
-    iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETCURSEL, 0, 0);
-
-    if(iCurSel != CB_ERR)
+    if(pCfg[iSel].iType == REG_DWORD)
+    {
+        RegSetValueExW(hKey, szKey, 0, REG_DWORD, (LPBYTE)&pCfg[iSel].iValue, sizeof(pCfg[iSel].iValue));
+        return;
+    } else if (pCfg[iSel].iType == REG_SZ)
     {
-        iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
-
-        if(iCurSel == ITEM_READDRAW)
-            SaveSetting(hKey, KEY_LOCKING, VALUE_READDRAW);
-        else if(iCurSel == ITEM_DISABLED)
-            SaveSetting(hKey, KEY_LOCKING, VALUE_DISABLED);
-        else
-            SaveSetting(hKey, KEY_LOCKING, VALUE_READTEX);
+        RegSetValueExW(hKey, szKey, 0, pCfg[iSel].iType, (LPBYTE)pCfg[iSel].szValue, (wcslen(pCfg[iSel].szValue) + 1) * sizeof(WCHAR));
     }
+}
 
-    iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETCURSEL, 0, 0);
 
-    if(iCurSel != CB_ERR)
-    {
-        iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
+static VOID WriteSettings(HWND hWndDlg)
+{
+    HKEY hKey;
 
-        if(iCurSel == ITEM_BACKBUFFER)
-            SaveSetting(hKey, KEY_OFFSCREEN, VALUE_BACKBUFFER);
-        else
-            SaveSetting(hKey, KEY_OFFSCREEN, VALUE_FBO);
-    }
+    if (RegOpenKeyExW(HKEY_CURRENT_USER, KEY_WINE, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
+        return;
+
+    SAVE_CONTROL(GLSL, gwd3dsDisable);
+    SAVE_CONTROL(OFFSCREEN, gwd3dsOffscreen);
+    SAVE_CONTROL(VIDMEMSIZE, gwd3dsVidMem);
+    SAVE_CONTROL(MULTISAMPLING, gwd3dsDisable);
+    SAVE_CONTROL(STRICTDRAWORDERING, gwd3dsEnable);
+    SAVE_CONTROL(ALWAYSOFFSCREEN, gwd3dsEnable);
+    SAVE_CONTROL(DDRENDERER, gwd3dsDdRender);
+    SAVE_CONTROL(PSLEVEL, gwd3dsShaderLvl);
+    SAVE_CONTROL(VSLEVEL, gwd3dsShaderLvl);
+    SAVE_CONTROL(GSLEVEL, gwd3dsShaderLvl);
 
     RegCloseKey(hKey);
 }
@@ -135,20 +154,8 @@ INT_PTR CALLBACK GeneralPageProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM
             return TRUE;
 
         case WM_COMMAND:
-            switch (LOWORD(wParam))
-            {
-                case IDC_GLSL:
-                case IDC_LOCKING:
-                case IDC_MULTISAMPLING:
-                case IDC_OFFSCREEN:
-                case IDC_PIXELSHADERS:
-                case IDC_STRICTDRAWORDERING:
-                case IDC_VERTEXSHADERS:
-                    PropSheet_Changed(GetParent(hWndDlg), hWndDlg);
-                    break;
-                default:
-                    break;
-            }
+            if (LOWORD(wParam) > IDC_MIN && LOWORD(wParam) < IDC_MAX && HIWORD(wParam) == CBN_SELCHANGE)
+                PropSheet_Changed(GetParent(hWndDlg), hWndDlg);
             break;
 
         case WM_NOTIFY: