xref: /reactos/dll/cpl/openglcfg/general.c (revision c2c66aff)
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 }
198