Sync to trunk revision 63857.
[reactos.git] / dll / cpl / console / options.c
1 /*
2 * PROJECT: ReactOS Console Configuration DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/console/options.c
5 * PURPOSE: Options dialog
6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7 */
8
9 #include "console.h"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 static void
15 UpdateDialogElements(HWND hwndDlg, PCONSOLE_PROPS pConInfo)
16 {
17 PGUI_CONSOLE_INFO GuiInfo = pConInfo->TerminalInfo.TermInfo;
18 HWND hDlgCtrl;
19
20 /* Update cursor size */
21 if (pConInfo->ci.CursorSize <= 25)
22 {
23 /* Small cursor */
24 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
25 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
26
27 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
28 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
29 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
30 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
31 }
32 else if (pConInfo->ci.CursorSize <= 50)
33 {
34 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
35 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
36
37 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
38 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
39 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
40 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
41 }
42 else /* if (pConInfo->ci.CursorSize <= 100) */
43 {
44 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_LARGE_CURSOR);
45 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
46
47 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_SMALL_CURSOR);
48 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
49 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_MEDIUM_CURSOR);
50 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
51 }
52
53 /* Update num buffers */
54 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_NUM_BUFFER);
55 SendMessage(hDlgCtrl, UDM_SETRANGE, 0, MAKELONG(999, 1));
56 SetDlgItemInt(hwndDlg, IDC_EDIT_NUM_BUFFER, pConInfo->ci.NumberOfHistoryBuffers, FALSE);
57
58 /* Update buffer size */
59 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_BUFFER_SIZE);
60 SendMessage(hDlgCtrl, UDM_SETRANGE, 0, MAKELONG(999, 1));
61 SetDlgItemInt(hwndDlg, IDC_EDIT_BUFFER_SIZE, pConInfo->ci.HistoryBufferSize, FALSE);
62
63 /* Update discard duplicates */
64 CheckDlgButton(hwndDlg, IDC_CHECK_DISCARD_DUPLICATES,
65 pConInfo->ci.HistoryNoDup ? BST_CHECKED : BST_UNCHECKED);
66
67 /* Update full/window screen */
68 if (GuiInfo->FullScreen)
69 {
70 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_FULL);
71 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
72
73 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_WINDOW);
74 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
75 }
76 else
77 {
78 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_WINDOW);
79 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
80
81 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_DISPLAY_FULL);
82 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
83 }
84
85 /* Update quick edit */
86 CheckDlgButton(hwndDlg, IDC_CHECK_QUICK_EDIT,
87 pConInfo->ci.QuickEdit ? BST_CHECKED : BST_UNCHECKED);
88
89 /* Update insert mode */
90 CheckDlgButton(hwndDlg, IDC_CHECK_INSERT_MODE,
91 pConInfo->ci.InsertMode ? BST_CHECKED : BST_UNCHECKED);
92 }
93
94 INT_PTR
95 CALLBACK
96 OptionsProc(HWND hwndDlg,
97 UINT uMsg,
98 WPARAM wParam,
99 LPARAM lParam)
100 {
101 PCONSOLE_PROPS pConInfo;
102 PGUI_CONSOLE_INFO GuiInfo;
103
104 pConInfo = (PCONSOLE_PROPS)GetWindowLongPtr(hwndDlg, DWLP_USER);
105
106 switch (uMsg)
107 {
108 case WM_INITDIALOG:
109 {
110 pConInfo = (PCONSOLE_PROPS)((LPPROPSHEETPAGE)lParam)->lParam;
111 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pConInfo);
112 UpdateDialogElements(hwndDlg, pConInfo);
113 return TRUE;
114 }
115
116 case WM_NOTIFY:
117 {
118 LPNMUPDOWN lpnmud = (LPNMUPDOWN)lParam;
119 LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam;
120
121 // if (!pConInfo) break;
122
123 if (lppsn->hdr.code == UDN_DELTAPOS)
124 {
125 if (lppsn->hdr.idFrom == IDC_UPDOWN_BUFFER_SIZE)
126 {
127 lpnmud->iPos = min(max(lpnmud->iPos + lpnmud->iDelta, 1), 999);
128 pConInfo->ci.HistoryBufferSize = lpnmud->iPos;
129 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
130 }
131 else if (lppsn->hdr.idFrom == IDC_UPDOWN_NUM_BUFFER)
132 {
133 lpnmud->iPos = min(max(lpnmud->iPos + lpnmud->iDelta, 1), 999);
134 pConInfo->ci.NumberOfHistoryBuffers = lpnmud->iPos;
135 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
136 }
137 }
138 else if (lppsn->hdr.code == PSN_APPLY)
139 {
140 if (!pConInfo->AppliedConfig)
141 {
142 return ApplyConsoleInfo(hwndDlg, pConInfo);
143 }
144 else
145 {
146 /* Options have already been applied */
147 SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
148 return TRUE;
149 }
150 }
151 break;
152 }
153
154 case WM_COMMAND:
155 {
156 LRESULT lResult;
157
158 if (!pConInfo) break;
159 GuiInfo = pConInfo->TerminalInfo.TermInfo;
160
161 switch (LOWORD(wParam))
162 {
163 case IDC_RADIO_SMALL_CURSOR:
164 {
165 pConInfo->ci.CursorSize = 25;
166 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
167 break;
168 }
169 case IDC_RADIO_MEDIUM_CURSOR:
170 {
171 pConInfo->ci.CursorSize = 50;
172 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
173 break;
174 }
175 case IDC_RADIO_LARGE_CURSOR:
176 {
177 pConInfo->ci.CursorSize = 100;
178 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
179 break;
180 }
181 case IDC_RADIO_DISPLAY_WINDOW:
182 {
183 GuiInfo->FullScreen = FALSE;
184 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
185 break;
186 }
187 case IDC_RADIO_DISPLAY_FULL:
188 {
189 GuiInfo->FullScreen = TRUE;
190 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
191 break;
192 }
193 case IDC_CHECK_QUICK_EDIT:
194 {
195 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
196 if (lResult == BST_CHECKED)
197 {
198 pConInfo->ci.QuickEdit = FALSE;
199 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
200 }
201 else if (lResult == BST_UNCHECKED)
202 {
203 pConInfo->ci.QuickEdit = TRUE;
204 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
205 }
206 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
207 break;
208 }
209 case IDC_CHECK_INSERT_MODE:
210 {
211 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
212 if (lResult == BST_CHECKED)
213 {
214 pConInfo->ci.InsertMode = FALSE;
215 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
216 }
217 else if (lResult == BST_UNCHECKED)
218 {
219 pConInfo->ci.InsertMode = TRUE;
220 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
221 }
222 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
223 break;
224 }
225 case IDC_CHECK_DISCARD_DUPLICATES:
226 {
227 lResult = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
228 if (lResult == BST_CHECKED)
229 {
230 pConInfo->ci.HistoryNoDup = FALSE;
231 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0);
232 }
233 else if (lResult == BST_UNCHECKED)
234 {
235 pConInfo->ci.HistoryNoDup = TRUE;
236 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
237 }
238 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
239 break;
240 }
241 case IDC_EDIT_BUFFER_SIZE:
242 {
243 if (HIWORD(wParam) == EN_KILLFOCUS)
244 {
245 DWORD sizeBuff;
246
247 sizeBuff = GetDlgItemInt(hwndDlg, IDC_EDIT_BUFFER_SIZE, NULL, FALSE);
248 sizeBuff = min(max(sizeBuff, 1), 999);
249
250 pConInfo->ci.HistoryBufferSize = sizeBuff;
251 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
252 }
253 break;
254 }
255 case IDC_EDIT_NUM_BUFFER:
256 {
257 if (HIWORD(wParam) == EN_KILLFOCUS)
258 {
259 DWORD numBuff;
260
261 numBuff = GetDlgItemInt(hwndDlg, IDC_EDIT_NUM_BUFFER, NULL, FALSE);
262 numBuff = min(max(numBuff, 1), 999);
263
264 pConInfo->ci.NumberOfHistoryBuffers = numBuff;
265 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
266 }
267 break;
268 }
269 default:
270 break;
271 }
272 break;
273 }
274
275 default:
276 break;
277 }
278
279 return FALSE;
280 }