[OPENGLCFG]
[reactos.git] / reactos / dll / cpl / openglcfg / general.c
1 #include "openglcfg.h"
2
3 #include <winreg.h>
4 #include <debug.h>
5
6 static PWCHAR *pOglDrivers = NULL;
7 static DWORD dwNumDrivers = 0;
8
9 static VOID InitSettings(HWND hWndDlg)
10 {
11 HKEY hKeyRenderer;
12 HKEY hKeyDrivers;
13 WCHAR szBuffer[MAX_KEY_LENGTH];
14 WCHAR szBultin[MAX_KEY_LENGTH];
15 WCHAR szDriver[MAX_KEY_LENGTH];
16 DWORD dwType = 0;
17 DWORD dwSize = MAX_KEY_LENGTH;
18
19 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KEY_DRIVERS, 0, KEY_READ, &hKeyDrivers) != ERROR_SUCCESS)
20 return;
21
22 if (RegCreateKeyExW(HKEY_CURRENT_USER, KEY_RENDERER, 0, NULL, 0, MAXIMUM_ALLOWED, NULL, &hKeyRenderer, NULL) != ERROR_SUCCESS)
23 {
24 RegCloseKey(hKeyDrivers);
25 return;
26 }
27
28 LoadString(hApplet, IDS_DEBUG_DNM, (LPTSTR)szBultin, 127);
29 SendDlgItemMessageW(hWndDlg, IDC_DEBUG_OUTPUT, CB_ADDSTRING, 0, (LPARAM)szBultin);
30
31 LoadString(hApplet, IDS_DEBUG_SET, (LPTSTR)szBultin, 127);
32 SendDlgItemMessageW(hWndDlg, IDC_DEBUG_OUTPUT, CB_ADDSTRING, 0, (LPARAM)szBultin);
33
34 LoadString(hApplet, IDS_DEBUG_CLEAR, (LPTSTR)szBultin, 127);
35 SendDlgItemMessageW(hWndDlg, IDC_DEBUG_OUTPUT, CB_ADDSTRING, 0, (LPARAM)szBultin);
36
37 SendDlgItemMessageW(hWndDlg, IDC_DEBUG_OUTPUT, CB_SETCURSEL, 0, 0);
38
39 LoadString(hApplet, IDS_RENDERER_DEFAULT, (LPTSTR)szBultin, 127);
40 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_ADDSTRING, 0, (LPARAM)szBultin);
41
42 LoadString(hApplet, IDS_RENDERER_RSWR, (LPTSTR)szBultin, 127);
43 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_ADDSTRING, 0, (LPARAM)szBultin);
44
45 if (RegQueryValueExW(hKeyRenderer, NULL, NULL, &dwType, (LPBYTE)szDriver, &dwSize) != ERROR_SUCCESS || dwSize == sizeof(WCHAR))
46 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_SETCURSEL, RENDERER_DEFAULT, 0);
47
48 if (dwType == REG_SZ)
49 {
50 DWORD ret;
51 INT iKey;
52
53 if (wcsncmp(szBultin, szDriver, MAX_KEY_LENGTH) == 0)
54 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_SETCURSEL, RENDERER_RSWR, 0);
55
56 ret = RegQueryInfoKeyW(hKeyDrivers, NULL, NULL, NULL, &dwNumDrivers, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
57
58 if (ret != ERROR_SUCCESS || dwNumDrivers <= 0)
59 {
60 RegCloseKey(hKeyDrivers);
61 RegCloseKey(hKeyRenderer);
62 return;
63 }
64
65 pOglDrivers = HeapAlloc(GetProcessHeap(), 0, dwNumDrivers * sizeof(PWCHAR));
66
67 if (!pOglDrivers)
68 dwNumDrivers = 0;
69
70 for (iKey = 0; iKey < dwNumDrivers; iKey++)
71 {
72 dwSize = MAX_KEY_LENGTH;
73 ret = RegEnumKeyEx(hKeyDrivers, iKey, szBuffer, &dwSize, NULL, NULL, NULL, NULL);
74
75 if (ret != ERROR_SUCCESS)
76 break;
77
78 /* Mind the null terminator */
79 dwSize++;
80
81 pOglDrivers[iKey] = HeapAlloc(GetProcessHeap(), 0, dwSize * sizeof(WCHAR));
82
83 if (!pOglDrivers[iKey])
84 break;
85
86 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_ADDSTRING, 0, (LPARAM)szBuffer);
87
88 StringCchCopy(pOglDrivers[iKey], dwSize, szBuffer);
89
90 if (wcsncmp(szBuffer, szDriver, MAX_KEY_LENGTH) == 0)
91 SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_SETCURSEL, iKey + 2, 0);
92 }
93 }
94
95 RegCloseKey(hKeyDrivers);
96 RegCloseKey(hKeyRenderer);
97
98 return;
99 }
100
101 static VOID SaveSettings(HWND hWndDlg)
102 {
103 HKEY hKeyRenderer;
104 HKEY hKeyDebug;
105 INT iSel = 0;
106
107 if (RegOpenKeyExW(HKEY_CURRENT_USER, KEY_RENDERER, 0, KEY_WRITE, &hKeyRenderer) != ERROR_SUCCESS)
108 return;
109
110 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KEY_DEBUG_CHANNEL, 0, KEY_WRITE, &hKeyDebug) == ERROR_SUCCESS)
111 {
112 iSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_DEBUG_OUTPUT, CB_GETCURSEL, 0, 0);
113
114 switch (iSel)
115 {
116 case DEBUG_SET:
117 RegSetValueExW(hKeyDebug, L"DEBUGCHANNEL", 0, REG_SZ, (PBYTE)L"+opengl,+wgl", 13 * sizeof(WCHAR));
118 break;
119
120 case DEBUG_CLEAR:
121 RegSetValueExW(hKeyDebug, L"DEBUGCHANNEL", 0, REG_SZ, (PBYTE)L"", sizeof(WCHAR));
122 break;
123 }
124 RegCloseKey(hKeyDebug);
125 }
126
127 iSel = (INT)SendDlgItemMessageW(hWndDlg, IDC_RENDERER, CB_GETCURSEL, 0, 0);
128
129 switch (iSel)
130 {
131 case CB_ERR:
132 break;
133
134 case RENDERER_DEFAULT:
135 RegSetValueExW(hKeyRenderer, L"", 0, REG_SZ, (PBYTE)L"", sizeof(WCHAR));
136 break;
137
138 case RENDERER_RSWR:
139 {
140 WCHAR szBuffer[MAX_KEY_LENGTH];
141 LoadString(hApplet, IDS_RENDERER_RSWR, (LPTSTR)szBuffer, 127);
142 RegSetValueExW(hKeyRenderer, L"", 0, REG_SZ, (PBYTE)szBuffer, (wcslen(szBuffer) + 1) * sizeof(WCHAR));
143 break;
144 }
145
146 default:
147 {
148 /* Adjustment for DEFAULT and RSWR renderers */
149 iSel -= 2;
150
151 if (iSel >= 0 && iSel <= dwNumDrivers)
152 RegSetValueExW(hKeyRenderer, L"", 0, REG_SZ, (PBYTE)pOglDrivers[iSel], (wcslen(pOglDrivers[iSel]) + 1) * sizeof(WCHAR));
153
154 break;
155 }
156 }
157
158 RegCloseKey(hKeyRenderer);
159 }
160
161
162 INT_PTR CALLBACK GeneralPageProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
163 {
164 LPPSHNOTIFY lppsn;
165
166 switch (uMsg)
167 {
168 case WM_INITDIALOG:
169 InitSettings(hWndDlg);
170 return TRUE;
171
172 case WM_COMMAND:
173 if (LOWORD(wParam) == IDC_RENDERER || IDC_DEBUG_OUTPUT)
174 PropSheet_Changed(GetParent(hWndDlg), hWndDlg);
175 break;
176
177 case WM_NOTIFY:
178 lppsn = (LPPSHNOTIFY)lParam;
179 if (lppsn->hdr.code == PSN_APPLY)
180 {
181 SaveSettings(hWndDlg);
182 return TRUE;
183 }
184 break;
185
186 case WM_DESTROY:
187 {
188 INT iKey;
189 for (iKey = 0; iKey <= dwNumDrivers; iKey++)
190 HeapFree(GetProcessHeap(), 0, pOglDrivers[iKey]);
191
192 HeapFree(GetProcessHeap(), 0, pOglDrivers);
193 }
194 }
195
196 return FALSE;
197 }