* Sync up to trunk HEAD (r62975).
[reactos.git] / dll / cpl / wined3dcfg / general.c
1 #include "wined3dcfg.h"
2
3 #include <winreg.h>
4
5 static LONG ReadSetting(HKEY hKey, PWCHAR szKey, PWCHAR szBuffer, DWORD dwSize)
6 {
7 return RegQueryValueExW(hKey, szKey, NULL, NULL, (LPBYTE)szBuffer, &dwSize);
8 }
9
10 static VOID SaveSetting(HKEY hKey, PWCHAR szKey, PWCHAR szState)
11 {
12 RegSetValueExW(hKey, szKey, 0, REG_SZ, (LPBYTE)szState, (wcslen(szState) + 1) * sizeof(WCHAR));
13 }
14
15 static VOID InitSettings(HWND hWndDlg)
16 {
17 HKEY hKey;
18 WCHAR szBuffer[MAX_KEY_LENGTH];
19 DWORD dwSize = MAX_KEY_LENGTH;
20
21 if (RegOpenKeyExW(HKEY_CURRENT_USER,
22 KEY_WINE,
23 0,
24 KEY_READ,
25 &hKey) != ERROR_SUCCESS)
26 {
27 return;
28 }
29
30 if(ReadSetting(hKey, KEY_GLSL, szBuffer, dwSize) == ERROR_SUCCESS)
31 CheckDlgButton(hWndDlg, IDC_GLSL, (wcscmp(VALUE_DISABLED, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
32
33 if(ReadSetting(hKey, KEY_MULTISAMPLING, szBuffer, dwSize) == ERROR_SUCCESS)
34 CheckDlgButton(hWndDlg, IDC_MULTISAMPLING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
35
36 if(ReadSetting(hKey, KEY_PIXELSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
37 CheckDlgButton(hWndDlg, IDC_PIXELSHADERS, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
38
39 if(ReadSetting(hKey, KEY_STRICTDRAWORDERING, szBuffer, dwSize) == ERROR_SUCCESS)
40 CheckDlgButton(hWndDlg, IDC_STRICTDRAWORDERING, (wcscmp(VALUE_ENABLED, szBuffer) == 0) ? BST_CHECKED : BST_UNCHECKED);
41
42 if(ReadSetting(hKey, KEY_VERTEXSHADERS, szBuffer, dwSize) == ERROR_SUCCESS)
43 CheckDlgButton(hWndDlg, IDC_VERTEXSHADERS, (wcscmp(VALUE_NONE, szBuffer) != 0) ? BST_CHECKED : BST_UNCHECKED);
44
45 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_FBO);
46 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_ADDSTRING, 0, (LPARAM)VALUE_BACKBUFFER);
47
48 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_FBO, (LPARAM)ITEM_FBO);
49 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETITEMDATA, ITEM_BACKBUFFER, (LPARAM)ITEM_BACKBUFFER);
50
51 if(ReadSetting(hKey, KEY_OFFSCREEN, szBuffer, dwSize) == ERROR_SUCCESS && !wcscmp(VALUE_BACKBUFFER, szBuffer))
52 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 1, 0);
53 else
54 SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_SETCURSEL, 0, 0);
55
56 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READTEX);
57 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_READDRAW);
58 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_ADDSTRING, 0, (LPARAM)VALUE_DISABLED);
59
60 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READTEX, (LPARAM)ITEM_READTEX);
61 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_READDRAW, (LPARAM)ITEM_READDRAW);
62 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETITEMDATA, (WPARAM)ITEM_DISABLED, (LPARAM)ITEM_DISABLED);
63
64 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 0, 0);
65
66 if(ReadSetting(hKey, KEY_LOCKING, szBuffer, dwSize) == ERROR_SUCCESS)
67 {
68 if(!wcscmp(VALUE_READDRAW, szBuffer))
69 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 1, 0);
70 else if(!wcscmp(VALUE_DISABLED, szBuffer))
71 SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_SETCURSEL, 2, 0);
72 }
73
74 RegCloseKey(hKey);
75 }
76
77 static VOID WriteSettings(HWND hWndDlg)
78 {
79 HKEY hKey;
80 INT iCurSel;
81
82 if (RegOpenKeyExW(HKEY_CURRENT_USER,
83 KEY_WINE,
84 0,
85 KEY_WRITE,
86 &hKey) != ERROR_SUCCESS)
87 {
88 return;
89 }
90
91 SaveSetting(hKey, KEY_GLSL, (IsDlgButtonChecked(hWndDlg, IDC_GLSL) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
92 SaveSetting(hKey, KEY_MULTISAMPLING, (IsDlgButtonChecked(hWndDlg, IDC_MULTISAMPLING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
93 SaveSetting(hKey, KEY_PIXELSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_PIXELSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
94 SaveSetting(hKey, KEY_STRICTDRAWORDERING, (IsDlgButtonChecked(hWndDlg, IDC_STRICTDRAWORDERING) == BST_CHECKED) ? VALUE_ENABLED : VALUE_DISABLED);
95 SaveSetting(hKey, KEY_VERTEXSHADERS, (IsDlgButtonChecked(hWndDlg, IDC_VERTEXSHADERS) == BST_CHECKED) ? VALUE_ENABLED : VALUE_NONE);
96
97 iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETCURSEL, 0, 0);
98
99 if(iCurSel != CB_ERR)
100 {
101 iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_LOCKING, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
102
103 if(iCurSel == ITEM_READDRAW)
104 SaveSetting(hKey, KEY_LOCKING, VALUE_READDRAW);
105 else if(iCurSel == ITEM_DISABLED)
106 SaveSetting(hKey, KEY_LOCKING, VALUE_DISABLED);
107 else
108 SaveSetting(hKey, KEY_LOCKING, VALUE_READTEX);
109 }
110
111 iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETCURSEL, 0, 0);
112
113 if(iCurSel != CB_ERR)
114 {
115 iCurSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_OFFSCREEN, CB_GETITEMDATA, (WPARAM)iCurSel, 0);
116
117 if(iCurSel == ITEM_BACKBUFFER)
118 SaveSetting(hKey, KEY_OFFSCREEN, VALUE_BACKBUFFER);
119 else
120 SaveSetting(hKey, KEY_OFFSCREEN, VALUE_FBO);
121 }
122
123 RegCloseKey(hKey);
124 }
125
126
127 INT_PTR CALLBACK GeneralPageProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
128 {
129 LPPSHNOTIFY lppsn;
130
131 switch (uMsg)
132 {
133 case WM_INITDIALOG:
134 InitSettings(hWndDlg);
135 return TRUE;
136
137 case WM_COMMAND:
138 switch (LOWORD(wParam))
139 {
140 case IDC_GLSL:
141 case IDC_LOCKING:
142 case IDC_MULTISAMPLING:
143 case IDC_OFFSCREEN:
144 case IDC_PIXELSHADERS:
145 case IDC_STRICTDRAWORDERING:
146 case IDC_VERTEXSHADERS:
147 PropSheet_Changed(GetParent(hWndDlg), hWndDlg);
148 break;
149 default:
150 break;
151 }
152 break;
153
154 case WM_NOTIFY:
155 lppsn = (LPPSHNOTIFY)lParam;
156 if (lppsn->hdr.code == PSN_APPLY)
157 {
158 WriteSettings(hWndDlg);
159 return TRUE;
160 }
161 break;
162 }
163
164 return FALSE;
165 }