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