Placate a trivial compiler warning.
[u/mdw/putty] / windlg.c
CommitLineData
374330e2 1#include <windows.h>
2#include <commctrl.h>
3#include <commdlg.h>
374330e2 4#include <stdio.h>
5#include <stdlib.h>
b6c680d4 6#include <ctype.h>
71346075 7#include <time.h>
374330e2 8
374330e2 9#include "ssh.h"
bea1ef5f 10#include "putty.h"
8c3cd914 11#include "winstuff.h"
374330e2 12#include "win_res.h"
d5859615 13#include "storage.h"
374330e2 14
9a1291fe 15#ifdef MSVC4
16#define TVINSERTSTRUCT TV_INSERTSTRUCT
17#define TVITEM TV_ITEM
18#define ICON_BIG 1
19#endif
20
c5e9c988 21static char **events = NULL;
22static int nevents = 0, negsize = 0;
23
1cd246bb 24static int readytogo;
c8d7378d 25static int sesslist_has_focus;
70133c0e 26static int requested_help;
1cd246bb 27
ca20bfcf 28static struct prefslist cipherlist;
29
0b4f0bc0 30struct sesslist sesslist; /* exported to window.c */
31
b44b307a 32#define PRINTER_DISABLED_STRING "None (printing disabled)"
33
3da0b1d2 34void force_normal(HWND hwnd)
c9def1b8 35{
a9422f39 36 static int recurse = 0;
c9def1b8 37
38 WINDOWPLACEMENT wp;
39
32874aea 40 if (recurse)
41 return;
c9def1b8 42 recurse = 1;
43
44 wp.length = sizeof(wp);
32874aea 45 if (GetWindowPlacement(hwnd, &wp) && wp.showCmd == SW_SHOWMAXIMIZED) {
c9def1b8 46 wp.showCmd = SW_SHOWNORMAL;
47 SetWindowPlacement(hwnd, &wp);
48 }
49 recurse = 0;
50}
51
32874aea 52static void MyGetDlgItemInt(HWND hwnd, int id, int *result)
53{
374330e2 54 BOOL ok;
55 int n;
32874aea 56 n = GetDlgItemInt(hwnd, id, &ok, FALSE);
374330e2 57 if (ok)
58 *result = n;
59}
60
32874aea 61static void MyGetDlgItemFlt(HWND hwnd, int id, int *result, int scale)
62{
7f4968e6 63 char text[80];
64 BOOL ok;
32874aea 65 ok = GetDlgItemText(hwnd, id, text, sizeof(text) - 1);
7f4968e6 66 if (ok && text[0])
67 *result = (int) (scale * atof(text));
68}
69
32874aea 70static void MySetDlgItemFlt(HWND hwnd, int id, double value)
71{
7f4968e6 72 char text[80];
73 sprintf(text, "%g", value);
32874aea 74 SetDlgItemText(hwnd, id, text);
7f4968e6 75}
76
32874aea 77static int CALLBACK LogProc(HWND hwnd, UINT msg,
78 WPARAM wParam, LPARAM lParam)
79{
374330e2 80 int i;
81
82 switch (msg) {
83 case WM_INITDIALOG:
32874aea 84 {
85 static int tabs[4] = { 78, 108 };
86 SendDlgItemMessage(hwnd, IDN_LIST, LB_SETTABSTOPS, 2,
87 (LPARAM) tabs);
88 }
89 for (i = 0; i < nevents; i++)
90 SendDlgItemMessage(hwnd, IDN_LIST, LB_ADDSTRING,
91 0, (LPARAM) events[i]);
374330e2 92 return 1;
374330e2 93 case WM_COMMAND:
94 switch (LOWORD(wParam)) {
95 case IDOK:
475eebf9 96 case IDCANCEL:
374330e2 97 logbox = NULL;
32874aea 98 SetActiveWindow(GetParent(hwnd));
99 DestroyWindow(hwnd);
374330e2 100 return 0;
32874aea 101 case IDN_COPY:
989b10e9 102 if (HIWORD(wParam) == BN_CLICKED ||
103 HIWORD(wParam) == BN_DOUBLECLICKED) {
32874aea 104 int selcount;
105 int *selitems;
106 selcount = SendDlgItemMessage(hwnd, IDN_LIST,
107 LB_GETSELCOUNT, 0, 0);
108 if (selcount == 0) { /* don't even try to copy zero items */
109 MessageBeep(0);
110 break;
111 }
112
113 selitems = smalloc(selcount * sizeof(int));
114 if (selitems) {
115 int count = SendDlgItemMessage(hwnd, IDN_LIST,
116 LB_GETSELITEMS,
117 selcount,
118 (LPARAM) selitems);
119 int i;
120 int size;
121 char *clipdata;
122 static unsigned char sel_nl[] = SEL_NL;
123
124 if (count == 0) { /* can't copy zero stuff */
125 MessageBeep(0);
126 break;
127 }
128
129 size = 0;
130 for (i = 0; i < count; i++)
131 size +=
132 strlen(events[selitems[i]]) + sizeof(sel_nl);
133
134 clipdata = smalloc(size);
135 if (clipdata) {
136 char *p = clipdata;
137 for (i = 0; i < count; i++) {
138 char *q = events[selitems[i]];
139 int qlen = strlen(q);
140 memcpy(p, q, qlen);
141 p += qlen;
142 memcpy(p, sel_nl, sizeof(sel_nl));
143 p += sizeof(sel_nl);
144 }
a8327734 145 write_aclip(NULL, clipdata, size, TRUE);
32874aea 146 sfree(clipdata);
147 }
148 sfree(selitems);
149
150 for (i = 0; i < nevents; i++)
151 SendDlgItemMessage(hwnd, IDN_LIST, LB_SETSEL,
152 FALSE, i);
153 }
154 }
155 return 0;
374330e2 156 }
157 return 0;
158 case WM_CLOSE:
159 logbox = NULL;
32874aea 160 SetActiveWindow(GetParent(hwnd));
161 DestroyWindow(hwnd);
374330e2 162 return 0;
163 }
164 return 0;
165}
166
32874aea 167static int CALLBACK LicenceProc(HWND hwnd, UINT msg,
168 WPARAM wParam, LPARAM lParam)
169{
d57835ab 170 switch (msg) {
171 case WM_INITDIALOG:
172 return 1;
173 case WM_COMMAND:
174 switch (LOWORD(wParam)) {
175 case IDOK:
97749503 176 EndDialog(hwnd, 1);
d57835ab 177 return 0;
178 }
179 return 0;
180 case WM_CLOSE:
97749503 181 EndDialog(hwnd, 1);
d57835ab 182 return 0;
183 }
184 return 0;
185}
186
32874aea 187static int CALLBACK AboutProc(HWND hwnd, UINT msg,
188 WPARAM wParam, LPARAM lParam)
189{
374330e2 190 switch (msg) {
191 case WM_INITDIALOG:
32874aea 192 SetDlgItemText(hwnd, IDA_VERSION, ver);
374330e2 193 return 1;
374330e2 194 case WM_COMMAND:
195 switch (LOWORD(wParam)) {
196 case IDOK:
32874aea 197 case IDCANCEL:
198 EndDialog(hwnd, TRUE);
374330e2 199 return 0;
200 case IDA_LICENCE:
201 EnableWindow(hwnd, 0);
32874aea 202 DialogBox(hinst, MAKEINTRESOURCE(IDD_LICENCEBOX),
203 NULL, LicenceProc);
374330e2 204 EnableWindow(hwnd, 1);
32874aea 205 SetActiveWindow(hwnd);
374330e2 206 return 0;
defab6b8 207
32874aea 208 case IDA_WEB:
209 /* Load web browser */
210 ShellExecute(hwnd, "open",
211 "http://www.chiark.greenend.org.uk/~sgtatham/putty/",
212 0, 0, SW_SHOWDEFAULT);
213 return 0;
374330e2 214 }
215 return 0;
216 case WM_CLOSE:
32874aea 217 EndDialog(hwnd, TRUE);
374330e2 218 return 0;
219 }
220 return 0;
221}
222
301b66db 223/*
224 * Null dialog procedure.
225 */
32874aea 226static int CALLBACK NullDlgProc(HWND hwnd, UINT msg,
227 WPARAM wParam, LPARAM lParam)
228{
301b66db 229 return 0;
230}
231
c96a8fef 232static char savedsession[2048];
233
32874aea 234enum { IDCX_ABOUT =
235 IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
927d4fc5 236
237 sessionpanelstart,
238 IDC_TITLE_SESSION,
3ac9cd9f 239 IDC_BOX_SESSION1,
240 IDC_BOX_SESSION2,
927d4fc5 241 IDC_BOX_SESSION3,
242 IDC_HOSTSTATIC,
243 IDC_HOST,
244 IDC_PORTSTATIC,
245 IDC_PORT,
246 IDC_PROTSTATIC,
247 IDC_PROTRAW,
248 IDC_PROTTELNET,
c91409da 249 IDC_PROTRLOGIN,
927d4fc5 250 IDC_PROTSSH,
251 IDC_SESSSTATIC,
252 IDC_SESSEDIT,
253 IDC_SESSLIST,
254 IDC_SESSLOAD,
255 IDC_SESSSAVE,
256 IDC_SESSDEL,
257 IDC_CLOSEEXIT,
b41069ff 258 IDC_COEALWAYS,
b41069ff 259 IDC_COENEVER,
1cd48051 260 IDC_COENORMAL,
927d4fc5 261 sessionpanelend,
c96a8fef 262
0965bee0 263 loggingpanelstart,
156686ef 264 IDC_TITLE_LOGGING,
0965bee0 265 IDC_BOX_LOGGING1,
266 IDC_LSTATSTATIC,
267 IDC_LSTATOFF,
268 IDC_LSTATASCII,
269 IDC_LSTATRAW,
00db133f 270 IDC_LSTATPACKET,
0965bee0 271 IDC_LGFSTATIC,
272 IDC_LGFEDIT,
273 IDC_LGFBUTTON,
66ee282a 274 IDC_LGFEXPLAIN,
9f89f96e 275 IDC_LSTATXIST,
276 IDC_LSTATXOVR,
277 IDC_LSTATXAPN,
278 IDC_LSTATXASK,
0965bee0 279 loggingpanelend,
280
c96a8fef 281 keyboardpanelstart,
927d4fc5 282 IDC_TITLE_KEYBOARD,
3ac9cd9f 283 IDC_BOX_KEYBOARD1,
284 IDC_BOX_KEYBOARD2,
285 IDC_BOX_KEYBOARD3,
927d4fc5 286 IDC_DELSTATIC,
287 IDC_DEL008,
288 IDC_DEL127,
289 IDC_HOMESTATIC,
290 IDC_HOMETILDE,
291 IDC_HOMERXVT,
292 IDC_FUNCSTATIC,
293 IDC_FUNCTILDE,
294 IDC_FUNCLINUX,
295 IDC_FUNCXTERM,
296 IDC_FUNCVT400,
f37caa11 297 IDC_FUNCVT100P,
298 IDC_FUNCSCO,
927d4fc5 299 IDC_KPSTATIC,
300 IDC_KPNORMAL,
301 IDC_KPAPPLIC,
302 IDC_KPNH,
303 IDC_CURSTATIC,
304 IDC_CURNORMAL,
305 IDC_CURAPPLIC,
a094ae43 306 IDC_COMPOSEKEY,
95bbe1ae 307 IDC_CTRLALTKEYS,
c96a8fef 308 keyboardpanelend,
309
310 terminalpanelstart,
927d4fc5 311 IDC_TITLE_TERMINAL,
3ac9cd9f 312 IDC_BOX_TERMINAL1,
313 IDC_BOX_TERMINAL2,
b44b307a 314 IDC_BOX_TERMINAL3,
927d4fc5 315 IDC_WRAPMODE,
316 IDC_DECOM,
927d4fc5 317 IDC_LFHASCR,
927d4fc5 318 IDC_BCE,
319 IDC_BLINKTEXT,
e7fbcdd8 320 IDC_ANSWERBACK,
321 IDC_ANSWEREDIT,
0965bee0 322 IDC_ECHOSTATIC,
323 IDC_ECHOBACKEND,
324 IDC_ECHOYES,
325 IDC_ECHONO,
326 IDC_EDITSTATIC,
327 IDC_EDITBACKEND,
328 IDC_EDITYES,
329 IDC_EDITNO,
b44b307a 330 IDC_PRINTERSTATIC,
331 IDC_PRINTER,
c96a8fef 332 terminalpanelend,
333
0d2086c5 334 featurespanelstart,
335 IDC_TITLE_FEATURES,
336 IDC_BOX_FEATURES1,
337 IDC_NOAPPLICK,
338 IDC_NOAPPLICC,
c0d36a72 339 IDC_NOMOUSEREP,
0d2086c5 340 IDC_NORESIZE,
341 IDC_NOALTSCREEN,
342 IDC_NOWINTITLE,
343 IDC_NODBACKSPACE,
344 IDC_NOCHARSET,
345 featurespanelend,
346
156686ef 347 bellpanelstart,
348 IDC_TITLE_BELL,
349 IDC_BOX_BELL1,
350 IDC_BOX_BELL2,
351 IDC_BELLSTATIC,
352 IDC_BELL_DISABLED,
353 IDC_BELL_DEFAULT,
03169ad0 354 IDC_BELL_WAVEFILE,
156686ef 355 IDC_BELL_VISUAL,
03169ad0 356 IDC_BELL_WAVESTATIC,
357 IDC_BELL_WAVEEDIT,
358 IDC_BELL_WAVEBROWSE,
f8a28d1f 359 IDC_B_IND_STATIC,
360 IDC_B_IND_DISABLED,
361 IDC_B_IND_FLASH,
362 IDC_B_IND_STEADY,
156686ef 363 IDC_BELLOVL,
364 IDC_BELLOVLNSTATIC,
365 IDC_BELLOVLN,
366 IDC_BELLOVLTSTATIC,
367 IDC_BELLOVLT,
368 IDC_BELLOVLEXPLAIN,
369 IDC_BELLOVLSSTATIC,
370 IDC_BELLOVLS,
371 bellpanelend,
372
c96a8fef 373 windowpanelstart,
927d4fc5 374 IDC_TITLE_WINDOW,
3ac9cd9f 375 IDC_BOX_WINDOW1,
376 IDC_BOX_WINDOW2,
4c4f2716 377 IDC_BOX_WINDOW3,
378 IDC_ROWSSTATIC,
379 IDC_ROWSEDIT,
380 IDC_COLSSTATIC,
381 IDC_COLSEDIT,
ad5c93cc 382 IDC_RESIZESTATIC,
383 IDC_RESIZETERM,
384 IDC_RESIZEFONT,
385 IDC_RESIZENONE,
0ed2f48e 386 IDC_RESIZEEITHER,
927d4fc5 387 IDC_SCROLLBAR,
a401e5f3 388 IDC_SCROLLBARFULLSCREEN,
927d4fc5 389 IDC_SAVESTATIC,
390 IDC_SAVEEDIT,
d0cadfcd 391 IDC_SCROLLKEY,
392 IDC_SCROLLDISP,
393 windowpanelend,
394
395 behaviourpanelstart,
396 IDC_TITLE_BEHAVIOUR,
397 IDC_BOX_BEHAVIOUR1,
398 IDC_CLOSEWARN,
927d4fc5 399 IDC_ALTF4,
400 IDC_ALTSPACE,
a094ae43 401 IDC_ALTONLY,
e95edc00 402 IDC_ALWAYSONTOP,
8f57d753 403 IDC_FULLSCREENONALTENTER,
d0cadfcd 404 behaviourpanelend,
c96a8fef 405
4c4f2716 406 appearancepanelstart,
407 IDC_TITLE_APPEARANCE,
3ac9cd9f 408 IDC_BOX_APPEARANCE1,
409 IDC_BOX_APPEARANCE2,
410 IDC_BOX_APPEARANCE3,
411 IDC_BOX_APPEARANCE4,
57d08f2f 412 IDC_BOX_APPEARANCE5,
2d3411e9 413 IDC_CURSORSTATIC,
4e30ff69 414 IDC_CURBLOCK,
415 IDC_CURUNDER,
416 IDC_CURVERT,
4c4f2716 417 IDC_BLINKCUR,
418 IDC_FONTSTATIC,
419 IDC_CHOOSEFONT,
420 IDC_WINTITLE,
421 IDC_WINEDIT,
422 IDC_WINNAME,
554c540d 423 IDC_HIDEMOUSE,
57d08f2f 424 IDC_SUNKENEDGE,
5a73255e 425 IDC_WINBSTATIC,
426 IDC_WINBEDIT,
4c4f2716 427 appearancepanelend,
428
927d4fc5 429 connectionpanelstart,
430 IDC_TITLE_CONNECTION,
3ac9cd9f 431 IDC_BOX_CONNECTION1,
432 IDC_BOX_CONNECTION2,
2184a5d9 433 IDC_BOX_CONNECTION3,
927d4fc5 434 IDC_TTSTATIC,
435 IDC_TTEDIT,
436 IDC_LOGSTATIC,
437 IDC_LOGEDIT,
438 IDC_PINGSTATIC,
439 IDC_PINGEDIT,
2184a5d9 440 IDC_NODELAY,
927d4fc5 441 connectionpanelend,
442
8eebd221 443 proxypanelstart,
444 IDC_TITLE_PROXY,
445 IDC_BOX_PROXY1,
446 IDC_PROXYTYPESTATIC,
447 IDC_PROXYTYPENONE,
448 IDC_PROXYTYPEHTTP,
449 IDC_PROXYTYPESOCKS,
450 IDC_PROXYTYPETELNET,
451 IDC_PROXYHOSTSTATIC,
452 IDC_PROXYHOSTEDIT,
453 IDC_PROXYPORTSTATIC,
454 IDC_PROXYPORTEDIT,
455 IDC_PROXYEXCLUDESTATIC,
456 IDC_PROXYEXCLUDEEDIT,
457 IDC_PROXYUSERSTATIC,
458 IDC_PROXYUSEREDIT,
459 IDC_PROXYPASSSTATIC,
460 IDC_PROXYPASSEDIT,
461 IDC_BOX_PROXY2,
462 IDC_PROXYTELNETCMDSTATIC,
463 IDC_PROXYTELNETCMDEDIT,
464 IDC_PROXYSOCKSVERSTATIC,
465 IDC_PROXYSOCKSVER5,
466 IDC_PROXYSOCKSVER4,
467 proxypanelend,
468
c96a8fef 469 telnetpanelstart,
927d4fc5 470 IDC_TITLE_TELNET,
3ac9cd9f 471 IDC_BOX_TELNET1,
472 IDC_BOX_TELNET2,
927d4fc5 473 IDC_TSSTATIC,
474 IDC_TSEDIT,
475 IDC_ENVSTATIC,
476 IDC_VARSTATIC,
477 IDC_VAREDIT,
478 IDC_VALSTATIC,
479 IDC_VALEDIT,
480 IDC_ENVLIST,
481 IDC_ENVADD,
482 IDC_ENVREMOVE,
483 IDC_EMSTATIC,
484 IDC_EMBSD,
485 IDC_EMRFC,
8faa456c 486 IDC_ACTSTATIC,
487 IDC_TPASSIVE,
488 IDC_TACTIVE,
70133c0e 489 IDC_TELNETKEY,
eee63b77 490 IDC_TELNETRET,
c96a8fef 491 telnetpanelend,
492
c91409da 493 rloginpanelstart,
494 IDC_TITLE_RLOGIN,
3ac9cd9f 495 IDC_BOX_RLOGIN1,
496 IDC_BOX_RLOGIN2,
c91409da 497 IDC_R_TSSTATIC,
498 IDC_R_TSEDIT,
499 IDC_RLLUSERSTATIC,
500 IDC_RLLUSEREDIT,
501 rloginpanelend,
502
c96a8fef 503 sshpanelstart,
927d4fc5 504 IDC_TITLE_SSH,
3ac9cd9f 505 IDC_BOX_SSH1,
506 IDC_BOX_SSH2,
507 IDC_BOX_SSH3,
927d4fc5 508 IDC_NOPTY,
ca20bfcf 509 IDC_BOX_SSHCIPHER,
510 IDC_CIPHERSTATIC2,
511 IDC_CIPHERLIST,
512 IDC_CIPHERUP,
513 IDC_CIPHERDN,
cb4d4768 514 IDC_SSH2DES,
927d4fc5 515 IDC_SSHPROTSTATIC,
38d228a2 516 IDC_SSHPROT1ONLY,
927d4fc5 517 IDC_SSHPROT1,
518 IDC_SSHPROT2,
759712a6 519 IDC_SSHPROT2ONLY,
927d4fc5 520 IDC_CMDSTATIC,
521 IDC_CMDEDIT,
4ba9b64b 522 IDC_COMPRESS,
c96a8fef 523 sshpanelend,
524
ca20bfcf 525 sshauthpanelstart,
526 IDC_TITLE_SSHAUTH,
527 IDC_BOX_SSHAUTH1,
528 IDC_BOX_SSHAUTH2,
529 IDC_PKSTATIC,
530 IDC_PKEDIT,
531 IDC_PKBUTTON,
532 IDC_AGENTFWD,
5bb641e1 533 IDC_CHANGEUSER,
ca20bfcf 534 IDC_AUTHTIS,
f091e308 535 IDC_AUTHKI,
ca20bfcf 536 sshauthpanelend,
537
2c9c6388 538 sshbugspanelstart,
539 IDC_TITLE_SSHBUGS,
540 IDC_BOX_SSHBUGS1,
541 IDC_BUGS_IGNORE1,
542 IDC_BUGD_IGNORE1,
543 IDC_BUGS_PLAINPW1,
544 IDC_BUGD_PLAINPW1,
545 IDC_BUGS_RSA1,
546 IDC_BUGD_RSA1,
547 IDC_BUGS_HMAC2,
548 IDC_BUGD_HMAC2,
549 IDC_BUGS_DERIVEKEY2,
550 IDC_BUGD_DERIVEKEY2,
551 IDC_BUGS_RSAPAD2,
552 IDC_BUGD_RSAPAD2,
8e975795 553 IDC_BUGS_DHGEX2,
554 IDC_BUGD_DHGEX2,
2c9c6388 555 sshbugspanelend,
556
c96a8fef 557 selectionpanelstart,
927d4fc5 558 IDC_TITLE_SELECTION,
3ac9cd9f 559 IDC_BOX_SELECTION1,
560 IDC_BOX_SELECTION2,
d3a22f79 561 IDC_BOX_SELECTION3,
927d4fc5 562 IDC_MBSTATIC,
563 IDC_MBWINDOWS,
564 IDC_MBXTERM,
b90840c3 565 IDC_MOUSEOVERRIDE,
6908fed7 566 IDC_SELTYPESTATIC,
567 IDC_SELTYPELEX,
568 IDC_SELTYPERECT,
927d4fc5 569 IDC_CCSTATIC,
570 IDC_CCLIST,
571 IDC_CCSET,
572 IDC_CCSTATIC2,
573 IDC_CCEDIT,
d3a22f79 574 IDC_RAWCNP,
a7419ea4 575 IDC_RTFPASTE,
c96a8fef 576 selectionpanelend,
577
578 colourspanelstart,
927d4fc5 579 IDC_TITLE_COLOURS,
3ac9cd9f 580 IDC_BOX_COLOURS1,
581 IDC_BOX_COLOURS2,
927d4fc5 582 IDC_BOLDCOLOUR,
583 IDC_PALETTE,
5055f918 584 IDC_COLOURSTATIC,
585 IDC_COLOURLIST,
927d4fc5 586 IDC_RSTATIC,
587 IDC_GSTATIC,
588 IDC_BSTATIC,
589 IDC_RVALUE,
590 IDC_GVALUE,
591 IDC_BVALUE,
592 IDC_CHANGE,
c96a8fef 593 colourspanelend,
594
595 translationpanelstart,
927d4fc5 596 IDC_TITLE_TRANSLATION,
3ac9cd9f 597 IDC_BOX_TRANSLATION1,
598 IDC_BOX_TRANSLATION2,
a9c02454 599 IDC_BOX_TRANSLATION3,
4eeb7d09 600 IDC_CODEPAGESTATIC,
601 IDC_CODEPAGE,
a9c02454 602 IDC_CAPSLOCKCYR,
927d4fc5 603 IDC_VTSTATIC,
604 IDC_VTXWINDOWS,
605 IDC_VTOEMANSI,
606 IDC_VTOEMONLY,
607 IDC_VTPOORMAN,
4eeb7d09 608 IDC_VTUNICODE,
c96a8fef 609 translationpanelend,
610
9c964e85 611 tunnelspanelstart,
e6ace450 612 IDC_TITLE_TUNNELS,
d74d141c 613 IDC_BOX_TUNNELS1,
614 IDC_BOX_TUNNELS2,
9c964e85 615 IDC_X11_FORWARD,
616 IDC_X11_DISPSTATIC,
617 IDC_X11_DISPLAY,
d74d141c 618 IDC_LPORT_ALL,
beefa433 619 IDC_RPORT_ALL,
d74d141c 620 IDC_PFWDSTATIC,
621 IDC_PFWDSTATIC2,
622 IDC_PFWDREMOVE,
623 IDC_PFWDLIST,
624 IDC_PFWDADD,
625 IDC_SPORTSTATIC,
626 IDC_SPORTEDIT,
627 IDC_DPORTSTATIC,
628 IDC_DPORTEDIT,
629 IDC_PFWDLOCAL,
630 IDC_PFWDREMOTE,
631
9c964e85 632 tunnelspanelend,
633
c96a8fef 634 controlendvalue
635};
636
637static const char *const colours[] = {
638 "Default Foreground", "Default Bold Foreground",
639 "Default Background", "Default Bold Background",
640 "Cursor Text", "Cursor Colour",
641 "ANSI Black", "ANSI Black Bold",
642 "ANSI Red", "ANSI Red Bold",
643 "ANSI Green", "ANSI Green Bold",
644 "ANSI Yellow", "ANSI Yellow Bold",
645 "ANSI Blue", "ANSI Blue Bold",
646 "ANSI Magenta", "ANSI Magenta Bold",
647 "ANSI Cyan", "ANSI Cyan Bold",
648 "ANSI White", "ANSI White Bold"
649};
650static const int permcolour[] = {
651 TRUE, FALSE, TRUE, FALSE, TRUE, TRUE,
652 TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE,
653 TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE
654};
655
32874aea 656static void fmtfont(char *buf)
657{
658 sprintf(buf, "Font: %s, ", cfg.font);
c96a8fef 659 if (cfg.fontisbold)
660 strcat(buf, "bold, ");
661 if (cfg.fontheight == 0)
32874aea 662 strcat(buf, "default height");
c96a8fef 663 else
32874aea 664 sprintf(buf + strlen(buf), "%d-point",
665 (cfg.fontheight < 0 ? -cfg.fontheight : cfg.fontheight));
c96a8fef 666}
667
70133c0e 668char *help_context_cmd(int id)
669{
670 switch (id) {
671 case IDC_HOSTSTATIC:
672 case IDC_HOST:
673 case IDC_PORTSTATIC:
674 case IDC_PORT:
675 case IDC_PROTSTATIC:
676 case IDC_PROTRAW:
677 case IDC_PROTTELNET:
678 case IDC_PROTRLOGIN:
679 case IDC_PROTSSH:
680 return "JI(`',`session.hostname')";
681 case IDC_SESSSTATIC:
682 case IDC_SESSEDIT:
683 case IDC_SESSLIST:
684 case IDC_SESSLOAD:
685 case IDC_SESSSAVE:
686 case IDC_SESSDEL:
687 return "JI(`',`session.saved')";
688 case IDC_CLOSEEXIT:
689 case IDC_COEALWAYS:
690 case IDC_COENEVER:
691 case IDC_COENORMAL:
692 return "JI(`',`session.coe')";
693 case IDC_LSTATSTATIC:
694 case IDC_LSTATOFF:
695 case IDC_LSTATASCII:
696 case IDC_LSTATRAW:
00db133f 697 case IDC_LSTATPACKET:
70133c0e 698 return "JI(`',`logging.main')";
699 case IDC_LGFSTATIC:
700 case IDC_LGFEDIT:
701 case IDC_LGFBUTTON:
702 case IDC_LGFEXPLAIN:
703 return "JI(`',`logging.filename')";
704 case IDC_LSTATXIST:
705 case IDC_LSTATXOVR:
706 case IDC_LSTATXAPN:
707 case IDC_LSTATXASK:
708 return "JI(`',`logging.exists')";
709
710 case IDC_DELSTATIC:
711 case IDC_DEL008:
712 case IDC_DEL127:
713 return "JI(`',`keyboard.backspace')";
714 case IDC_HOMESTATIC:
715 case IDC_HOMETILDE:
716 case IDC_HOMERXVT:
717 return "JI(`',`keyboard.homeend')";
718 case IDC_FUNCSTATIC:
719 case IDC_FUNCTILDE:
720 case IDC_FUNCLINUX:
721 case IDC_FUNCXTERM:
722 case IDC_FUNCVT400:
723 case IDC_FUNCVT100P:
724 case IDC_FUNCSCO:
725 return "JI(`',`keyboard.funkeys')";
726 case IDC_KPSTATIC:
727 case IDC_KPNORMAL:
728 case IDC_KPAPPLIC:
70133c0e 729 return "JI(`',`keyboard.appkeypad')";
70133c0e 730 case IDC_CURSTATIC:
731 case IDC_CURNORMAL:
732 case IDC_CURAPPLIC:
733 return "JI(`',`keyboard.appcursor')";
734 case IDC_KPNH:
735 return "JI(`',`keyboard.nethack')";
736 case IDC_COMPOSEKEY:
737 return "JI(`',`keyboard.compose')";
738 case IDC_CTRLALTKEYS:
739 return "JI(`',`keyboard.ctrlalt')";
740
0d2086c5 741 case IDC_NOAPPLICK:
742 case IDC_NOAPPLICC:
743 return "JI(`',`features.application')";
c0d36a72 744 case IDC_NOMOUSEREP:
745 return "JI(`',`features.mouse')";
0d2086c5 746 case IDC_NORESIZE:
747 return "JI(`',`features.resize')";
748 case IDC_NOALTSCREEN:
749 return "JI(`',`features.altscreen')";
750 case IDC_NOWINTITLE:
751 return "JI(`',`features.retitle')";
752 case IDC_NODBACKSPACE:
753 return "JI(`',`features.dbackspace')";
754 case IDC_NOCHARSET:
755 return "JI(`',`features.charset')";
756
70133c0e 757 case IDC_WRAPMODE:
758 return "JI(`',`terminal.autowrap')";
759 case IDC_DECOM:
760 return "JI(`',`terminal.decom')";
761 case IDC_LFHASCR:
762 return "JI(`',`terminal.lfhascr')";
763 case IDC_BCE:
764 return "JI(`',`terminal.bce')";
765 case IDC_BLINKTEXT:
766 return "JI(`',`terminal.blink')";
767 case IDC_ANSWERBACK:
768 case IDC_ANSWEREDIT:
769 return "JI(`',`terminal.answerback')";
770 case IDC_ECHOSTATIC:
771 case IDC_ECHOBACKEND:
772 case IDC_ECHOYES:
773 case IDC_ECHONO:
774 return "JI(`',`terminal.localecho')";
775 case IDC_EDITSTATIC:
776 case IDC_EDITBACKEND:
777 case IDC_EDITYES:
778 case IDC_EDITNO:
779 return "JI(`',`terminal.localedit')";
b44b307a 780 case IDC_PRINTERSTATIC:
781 case IDC_PRINTER:
782 return "JI(`',`terminal.printing')";
70133c0e 783
784 case IDC_BELLSTATIC:
785 case IDC_BELL_DISABLED:
786 case IDC_BELL_DEFAULT:
787 case IDC_BELL_WAVEFILE:
788 case IDC_BELL_VISUAL:
789 case IDC_BELL_WAVESTATIC:
790 case IDC_BELL_WAVEEDIT:
791 case IDC_BELL_WAVEBROWSE:
792 return "JI(`',`bell.style')";
793 case IDC_B_IND_STATIC:
794 case IDC_B_IND_DISABLED:
795 case IDC_B_IND_FLASH:
796 case IDC_B_IND_STEADY:
797 return "JI(`',`bell.taskbar')";
798 case IDC_BELLOVL:
799 case IDC_BELLOVLNSTATIC:
800 case IDC_BELLOVLN:
801 case IDC_BELLOVLTSTATIC:
802 case IDC_BELLOVLT:
803 case IDC_BELLOVLEXPLAIN:
804 case IDC_BELLOVLSSTATIC:
805 case IDC_BELLOVLS:
806 return "JI(`',`bell.overload')";
807
808 case IDC_ROWSSTATIC:
809 case IDC_ROWSEDIT:
810 case IDC_COLSSTATIC:
811 case IDC_COLSEDIT:
812 return "JI(`',`window.size')";
813 case IDC_RESIZESTATIC:
814 case IDC_RESIZETERM:
815 case IDC_RESIZEFONT:
816 case IDC_RESIZENONE:
817 case IDC_RESIZEEITHER:
818 return "JI(`',`window.resize')";
819 case IDC_SCROLLBAR:
820 case IDC_SCROLLBARFULLSCREEN:
821 case IDC_SAVESTATIC:
822 case IDC_SAVEEDIT:
823 case IDC_SCROLLKEY:
824 case IDC_SCROLLDISP:
825 return "JI(`',`window.scrollback')";
826
827 case IDC_CLOSEWARN:
828 return "JI(`',`behaviour.closewarn')";
829 case IDC_ALTF4:
830 return "JI(`',`behaviour.altf4')";
831 case IDC_ALTSPACE:
832 return "JI(`',`behaviour.altspace')";
833 case IDC_ALTONLY:
834 return "JI(`',`behaviour.altonly')";
835 case IDC_ALWAYSONTOP:
836 return "JI(`',`behaviour.alwaysontop')";
837 case IDC_FULLSCREENONALTENTER:
838 return "JI(`',`behaviour.altenter')";
839
840 case IDC_CURSORSTATIC:
841 case IDC_CURBLOCK:
842 case IDC_CURUNDER:
843 case IDC_CURVERT:
844 case IDC_BLINKCUR:
845 return "JI(`',`appearance.cursor')";
846 case IDC_FONTSTATIC:
847 case IDC_CHOOSEFONT:
848 return "JI(`',`appearance.font')";
849 case IDC_WINTITLE:
850 case IDC_WINEDIT:
851 case IDC_WINNAME:
852 return "JI(`',`appearance.title')";
853 case IDC_HIDEMOUSE:
854 return "JI(`',`appearance.hidemouse')";
855 case IDC_SUNKENEDGE:
856 case IDC_WINBSTATIC:
857 case IDC_WINBEDIT:
858 return "JI(`',`appearance.border')";
859
860 case IDC_TTSTATIC:
861 case IDC_TTEDIT:
862 return "JI(`',`connection.termtype')";
863 case IDC_LOGSTATIC:
864 case IDC_LOGEDIT:
865 return "JI(`',`connection.username')";
866 case IDC_PINGSTATIC:
867 case IDC_PINGEDIT:
868 return "JI(`',`connection.keepalive')";
869 case IDC_NODELAY:
870 return "JI(`',`connection.nodelay')";
871
15933a9b 872 case IDC_PROXYTYPESTATIC:
873 case IDC_PROXYTYPENONE:
874 case IDC_PROXYTYPEHTTP:
875 case IDC_PROXYTYPESOCKS:
876 case IDC_PROXYTYPETELNET:
877 return "JI(`',`proxy.type')";
878 case IDC_PROXYHOSTSTATIC:
879 case IDC_PROXYHOSTEDIT:
880 case IDC_PROXYPORTSTATIC:
881 case IDC_PROXYPORTEDIT:
882 return "JI(`',`proxy.main')";
883 case IDC_PROXYEXCLUDESTATIC:
884 case IDC_PROXYEXCLUDEEDIT:
885 return "JI(`',`proxy.exclude')";
886 case IDC_PROXYUSERSTATIC:
887 case IDC_PROXYUSEREDIT:
888 case IDC_PROXYPASSSTATIC:
889 case IDC_PROXYPASSEDIT:
890 return "JI(`',`proxy.auth')";
891 case IDC_PROXYTELNETCMDSTATIC:
892 case IDC_PROXYTELNETCMDEDIT:
893 return "JI(`',`proxy.command')";
894 case IDC_PROXYSOCKSVERSTATIC:
895 case IDC_PROXYSOCKSVER5:
896 case IDC_PROXYSOCKSVER4:
897 return "JI(`',`proxy.socksver')";
898
70133c0e 899 case IDC_TSSTATIC:
900 case IDC_TSEDIT:
901 return "JI(`',`telnet.termspeed')";
902 case IDC_ENVSTATIC:
903 case IDC_VARSTATIC:
904 case IDC_VAREDIT:
905 case IDC_VALSTATIC:
906 case IDC_VALEDIT:
907 case IDC_ENVLIST:
908 case IDC_ENVADD:
909 case IDC_ENVREMOVE:
910 return "JI(`',`telnet.environ')";
911 case IDC_EMSTATIC:
912 case IDC_EMBSD:
913 case IDC_EMRFC:
914 return "JI(`',`telnet.oldenviron')";
915 case IDC_ACTSTATIC:
916 case IDC_TPASSIVE:
917 case IDC_TACTIVE:
918 return "JI(`',`telnet.passive')";
919 case IDC_TELNETKEY:
920 return "JI(`',`telnet.specialkeys')";
e81b578d 921 case IDC_TELNETRET:
922 return "JI(`',`telnet.newline')";
70133c0e 923
924 case IDC_R_TSSTATIC:
925 case IDC_R_TSEDIT:
926 return "JI(`',`rlogin.termspeed')";
927 case IDC_RLLUSERSTATIC:
928 case IDC_RLLUSEREDIT:
929 return "JI(`',`rlogin.localuser')";
930
931 case IDC_NOPTY:
932 return "JI(`',`ssh.nopty')";
933 case IDC_CIPHERSTATIC2:
934 case IDC_CIPHERLIST:
935 case IDC_CIPHERUP:
936 case IDC_CIPHERDN:
937 case IDC_SSH2DES:
938 return "JI(`',`ssh.ciphers')";
70133c0e 939 case IDC_SSHPROTSTATIC:
38d228a2 940 case IDC_SSHPROT1ONLY:
70133c0e 941 case IDC_SSHPROT1:
942 case IDC_SSHPROT2:
759712a6 943 case IDC_SSHPROT2ONLY:
70133c0e 944 return "JI(`',`ssh.protocol')";
945 case IDC_CMDSTATIC:
946 case IDC_CMDEDIT:
947 return "JI(`',`ssh.command')";
948 case IDC_COMPRESS:
949 return "JI(`',`ssh.compress')";
950
951 case IDC_PKSTATIC:
952 case IDC_PKEDIT:
953 case IDC_PKBUTTON:
954 return "JI(`',`ssh.auth.privkey')";
955 case IDC_AGENTFWD:
956 return "JI(`',`ssh.auth.agentfwd')";
5bb641e1 957 case IDC_CHANGEUSER:
958 return "JI(`',`ssh.auth.changeuser')";
70133c0e 959 case IDC_AUTHTIS:
960 return "JI(`',`ssh.auth.tis')";
961 case IDC_AUTHKI:
962 return "JI(`',`ssh.auth.ki')";
963
964 case IDC_MBSTATIC:
965 case IDC_MBWINDOWS:
966 case IDC_MBXTERM:
967 return "JI(`',`selection.buttons')";
968 case IDC_MOUSEOVERRIDE:
969 return "JI(`',`selection.shiftdrag')";
970 case IDC_SELTYPESTATIC:
971 case IDC_SELTYPELEX:
972 case IDC_SELTYPERECT:
973 return "JI(`',`selection.rect')";
974 case IDC_CCSTATIC:
975 case IDC_CCLIST:
976 case IDC_CCSET:
977 case IDC_CCSTATIC2:
978 case IDC_CCEDIT:
979 return "JI(`',`selection.charclasses')";
980 case IDC_RAWCNP:
981 return "JI(`',`selection.linedraw')";
982 case IDC_RTFPASTE:
983 return "JI(`',`selection.rtf')";
984
985 case IDC_BOLDCOLOUR:
986 return "JI(`',`colours.bold')";
987 case IDC_PALETTE:
988 return "JI(`',`colours.logpal')";
989 case IDC_COLOURSTATIC:
990 case IDC_COLOURLIST:
991 case IDC_RSTATIC:
992 case IDC_GSTATIC:
993 case IDC_BSTATIC:
994 case IDC_RVALUE:
995 case IDC_GVALUE:
996 case IDC_BVALUE:
997 case IDC_CHANGE:
998 return "JI(`',`colours.config')";
999
1000 case IDC_CODEPAGESTATIC:
1001 case IDC_CODEPAGE:
1002 return "JI(`',`translation.codepage')";
1003 case IDC_CAPSLOCKCYR:
1004 return "JI(`',`translation.cyrillic')";
1005 case IDC_VTSTATIC:
1006 case IDC_VTXWINDOWS:
1007 case IDC_VTOEMANSI:
1008 case IDC_VTOEMONLY:
1009 case IDC_VTPOORMAN:
1010 case IDC_VTUNICODE:
1011 return "JI(`',`translation.linedraw')";
1012
1013 case IDC_X11_FORWARD:
1014 case IDC_X11_DISPSTATIC:
1015 case IDC_X11_DISPLAY:
1016 return "JI(`',`ssh.tunnels.x11')";
70133c0e 1017 case IDC_PFWDSTATIC:
1018 case IDC_PFWDSTATIC2:
1019 case IDC_PFWDREMOVE:
1020 case IDC_PFWDLIST:
1021 case IDC_PFWDADD:
1022 case IDC_SPORTSTATIC:
1023 case IDC_SPORTEDIT:
1024 case IDC_DPORTSTATIC:
1025 case IDC_DPORTEDIT:
1026 case IDC_PFWDLOCAL:
1027 case IDC_PFWDREMOTE:
1028 return "JI(`',`ssh.tunnels.portfwd')";
beefa433 1029 case IDC_LPORT_ALL:
1030 case IDC_RPORT_ALL:
1031 return "JI(`',`ssh.tunnels.portfwd.localhost')";
70133c0e 1032
2c9c6388 1033 case IDC_BUGS_IGNORE1:
1034 case IDC_BUGD_IGNORE1:
1035 return "JI(`',`ssh.bugs.ignore1')";
1036 case IDC_BUGS_PLAINPW1:
1037 case IDC_BUGD_PLAINPW1:
1038 return "JI(`',`ssh.bugs.plainpw1')";
1039 case IDC_BUGS_RSA1:
1040 case IDC_BUGD_RSA1:
1041 return "JI(`',`ssh.bugs.rsa1')";
1042 case IDC_BUGS_HMAC2:
1043 case IDC_BUGD_HMAC2:
1044 return "JI(`',`ssh.bugs.hmac2')";
1045 case IDC_BUGS_DERIVEKEY2:
1046 case IDC_BUGD_DERIVEKEY2:
1047 return "JI(`',`ssh.bugs.derivekey2')";
1048 case IDC_BUGS_RSAPAD2:
1049 case IDC_BUGD_RSAPAD2:
1050 return "JI(`',`ssh.bugs.rsapad2')";
8e975795 1051 case IDC_BUGS_DHGEX2:
1052 case IDC_BUGD_DHGEX2:
1053 return "JI(`',`ssh.bugs.dhgex2')";
2c9c6388 1054
70133c0e 1055 default:
1056 return NULL;
1057 }
1058}
1059
c8d7378d 1060/* 2nd arg: NZ => don't redraw session list (use when loading
1061 * a new session) */
1062static void init_dlg_ctrls(HWND hwnd, int keepsess)
32874aea 1063{
c96a8fef 1064 int i;
1065 char fontstatic[256];
1066
32874aea 1067 SetDlgItemText(hwnd, IDC_HOST, cfg.host);
1068 SetDlgItemText(hwnd, IDC_SESSEDIT, savedsession);
c8d7378d 1069 if (!keepsess) {
3ac9cd9f 1070 int i, n;
32874aea 1071 n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCOUNT, 0, 0);
1072 for (i = n; i-- > 0;)
1073 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_DELETESTRING, i, 0);
0b4f0bc0 1074 for (i = 0; i < sesslist.nsessions; i++)
32874aea 1075 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING,
0b4f0bc0 1076 0, (LPARAM) (sesslist.sessions[i]));
3ac9cd9f 1077 }
32874aea 1078 SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE);
1079 CheckRadioButton(hwnd, IDC_PROTRAW, IDC_PROTSSH,
1080 cfg.protocol == PROT_SSH ? IDC_PROTSSH :
1081 cfg.protocol == PROT_TELNET ? IDC_PROTTELNET :
1082 cfg.protocol ==
1083 PROT_RLOGIN ? IDC_PROTRLOGIN : IDC_PROTRAW);
1084 SetDlgItemInt(hwnd, IDC_PINGEDIT, cfg.ping_interval, FALSE);
2184a5d9 1085 CheckDlgButton(hwnd, IDC_NODELAY, cfg.tcp_nodelay);
32874aea 1086
1087 CheckRadioButton(hwnd, IDC_DEL008, IDC_DEL127,
1088 cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008);
1089 CheckRadioButton(hwnd, IDC_HOMETILDE, IDC_HOMERXVT,
1090 cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE);
1091 CheckRadioButton(hwnd, IDC_FUNCTILDE, IDC_FUNCSCO,
1092 cfg.funky_type == 0 ? IDC_FUNCTILDE :
1093 cfg.funky_type == 1 ? IDC_FUNCLINUX :
1094 cfg.funky_type == 2 ? IDC_FUNCXTERM :
1095 cfg.funky_type == 3 ? IDC_FUNCVT400 :
1096 cfg.funky_type == 4 ? IDC_FUNCVT100P :
1097 cfg.funky_type == 5 ? IDC_FUNCSCO : IDC_FUNCTILDE);
1098 CheckDlgButton(hwnd, IDC_NOAPPLICC, cfg.no_applic_c);
1099 CheckDlgButton(hwnd, IDC_NOAPPLICK, cfg.no_applic_k);
c0d36a72 1100 CheckDlgButton(hwnd, IDC_NOMOUSEREP, cfg.no_mouse_rep);
0d2086c5 1101 CheckDlgButton(hwnd, IDC_NORESIZE, cfg.no_remote_resize);
1102 CheckDlgButton(hwnd, IDC_NOALTSCREEN, cfg.no_alt_screen);
1103 CheckDlgButton(hwnd, IDC_NOWINTITLE, cfg.no_remote_wintitle);
1104 CheckDlgButton(hwnd, IDC_NODBACKSPACE, cfg.no_dbackspace);
1105 CheckDlgButton(hwnd, IDC_NOCHARSET, cfg.no_remote_charset);
32874aea 1106 CheckRadioButton(hwnd, IDC_CURNORMAL, IDC_CURAPPLIC,
1107 cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL);
1108 CheckRadioButton(hwnd, IDC_KPNORMAL, IDC_KPNH,
1109 cfg.nethack_keypad ? IDC_KPNH :
1110 cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL);
1111 CheckDlgButton(hwnd, IDC_ALTF4, cfg.alt_f4);
1112 CheckDlgButton(hwnd, IDC_ALTSPACE, cfg.alt_space);
1113 CheckDlgButton(hwnd, IDC_ALTONLY, cfg.alt_only);
1114 CheckDlgButton(hwnd, IDC_COMPOSEKEY, cfg.compose_key);
1115 CheckDlgButton(hwnd, IDC_CTRLALTKEYS, cfg.ctrlaltkeys);
a5f3e637 1116 CheckDlgButton(hwnd, IDC_TELNETKEY, cfg.telnet_keyboard);
eee63b77 1117 CheckDlgButton(hwnd, IDC_TELNETRET, cfg.telnet_newline);
32874aea 1118 CheckRadioButton(hwnd, IDC_ECHOBACKEND, IDC_ECHONO,
1119 cfg.localecho == LD_BACKEND ? IDC_ECHOBACKEND :
1120 cfg.localecho == LD_YES ? IDC_ECHOYES : IDC_ECHONO);
1121 CheckRadioButton(hwnd, IDC_EDITBACKEND, IDC_EDITNO,
1122 cfg.localedit == LD_BACKEND ? IDC_EDITBACKEND :
1123 cfg.localedit == LD_YES ? IDC_EDITYES : IDC_EDITNO);
1124 SetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback);
1125 CheckDlgButton(hwnd, IDC_ALWAYSONTOP, cfg.alwaysontop);
8f57d753 1126 CheckDlgButton(hwnd, IDC_FULLSCREENONALTENTER, cfg.fullscreenonaltenter);
32874aea 1127 CheckDlgButton(hwnd, IDC_SCROLLKEY, cfg.scroll_on_key);
1128 CheckDlgButton(hwnd, IDC_SCROLLDISP, cfg.scroll_on_disp);
1129
1130 CheckDlgButton(hwnd, IDC_WRAPMODE, cfg.wrap_mode);
1131 CheckDlgButton(hwnd, IDC_DECOM, cfg.dec_om);
1132 CheckDlgButton(hwnd, IDC_LFHASCR, cfg.lfhascr);
1133 SetDlgItemInt(hwnd, IDC_ROWSEDIT, cfg.height, FALSE);
1134 SetDlgItemInt(hwnd, IDC_COLSEDIT, cfg.width, FALSE);
1135 SetDlgItemInt(hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE);
1136 fmtfont(fontstatic);
1137 SetDlgItemText(hwnd, IDC_FONTSTATIC, fontstatic);
1138 CheckRadioButton(hwnd, IDC_BELL_DISABLED, IDC_BELL_VISUAL,
1139 cfg.beep == BELL_DISABLED ? IDC_BELL_DISABLED :
1140 cfg.beep == BELL_DEFAULT ? IDC_BELL_DEFAULT :
1141 cfg.beep == BELL_WAVEFILE ? IDC_BELL_WAVEFILE :
1142 cfg.beep ==
1143 BELL_VISUAL ? IDC_BELL_VISUAL : IDC_BELL_DEFAULT);
f8a28d1f 1144 CheckRadioButton(hwnd, IDC_B_IND_DISABLED, IDC_B_IND_STEADY,
1145 cfg.beep_ind ==
1146 B_IND_DISABLED ? IDC_B_IND_DISABLED : cfg.beep_ind ==
1147 B_IND_FLASH ? IDC_B_IND_FLASH : cfg.beep_ind ==
1148 B_IND_STEADY ? IDC_B_IND_STEADY : IDC_B_IND_DISABLED);
32874aea 1149 SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile);
1150 CheckDlgButton(hwnd, IDC_BELLOVL, cfg.bellovl);
1151 SetDlgItemInt(hwnd, IDC_BELLOVLN, cfg.bellovl_n, FALSE);
1152 MySetDlgItemFlt(hwnd, IDC_BELLOVLT, cfg.bellovl_t / 1000.0);
1153 MySetDlgItemFlt(hwnd, IDC_BELLOVLS, cfg.bellovl_s / 1000.0);
1154
1155 CheckDlgButton(hwnd, IDC_BCE, cfg.bce);
1156 CheckDlgButton(hwnd, IDC_BLINKTEXT, cfg.blinktext);
1157
1158 SetDlgItemText(hwnd, IDC_WINEDIT, cfg.wintitle);
1159 CheckDlgButton(hwnd, IDC_WINNAME, cfg.win_name_always);
1160 CheckDlgButton(hwnd, IDC_HIDEMOUSE, cfg.hide_mouseptr);
1161 CheckDlgButton(hwnd, IDC_SUNKENEDGE, cfg.sunken_edge);
5a73255e 1162 SetDlgItemInt(hwnd, IDC_WINBEDIT, cfg.window_border, FALSE);
32874aea 1163 CheckRadioButton(hwnd, IDC_CURBLOCK, IDC_CURVERT,
1164 cfg.cursor_type == 0 ? IDC_CURBLOCK :
1165 cfg.cursor_type == 1 ? IDC_CURUNDER : IDC_CURVERT);
1166 CheckDlgButton(hwnd, IDC_BLINKCUR, cfg.blink_cur);
1167 CheckDlgButton(hwnd, IDC_SCROLLBAR, cfg.scrollbar);
a401e5f3 1168 CheckDlgButton(hwnd, IDC_SCROLLBARFULLSCREEN, cfg.scrollbar_in_fullscreen);
0ed2f48e 1169 CheckRadioButton(hwnd, IDC_RESIZETERM, IDC_RESIZEEITHER,
ad5c93cc 1170 cfg.resize_action == RESIZE_TERM ? IDC_RESIZETERM :
1171 cfg.resize_action == RESIZE_FONT ? IDC_RESIZEFONT :
0ed2f48e 1172 cfg.resize_action == RESIZE_EITHER ? IDC_RESIZEEITHER :
ad5c93cc 1173 IDC_RESIZENONE);
32874aea 1174 CheckRadioButton(hwnd, IDC_COEALWAYS, IDC_COENORMAL,
1175 cfg.close_on_exit == COE_NORMAL ? IDC_COENORMAL :
1176 cfg.close_on_exit ==
1177 COE_NEVER ? IDC_COENEVER : IDC_COEALWAYS);
1178 CheckDlgButton(hwnd, IDC_CLOSEWARN, cfg.warn_on_close);
1179
1180 SetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype);
1181 SetDlgItemText(hwnd, IDC_TSEDIT, cfg.termspeed);
1182 SetDlgItemText(hwnd, IDC_R_TSEDIT, cfg.termspeed);
1183 SetDlgItemText(hwnd, IDC_RLLUSEREDIT, cfg.localusername);
1184 SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username);
1185 SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename);
00db133f 1186 CheckRadioButton(hwnd, IDC_LSTATOFF, IDC_LSTATPACKET,
1187 cfg.logtype == LGTYP_NONE ? IDC_LSTATOFF :
1188 cfg.logtype == LGTYP_ASCII ? IDC_LSTATASCII :
1189 cfg.logtype == LGTYP_DEBUG ? IDC_LSTATRAW :
1190 IDC_LSTATPACKET);
9f89f96e 1191 CheckRadioButton(hwnd, IDC_LSTATXOVR, IDC_LSTATXASK,
1192 cfg.logxfovr == LGXF_OVR ? IDC_LSTATXOVR :
1193 cfg.logxfovr == LGXF_ASK ? IDC_LSTATXASK :
1194 IDC_LSTATXAPN);
c96a8fef 1195 {
1196 char *p = cfg.environmt;
1cb2aa45 1197 SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_RESETCONTENT, 0, 0);
c96a8fef 1198 while (*p) {
32874aea 1199 SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_ADDSTRING, 0,
1200 (LPARAM) p);
1201 p += strlen(p) + 1;
c96a8fef 1202 }
d74d141c 1203 p = cfg.portfwd;
1204 while (*p) {
1205 SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_ADDSTRING, 0,
1206 (LPARAM) p);
1207 p += strlen(p) + 1;
1208 }
374330e2 1209 }
32874aea 1210 CheckRadioButton(hwnd, IDC_EMBSD, IDC_EMRFC,
1211 cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD);
8faa456c 1212 CheckRadioButton(hwnd, IDC_TPASSIVE, IDC_TACTIVE,
1213 cfg.passive_telnet ? IDC_TPASSIVE : IDC_TACTIVE);
32874aea 1214
1215 SetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype);
1216 SetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username);
1217 CheckDlgButton(hwnd, IDC_NOPTY, cfg.nopty);
1218 CheckDlgButton(hwnd, IDC_COMPRESS, cfg.compression);
cb4d4768 1219 CheckDlgButton(hwnd, IDC_SSH2DES, cfg.ssh2_des_cbc);
32874aea 1220 CheckDlgButton(hwnd, IDC_AGENTFWD, cfg.agentfwd);
5bb641e1 1221 CheckDlgButton(hwnd, IDC_CHANGEUSER, cfg.change_username);
38d228a2 1222 CheckRadioButton(hwnd, IDC_SSHPROT1ONLY, IDC_SSHPROT2ONLY,
759712a6 1223 cfg.sshprot == 1 ? IDC_SSHPROT1 :
38d228a2 1224 cfg.sshprot == 2 ? IDC_SSHPROT2 :
1225 cfg.sshprot == 3 ? IDC_SSHPROT2ONLY : IDC_SSHPROT1ONLY);
32874aea 1226 CheckDlgButton(hwnd, IDC_AUTHTIS, cfg.try_tis_auth);
f091e308 1227 CheckDlgButton(hwnd, IDC_AUTHKI, cfg.try_ki_auth);
32874aea 1228 SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile);
1229 SetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd);
1230
ca20bfcf 1231 {
1232 int i;
1233 static const struct { char *s; int c; } ciphers[] = {
1234 { "3DES", CIPHER_3DES },
1235 { "Blowfish", CIPHER_BLOWFISH },
7f1ae1d2 1236 { "DES", CIPHER_DES },
ca20bfcf 1237 { "AES (SSH 2 only)", CIPHER_AES },
1238 { "-- warn below here --", CIPHER_WARN }
1239 };
1240
1241 /* Set up the "selected ciphers" box. */
1242 /* (cipherlist assumed to contain all ciphers) */
1243 SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_RESETCONTENT, 0, 0);
1244 for (i = 0; i < CIPHER_MAX; i++) {
1245 int c = cfg.ssh_cipherlist[i];
1246 int j, pos;
1247 char *cstr = NULL;
1248 for (j = 0; j < (sizeof ciphers) / (sizeof ciphers[0]); j++) {
1249 if (ciphers[j].c == c) {
1250 cstr = ciphers[j].s;
1251 break;
1252 }
1253 }
1254 pos = SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_ADDSTRING,
1255 0, (LPARAM) cstr);
1256 SendDlgItemMessage(hwnd, IDC_CIPHERLIST, LB_SETITEMDATA,
1257 pos, (LPARAM) c);
1258 }
ca20bfcf 1259
1260 }
1261
32874aea 1262 CheckRadioButton(hwnd, IDC_MBWINDOWS, IDC_MBXTERM,
1263 cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS);
6908fed7 1264 CheckRadioButton(hwnd, IDC_SELTYPELEX, IDC_SELTYPERECT,
1265 cfg.rect_select == 0 ? IDC_SELTYPELEX : IDC_SELTYPERECT);
b90840c3 1266 CheckDlgButton(hwnd, IDC_MOUSEOVERRIDE, cfg.mouse_override);
32874aea 1267 CheckDlgButton(hwnd, IDC_RAWCNP, cfg.rawcnp);
a7419ea4 1268 CheckDlgButton(hwnd, IDC_RTFPASTE, cfg.rtf_paste);
c96a8fef 1269 {
32874aea 1270 static int tabs[4] = { 25, 61, 96, 128 };
1271 SendDlgItemMessage(hwnd, IDC_CCLIST, LB_SETTABSTOPS, 4,
1272 (LPARAM) tabs);
c96a8fef 1273 }
4eeb7d09 1274 for (i = 0; i < 128; i++) {
c96a8fef 1275 char str[100];
1276 sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i,
32874aea 1277 (i >= 0x21 && i != 0x7F) ? i : ' ', cfg.wordness[i]);
1278 SendDlgItemMessage(hwnd, IDC_CCLIST, LB_ADDSTRING, 0,
1279 (LPARAM) str);
c96a8fef 1280 }
1281
32874aea 1282 CheckDlgButton(hwnd, IDC_BOLDCOLOUR, cfg.bold_colour);
1283 CheckDlgButton(hwnd, IDC_PALETTE, cfg.try_palette);
c96a8fef 1284 {
2ceb950f 1285 int i, n;
32874aea 1286 n = SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0);
1287 for (i = n; i-- > 0;)
1288 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
1289 LB_DELETESTRING, i, 0);
1290 for (i = 0; i < 22; i++)
c96a8fef 1291 if (cfg.bold_colour || permcolour[i])
32874aea 1292 SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0,
1293 (LPARAM) colours[i]);
c96a8fef 1294 }
32874aea 1295 SendDlgItemMessage(hwnd, IDC_COLOURLIST, LB_SETCURSEL, 0, 0);
1296 SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE);
1297 SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE);
1298 SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE);
1299
875b193f 1300 {
1301 int i;
1302 char *cp;
b8ae1f0f 1303 strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage)));
875b193f 1304 SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_RESETCONTENT, 0, 0);
a9c02454 1305 CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr);
875b193f 1306 for (i = 0; (cp = cp_enumerate(i)) != NULL; i++) {
1307 SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_ADDSTRING,
1308 0, (LPARAM) cp);
875b193f 1309 }
b8ae1f0f 1310 SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage);
875b193f 1311 }
b44b307a 1312
1313 {
1314 int i, nprinters;
1315 printer_enum *pe;
1316 pe = printer_start_enum(&nprinters);
b44b307a 1317 SendDlgItemMessage(hwnd, IDC_PRINTER, CB_RESETCONTENT, 0, 0);
1318 SendDlgItemMessage(hwnd, IDC_PRINTER, CB_ADDSTRING,
1319 0, (LPARAM) PRINTER_DISABLED_STRING);
1320 for (i = 0; i < nprinters; i++) {
1321 char *printer_name = printer_get_name(pe, i);
1322 SendDlgItemMessage(hwnd, IDC_PRINTER, CB_ADDSTRING,
1323 0, (LPARAM) printer_name);
1324 }
1325 printer_finish_enum(pe);
1326 SetDlgItemText(hwnd, IDC_PRINTER,
1327 *cfg.printer ? cfg.printer : PRINTER_DISABLED_STRING);
1328 }
1329
4eeb7d09 1330 CheckRadioButton(hwnd, IDC_VTXWINDOWS, IDC_VTUNICODE,
32874aea 1331 cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS :
1332 cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI :
1333 cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY :
4eeb7d09 1334 cfg.vtmode == VT_UNICODE ? IDC_VTUNICODE :
32874aea 1335 IDC_VTPOORMAN);
1336
1337 CheckDlgButton(hwnd, IDC_X11_FORWARD, cfg.x11_forward);
1338 SetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display);
d74d141c 1339
1340 CheckDlgButton(hwnd, IDC_LPORT_ALL, cfg.lport_acceptall);
beefa433 1341 CheckDlgButton(hwnd, IDC_RPORT_ALL, cfg.rport_acceptall);
d74d141c 1342 CheckRadioButton(hwnd, IDC_PFWDLOCAL, IDC_PFWDREMOTE, IDC_PFWDLOCAL);
8eebd221 1343
1344 /* proxy config */
1345 CheckRadioButton(hwnd, IDC_PROXYTYPENONE, IDC_PROXYTYPETELNET,
1346 cfg.proxy_type == PROXY_HTTP ? IDC_PROXYTYPEHTTP :
1347 cfg.proxy_type == PROXY_SOCKS ? IDC_PROXYTYPESOCKS :
1348 cfg.proxy_type == PROXY_TELNET ? IDC_PROXYTYPETELNET : IDC_PROXYTYPENONE);
1349 SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host);
1350 SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE);
1351 SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list);
1352 SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command);
1353 SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username);
1354 SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password);
1355 CheckRadioButton(hwnd, IDC_PROXYSOCKSVER5, IDC_PROXYSOCKSVER4,
1356 cfg.proxy_socks_version == 4 ? IDC_PROXYSOCKSVER4 : IDC_PROXYSOCKSVER5);
2c9c6388 1357
1358 /* SSH bugs config */
1359 SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_RESETCONTENT, 0, 0);
1360 SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_ADDSTRING, 0, (LPARAM)"Auto");
1361 SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_ADDSTRING, 0, (LPARAM)"Off");
1362 SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_ADDSTRING, 0, (LPARAM)"On");
1363 SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1, CB_SETCURSEL,
1364 cfg.sshbug_ignore1 == BUG_ON ? 2 :
1365 cfg.sshbug_ignore1 == BUG_OFF ? 1 : 0, 0);
1366 SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_RESETCONTENT, 0, 0);
1367 SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_ADDSTRING, 0, (LPARAM)"Auto");
1368 SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_ADDSTRING, 0, (LPARAM)"Off");
1369 SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_ADDSTRING, 0, (LPARAM)"On");
1370 SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1, CB_SETCURSEL,
1371 cfg.sshbug_plainpw1 == BUG_ON ? 2 :
1372 cfg.sshbug_plainpw1 == BUG_OFF ? 1 : 0, 0);
1373 SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_RESETCONTENT, 0, 0);
1374 SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_ADDSTRING, 0, (LPARAM)"Auto");
1375 SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_ADDSTRING, 0, (LPARAM)"Off");
1376 SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_ADDSTRING, 0, (LPARAM)"On");
1377 SendDlgItemMessage(hwnd, IDC_BUGD_RSA1, CB_SETCURSEL,
1378 cfg.sshbug_rsa1 == BUG_ON ? 2 :
1379 cfg.sshbug_rsa1 == BUG_OFF ? 1 : 0, 0);
1380 SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_RESETCONTENT, 0, 0);
1381 SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_ADDSTRING, 0, (LPARAM)"Auto");
1382 SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_ADDSTRING, 0, (LPARAM)"Off");
1383 SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_ADDSTRING, 0, (LPARAM)"On");
1384 SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2, CB_SETCURSEL,
1385 cfg.sshbug_hmac2 == BUG_ON ? 2 :
1386 cfg.sshbug_hmac2 == BUG_OFF ? 1 : 0, 0);
1387 SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_RESETCONTENT, 0, 0);
1388 SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_ADDSTRING, 0, (LPARAM)"Auto");
1389 SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_ADDSTRING, 0, (LPARAM)"Off");
1390 SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_ADDSTRING, 0, (LPARAM)"On");
1391 SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2, CB_SETCURSEL,
1392 cfg.sshbug_derivekey2 == BUG_ON ? 2 :
1393 cfg.sshbug_derivekey2 == BUG_OFF ? 1 : 0, 0);
1394 SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_RESETCONTENT, 0, 0);
1395 SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_ADDSTRING, 0, (LPARAM)"Auto");
1396 SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_ADDSTRING, 0, (LPARAM)"Off");
1397 SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_ADDSTRING, 0, (LPARAM)"On");
1398 SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_SETCURSEL,
1399 cfg.sshbug_rsapad2 == BUG_ON ? 2 :
1400 cfg.sshbug_rsapad2 == BUG_OFF ? 1 : 0, 0);
8e975795 1401 SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_RESETCONTENT, 0, 0);
1402 SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Auto");
1403 SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Off");
1404 SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"On");
1405 SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_SETCURSEL,
1406 cfg.sshbug_dhgex2 == BUG_ON ? 2 :
1407 cfg.sshbug_dhgex2 == BUG_OFF ? 1 : 0, 0);
374330e2 1408}
1409
927d4fc5 1410struct treeview_faff {
1411 HWND treeview;
1412 HTREEITEM lastat[4];
1413};
1414
1415static HTREEITEM treeview_insert(struct treeview_faff *faff,
32874aea 1416 int level, char *text)
1417{
927d4fc5 1418 TVINSERTSTRUCT ins;
1419 int i;
1420 HTREEITEM newitem;
32874aea 1421 ins.hParent = (level > 0 ? faff->lastat[level - 1] : TVI_ROOT);
927d4fc5 1422 ins.hInsertAfter = faff->lastat[level];
06a03685 1423#if _WIN32_IE >= 0x0400 && defined NONAMELESSUNION
1424#define INSITEM DUMMYUNIONNAME.item
1425#else
1426#define INSITEM item
1427#endif
1428 ins.INSITEM.mask = TVIF_TEXT;
1429 ins.INSITEM.pszText = text;
927d4fc5 1430 newitem = TreeView_InsertItem(faff->treeview, &ins);
1431 if (level > 0)
32874aea 1432 TreeView_Expand(faff->treeview, faff->lastat[level - 1],
1433 TVE_EXPAND);
927d4fc5 1434 faff->lastat[level] = newitem;
32874aea 1435 for (i = level + 1; i < 4; i++)
1436 faff->lastat[i] = NULL;
927d4fc5 1437 return newitem;
1438}
1439
c96a8fef 1440/*
3ac9cd9f 1441 * Create the panelfuls of controls in the configuration box.
1442 */
32874aea 1443static void create_controls(HWND hwnd, int dlgtype, int panel)
1444{
3ac9cd9f 1445 if (panel == sessionpanelstart) {
566bba77 1446 /* The Session panel. Accelerators used: [acgoh] nprtis elvd w */
32874aea 1447 struct ctlpos cp;
1448 ctlposinit(&cp, hwnd, 80, 3, 13);
1449 bartitle(&cp, "Basic options for your PuTTY session",
1450 IDC_TITLE_SESSION);
1451 if (dlgtype == 0) {
42ff6345 1452 beginbox(&cp, "Specify your connection by host name or IP address",
32874aea 1453 IDC_BOX_SESSION1);
1454 multiedit(&cp,
42ff6345 1455 "Host &Name (or IP address)",
1456 IDC_HOSTSTATIC, IDC_HOST, 75,
32874aea 1457 "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL);
1458 if (backends[3].backend == NULL) {
1459 /* this is PuTTYtel, so only three protocols available */
4eeb7d09 1460 radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3,
32874aea 1461 "&Raw", IDC_PROTRAW,
1462 "&Telnet", IDC_PROTTELNET,
1463 "Rlog&in", IDC_PROTRLOGIN, NULL);
1464 } else {
1465 radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4,
1466 "&Raw", IDC_PROTRAW,
1467 "&Telnet", IDC_PROTTELNET,
1468 "Rlog&in", IDC_PROTRLOGIN,
3ac9cd9f 1469#ifdef FWHACK
566bba77 1470 "&SSH/hack",
3ac9cd9f 1471#else
566bba77 1472 "&SSH",
3ac9cd9f 1473#endif
32874aea 1474 IDC_PROTSSH, NULL);
1475 }
1476 endbox(&cp);
1477 beginbox(&cp, "Load, save or delete a stored session",
1478 IDC_BOX_SESSION2);
1479 sesssaver(&cp, "Sav&ed Sessions",
1480 IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST,
1481 "&Load", IDC_SESSLOAD,
566bba77 1482 "Sa&ve", IDC_SESSSAVE, "&Delete", IDC_SESSDEL, NULL);
32874aea 1483 endbox(&cp);
1484 }
1485 beginbox(&cp, NULL, IDC_BOX_SESSION3);
1486 radioline(&cp, "Close &window on exit:", IDC_CLOSEEXIT, 4,
1487 "Always", IDC_COEALWAYS,
1488 "Never", IDC_COENEVER,
1489 "Only on clean exit", IDC_COENORMAL, NULL);
1490 endbox(&cp);
3ac9cd9f 1491 }
1492
0965bee0 1493 if (panel == loggingpanelstart) {
566bba77 1494 /* The Logging panel. Accelerators used: [acgoh] tplsfwe */
32874aea 1495 struct ctlpos cp;
1496 ctlposinit(&cp, hwnd, 80, 3, 13);
1497 bartitle(&cp, "Options controlling session logging",
1498 IDC_TITLE_LOGGING);
1499 beginbox(&cp, NULL, IDC_BOX_LOGGING1);
1500 radiobig(&cp,
1501 "Session logging:", IDC_LSTATSTATIC,
1502 "Logging &turned off completely", IDC_LSTATOFF,
1503 "Log &printable output only", IDC_LSTATASCII,
00db133f 1504 "&Log all session output", IDC_LSTATRAW,
1505 "Log &SSH packet data", IDC_LSTATPACKET,
1506 NULL);
32874aea 1507 editbutton(&cp, "Log &file name:",
1508 IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...",
1509 IDC_LGFBUTTON);
66ee282a 1510 statictext(&cp, "(Log file name can contain &&Y, &&M, &&D for date,"
1511 " &&T for time, and &&H for host name)", 2, IDC_LGFEXPLAIN);
32874aea 1512 radiobig(&cp,
1513 "What to do if the log file already &exists:",
1514 IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR,
1515 "Always append to the end of it", IDC_LSTATXAPN,
1516 "Ask the user every time", IDC_LSTATXASK, NULL);
1517 endbox(&cp);
0965bee0 1518 }
1519
3ac9cd9f 1520 if (panel == terminalpanelstart) {
b44b307a 1521 /* The Terminal panel. Accelerators used: [acgoh] wdren lts p */
32874aea 1522 struct ctlpos cp;
1523 ctlposinit(&cp, hwnd, 80, 3, 13);
1524 bartitle(&cp, "Options controlling the terminal emulation",
1525 IDC_TITLE_TERMINAL);
1526 beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1);
1527 checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE);
1528 checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM);
566bba77 1529 checkbox(&cp, "Implicit C&R in every LF", IDC_LFHASCR);
32874aea 1530 checkbox(&cp, "Use background colour to &erase screen", IDC_BCE);
1531 checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT);
1532 multiedit(&cp,
1533 "An&swerback to ^E:", IDC_ANSWERBACK,
1534 IDC_ANSWEREDIT, 100, NULL);
1535 endbox(&cp);
1536
1537 beginbox(&cp, "Line discipline options", IDC_BOX_TERMINAL2);
566bba77 1538 radioline(&cp, "&Local echo:", IDC_ECHOSTATIC, 3,
32874aea 1539 "Auto", IDC_ECHOBACKEND,
1540 "Force on", IDC_ECHOYES, "Force off", IDC_ECHONO, NULL);
1541 radioline(&cp, "Local line edi&ting:", IDC_EDITSTATIC, 3,
1542 "Auto", IDC_EDITBACKEND,
1543 "Force on", IDC_EDITYES, "Force off", IDC_EDITNO, NULL);
1544 endbox(&cp);
b44b307a 1545
1546 beginbox(&cp, "Remote-controlled printing", IDC_BOX_TERMINAL3);
1547 combobox(&cp, "&Printer to send ANSI printer output to:",
1548 IDC_PRINTERSTATIC, IDC_PRINTER);
1549 endbox(&cp);
3ac9cd9f 1550 }
1551
0d2086c5 1552 if (panel == featurespanelstart) {
c0d36a72 1553 /* The Features panel. Accelerators used: [acgoh] ukswtbrx */
0d2086c5 1554 struct ctlpos cp;
1555 ctlposinit(&cp, hwnd, 80, 3, 13);
1556 bartitle(&cp, "Enabling and disabling advanced terminal features ",
1557 IDC_TITLE_FEATURES);
1558 beginbox(&cp, NULL, IDC_BOX_FEATURES1);
1559 checkbox(&cp, "Disable application c&ursor keys mode", IDC_NOAPPLICC);
1560 checkbox(&cp, "Disable application &keypad mode", IDC_NOAPPLICK);
c0d36a72 1561 checkbox(&cp, "Disable &xterm-style mouse reporting", IDC_NOMOUSEREP);
0d2086c5 1562 checkbox(&cp, "Disable remote-controlled terminal re&sizing",
1563 IDC_NORESIZE);
17aa543f 1564 checkbox(&cp, "Disable s&witching to alternate terminal screen",
0d2086c5 1565 IDC_NOALTSCREEN);
1566 checkbox(&cp, "Disable remote-controlled window &title changing",
1567 IDC_NOWINTITLE);
1568 checkbox(&cp, "Disable destructive &backspace on server sending ^?",
1569 IDC_NODBACKSPACE);
1570 checkbox(&cp, "Disable remote-controlled cha&racter set configuration",
1571 IDC_NOCHARSET);
1572 endbox(&cp);
1573 }
1574
156686ef 1575 if (panel == bellpanelstart) {
566bba77 1576 /* The Bell panel. Accelerators used: [acgoh] bdsm wit */
32874aea 1577 struct ctlpos cp;
1578 ctlposinit(&cp, hwnd, 80, 3, 13);
1579 bartitle(&cp, "Options controlling the terminal bell",
1580 IDC_TITLE_BELL);
1581 beginbox(&cp, "Set the style of bell", IDC_BOX_BELL1);
1582 radiobig(&cp,
1583 "Action to happen when a &bell occurs:", IDC_BELLSTATIC,
1584 "None (bell disabled)", IDC_BELL_DISABLED,
1585 "Play Windows Default Sound", IDC_BELL_DEFAULT,
1586 "Play a custom sound file", IDC_BELL_WAVEFILE,
1587 "Visual bell (flash window)", IDC_BELL_VISUAL, NULL);
03169ad0 1588 editbutton(&cp, "Custom sound file to play as a bell:",
1589 IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT,
1590 "Bro&wse...", IDC_BELL_WAVEBROWSE);
f8a28d1f 1591 radioline(&cp, "Taskbar/caption &indication on bell:",
1592 IDC_B_IND_STATIC, 3, "Disabled", IDC_B_IND_DISABLED,
1593 "Flashing", IDC_B_IND_FLASH, "Steady", IDC_B_IND_STEADY,
1594 NULL);
32874aea 1595 endbox(&cp);
156686ef 1596 beginbox(&cp, "Control the bell overload behaviour",
1597 IDC_BOX_BELL2);
1598 checkbox(&cp, "Bell is temporarily &disabled when over-used",
1599 IDC_BELLOVL);
1600 staticedit(&cp, "Over-use means this &many bells...",
1601 IDC_BELLOVLNSTATIC, IDC_BELLOVLN, 20);
9f89f96e 1602 staticedit(&cp, "... in &this many seconds",
156686ef 1603 IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20);
32874aea 1604 statictext(&cp,
1605 "The bell is re-enabled after a few seconds of silence.",
66ee282a 1606 1, IDC_BELLOVLEXPLAIN);
32874aea 1607 staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC,
1608 IDC_BELLOVLS, 20);
1609 endbox(&cp);
156686ef 1610 }
1611
3ac9cd9f 1612 if (panel == keyboardpanelstart) {
17aa543f 1613 /* The Keyboard panel. Accelerators used: [acgoh] bef rntd */
32874aea 1614 struct ctlpos cp;
1615 ctlposinit(&cp, hwnd, 80, 3, 13);
d0cadfcd 1616 bartitle(&cp, "Options controlling the effects of keys",
1617 IDC_TITLE_KEYBOARD);
32874aea 1618 beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1);
1619 radioline(&cp, "The &Backspace key", IDC_DELSTATIC, 2,
1620 "Control-H", IDC_DEL008,
1621 "Control-? (127)", IDC_DEL127, NULL);
566bba77 1622 radioline(&cp, "The Home and &End keys", IDC_HOMESTATIC, 2,
32874aea 1623 "Standard", IDC_HOMETILDE, "rxvt", IDC_HOMERXVT, NULL);
1624 radioline(&cp, "The &Function keys and keypad", IDC_FUNCSTATIC, 3,
1625 "ESC[n~", IDC_FUNCTILDE,
1626 "Linux", IDC_FUNCLINUX,
1627 "Xterm R6", IDC_FUNCXTERM,
f37caa11 1628 "VT400", IDC_FUNCVT400,
32874aea 1629 "VT100+", IDC_FUNCVT100P, "SCO", IDC_FUNCSCO, NULL);
1630 endbox(&cp);
1631 beginbox(&cp, "Application keypad settings:", IDC_BOX_KEYBOARD2);
32874aea 1632 radioline(&cp, "Initial state of cu&rsor keys:", IDC_CURSTATIC, 2,
1633 "Normal", IDC_CURNORMAL,
1634 "Application", IDC_CURAPPLIC, NULL);
32874aea 1635 radioline(&cp, "Initial state of &numeric keypad:", IDC_KPSTATIC,
1636 3, "Normal", IDC_KPNORMAL, "Application", IDC_KPAPPLIC,
1637 "NetHack", IDC_KPNH, NULL);
1638 endbox(&cp);
1639 beginbox(&cp, "Enable extra keyboard features:",
1640 IDC_BOX_KEYBOARD3);
1641 checkbox(&cp, "AltGr ac&ts as Compose key", IDC_COMPOSEKEY);
1642 checkbox(&cp, "Control-Alt is &different from AltGr",
1643 IDC_CTRLALTKEYS);
1644 endbox(&cp);
3ac9cd9f 1645 }
1646
1647 if (panel == windowpanelstart) {
566bba77 1648 /* The Window panel. Accelerators used: [acgoh] rmz sdikp */
32874aea 1649 struct ctlpos cp;
1650 ctlposinit(&cp, hwnd, 80, 3, 13);
1651 bartitle(&cp, "Options controlling PuTTY's window",
1652 IDC_TITLE_WINDOW);
1653 beginbox(&cp, "Set the size of the window", IDC_BOX_WINDOW1);
1654 multiedit(&cp,
1655 "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50,
1656 "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL);
d0cadfcd 1657 radiobig(&cp, "When window is resi&zed:", IDC_RESIZESTATIC,
1658 "Change the number of rows and columns", IDC_RESIZETERM,
1659 "Change the size of the font", IDC_RESIZEFONT,
1660 "Change font size only when maximised", IDC_RESIZEEITHER,
1661 "Forbid resizing completely", IDC_RESIZENONE, NULL);
32874aea 1662 endbox(&cp);
1663 beginbox(&cp, "Control the scrollback in the window",
1664 IDC_BOX_WINDOW2);
1665 staticedit(&cp, "Lines of &scrollback",
1666 IDC_SAVESTATIC, IDC_SAVEEDIT, 50);
1667 checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR);
a401e5f3 1668 checkbox(&cp, "D&isplay scrollbar in full screen mode", IDC_SCROLLBARFULLSCREEN);
32874aea 1669 checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY);
1670 checkbox(&cp, "Reset scrollback on dis&play activity",
1671 IDC_SCROLLDISP);
1672 endbox(&cp);
3ac9cd9f 1673 }
1674
1675 if (panel == appearancepanelstart) {
566bba77 1676 /* The Appearance panel. Accelerators used: [acgoh] luvb n ti p s */
32874aea 1677 struct ctlpos cp;
1678 ctlposinit(&cp, hwnd, 80, 3, 13);
d0cadfcd 1679 bartitle(&cp, "Configure the appearance of PuTTY's window",
1680 IDC_TITLE_APPEARANCE);
32874aea 1681 beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1);
1682 radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3,
1683 "B&lock", IDC_CURBLOCK,
1684 "&Underline", IDC_CURUNDER,
1685 "&Vertical line", IDC_CURVERT, NULL);
1686 checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR);
1687 endbox(&cp);
1688 beginbox(&cp, "Set the font used in the terminal window",
1689 IDC_BOX_APPEARANCE2);
566bba77 1690 staticbtn(&cp, "", IDC_FONTSTATIC, "Cha&nge...", IDC_CHOOSEFONT);
32874aea 1691 endbox(&cp);
1692 beginbox(&cp, "Adjust the use of the window title",
1693 IDC_BOX_APPEARANCE3);
1694 multiedit(&cp,
1695 "Window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, NULL);
1696 checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME);
1697 endbox(&cp);
1698 beginbox(&cp, "Adjust the use of the mouse pointer",
1699 IDC_BOX_APPEARANCE4);
1700 checkbox(&cp, "Hide mouse &pointer when typing in window",
1701 IDC_HIDEMOUSE);
1702 endbox(&cp);
1703 beginbox(&cp, "Adjust the window border", IDC_BOX_APPEARANCE5);
1704 checkbox(&cp, "&Sunken-edge border (slightly thicker)",
1705 IDC_SUNKENEDGE);
5a73255e 1706 staticedit(&cp, "Gap between text and window edge",
1707 IDC_WINBSTATIC, IDC_WINBEDIT, 20);
32874aea 1708 endbox(&cp);
3ac9cd9f 1709 }
1710
d0cadfcd 1711 if (panel == behaviourpanelstart) {
566bba77 1712 /* The Behaviour panel. Accelerators used: [acgoh] w4yltf */
d0cadfcd 1713 struct ctlpos cp;
1714 ctlposinit(&cp, hwnd, 80, 3, 13);
1715 bartitle(&cp, "Configure the behaviour of PuTTY's window",
1716 IDC_TITLE_WINDOW);
1717 beginbox(&cp, NULL, IDC_BOX_BEHAVIOUR1);
1718 checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN);
1719 checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4);
1720 checkbox(&cp, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE);
1721 checkbox(&cp, "System menu appears on A&LT alone", IDC_ALTONLY);
1722 checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP);
1723 checkbox(&cp, "&Full screen on Alt-Enter", IDC_FULLSCREENONALTENTER);
1724 endbox(&cp);
1725 }
1726
3ac9cd9f 1727 if (panel == translationpanelstart) {
566bba77 1728 /* The Translation panel. Accelerators used: [acgoh] rxbepus */
32874aea 1729 struct ctlpos cp;
1730 ctlposinit(&cp, hwnd, 80, 3, 13);
1731 bartitle(&cp, "Options controlling character set translation",
1732 IDC_TITLE_TRANSLATION);
b682f470 1733 beginbox(&cp, "Character set translation on received data",
a9c02454 1734 IDC_BOX_TRANSLATION1);
8f57d753 1735 combobox(&cp, "&Received data assumed to be in which character set:",
b682f470 1736 IDC_CODEPAGESTATIC, IDC_CODEPAGE);
1737 endbox(&cp);
a9c02454 1738 beginbox(&cp, "Enable character set translation on input data",
1739 IDC_BOX_TRANSLATION2);
acb796a2 1740 checkbox(&cp, "Cap&s Lock acts as Cyrillic switch",
a9c02454 1741 IDC_CAPSLOCKCYR);
1742 endbox(&cp);
32874aea 1743 beginbox(&cp, "Adjust how PuTTY displays line drawing characters",
a9c02454 1744 IDC_BOX_TRANSLATION3);
32874aea 1745 radiobig(&cp,
1746 "Handling of line drawing characters:", IDC_VTSTATIC,
1747 "Font has &XWindows encoding", IDC_VTXWINDOWS,
1748 "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI,
1749 "Use font in O&EM mode only", IDC_VTOEMONLY,
1750 "&Poor man's line drawing (" "+" ", " "-" " and " "|" ")",
4eeb7d09 1751 IDC_VTPOORMAN, "&Unicode mode", IDC_VTUNICODE, NULL);
32874aea 1752 endbox(&cp);
3ac9cd9f 1753 }
1754
1755 if (panel == selectionpanelstart) {
566bba77 1756 /* The Selection panel. Accelerators used: [acgoh] df wxp est nr */
32874aea 1757 struct ctlpos cp;
1758 ctlposinit(&cp, hwnd, 80, 3, 13);
1759 bartitle(&cp, "Options controlling copy and paste",
1760 IDC_TITLE_SELECTION);
1761 beginbox(&cp, "Translation of pasted characters",
1762 IDC_BOX_SELECTION1);
1763 checkbox(&cp,
1764 "&Don't translate line drawing chars into +, - and |",
1765 IDC_RAWCNP);
a7419ea4 1766 checkbox(&cp,
1767 "Paste to clipboard in RT&F as well as plain text",
1768 IDC_RTFPASTE);
32874aea 1769 endbox(&cp);
1770 beginbox(&cp, "Control which mouse button does which thing",
1771 IDC_BOX_SELECTION2);
1772 radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC,
1773 "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS,
1774 "&xterm (Right extends, Middle pastes)", IDC_MBXTERM,
1775 NULL);
b90840c3 1776 checkbox(&cp,
1777 "Shift overrides a&pplication's use of mouse",
1778 IDC_MOUSEOVERRIDE);
6908fed7 1779 radioline(&cp,
1780 "Default selection mode (Alt+drag does the other one):",
1781 IDC_SELTYPESTATIC, 2,
1782 "&Normal", IDC_SELTYPELEX,
1783 "&Rectangular block", IDC_SELTYPERECT, NULL);
32874aea 1784 endbox(&cp);
1785 beginbox(&cp, "Control the select-one-word-at-a-time mode",
1786 IDC_BOX_SELECTION3);
566bba77 1787 charclass(&cp, "Charact&er classes:", IDC_CCSTATIC, IDC_CCLIST,
32874aea 1788 "&Set", IDC_CCSET, IDC_CCEDIT,
1789 "&to class", IDC_CCSTATIC2);
1790 endbox(&cp);
3ac9cd9f 1791 }
1792
1793 if (panel == colourspanelstart) {
566bba77 1794 /* The Colours panel. Accelerators used: [acgoh] blum */
32874aea 1795 struct ctlpos cp;
1796 ctlposinit(&cp, hwnd, 80, 3, 13);
1797 bartitle(&cp, "Options controlling use of colours",
1798 IDC_TITLE_COLOURS);
1799 beginbox(&cp, "General options for colour usage",
1800 IDC_BOX_COLOURS1);
1801 checkbox(&cp, "&Bolded text is a different colour",
1802 IDC_BOLDCOLOUR);
1803 checkbox(&cp, "Attempt to use &logical palettes", IDC_PALETTE);
1804 endbox(&cp);
1805 beginbox(&cp, "Adjust the precise colours PuTTY displays",
1806 IDC_BOX_COLOURS2);
1807 colouredit(&cp, "Select a colo&ur and then click to modify it:",
1808 IDC_COLOURSTATIC, IDC_COLOURLIST,
1809 "&Modify...", IDC_CHANGE,
1810 "Red:", IDC_RSTATIC, IDC_RVALUE,
1811 "Green:", IDC_GSTATIC, IDC_GVALUE,
1812 "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL);
1813 endbox(&cp);
3ac9cd9f 1814 }
1815
1816 if (panel == connectionpanelstart) {
566bba77 1817 /* The Connection panel. Accelerators used: [acgoh] tukn */
32874aea 1818 struct ctlpos cp;
1819 ctlposinit(&cp, hwnd, 80, 3, 13);
1820 bartitle(&cp, "Options controlling the connection",
1821 IDC_TITLE_CONNECTION);
1822 if (dlgtype == 0) {
1823 beginbox(&cp, "Data to send to the server",
1824 IDC_BOX_CONNECTION1);
1825 staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC,
1826 IDC_TTEDIT, 50);
1827 staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC,
1828 IDC_LOGEDIT, 50);
1829 endbox(&cp);
a5f3e637 1830 } else {
1831 beginbox(&cp, "Adjust telnet session.", IDC_BOX_CONNECTION1);
1832 checkbox(&cp, "Keyboard sends telnet Backspace and Interrupt",
1833 IDC_TELNETKEY);
eee63b77 1834 checkbox(&cp, "Return key sends telnet New Line instead of ^M",
1835 IDC_TELNETRET);
a5f3e637 1836 endbox(&cp);
32874aea 1837 }
1838 beginbox(&cp, "Sending of null packets to keep session active",
1839 IDC_BOX_CONNECTION2);
1840 staticedit(&cp, "Seconds between &keepalives (0 to turn off)",
1841 IDC_PINGSTATIC, IDC_PINGEDIT, 20);
1842 endbox(&cp);
2184a5d9 1843 if (dlgtype == 0) {
1844 beginbox(&cp, "Low-level TCP connection options",
1845 IDC_BOX_CONNECTION3);
1846 checkbox(&cp, "Disable &Nagle's algorithm (TCP_NODELAY option)",
1847 IDC_NODELAY);
1848 endbox(&cp);
1849 }
3ac9cd9f 1850 }
1851
8eebd221 1852 if (panel == proxypanelstart) {
1853 /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmv */
1854 struct ctlpos cp;
1855 ctlposinit(&cp, hwnd, 80, 3, 13);
1856 if (dlgtype == 0) {
1857 bartitle(&cp, "Options controlling proxy usage",
1858 IDC_TITLE_PROXY);
1859 beginbox(&cp, "Proxy basics", IDC_BOX_PROXY1);
1860 radioline(&cp, "Proxy type:", IDC_PROXYTYPESTATIC, 4,
1861 "&None", IDC_PROXYTYPENONE,
1862 "H&TTP", IDC_PROXYTYPEHTTP,
1863 "&SOCKS", IDC_PROXYTYPESOCKS,
1864 "Te&lnet", IDC_PROXYTYPETELNET, NULL);
1865 multiedit(&cp,
1866 "Prox&y Host", IDC_PROXYHOSTSTATIC, IDC_PROXYHOSTEDIT, 80,
1867 "&Port", IDC_PROXYPORTSTATIC, IDC_PROXYPORTEDIT, 20, NULL);
1868 multiedit(&cp,
1869 "&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC,
1870 IDC_PROXYEXCLUDEEDIT, 100, NULL);
1871 staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC,
1872 IDC_PROXYUSEREDIT, 60);
1549e076 1873 staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
1874 IDC_PROXYPASSEDIT, 60);
8eebd221 1875 endbox(&cp);
1876 beginbox(&cp, "Misc. proxy settings", IDC_BOX_PROXY2);
1877 multiedit(&cp,
1878 "Telnet co&mmand", IDC_PROXYTELNETCMDSTATIC,
1879 IDC_PROXYTELNETCMDEDIT, 100, NULL);
1880 radioline(&cp, "SOCKS &Version", IDC_PROXYSOCKSVERSTATIC,
1881 2, "Version 5", IDC_PROXYSOCKSVER5, "Version 4",
1882 IDC_PROXYSOCKSVER4, NULL);
1883 endbox(&cp);
1884 }
1885 }
1886
3ac9cd9f 1887 if (panel == telnetpanelstart) {
566bba77 1888 /* The Telnet panel. Accelerators used: [acgoh] svldr bftk */
32874aea 1889 struct ctlpos cp;
1890 ctlposinit(&cp, hwnd, 80, 3, 13);
1891 if (dlgtype == 0) {
1892 bartitle(&cp, "Options controlling Telnet connections",
1893 IDC_TITLE_TELNET);
1894 beginbox(&cp, "Data to send to the server", IDC_BOX_TELNET1);
1895 staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC,
1896 IDC_TSEDIT, 50);
1897 envsetter(&cp, "Environment variables:", IDC_ENVSTATIC,
1898 "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue",
1899 IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd",
1900 IDC_ENVADD, "&Remove", IDC_ENVREMOVE);
1901 endbox(&cp);
1902 beginbox(&cp, "Telnet protocol adjustments", IDC_BOX_TELNET2);
1903 radioline(&cp, "Handling of OLD_ENVIRON ambiguity:",
1904 IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD,
1905 "R&FC 1408 (unusual)", IDC_EMRFC, NULL);
8faa456c 1906 radioline(&cp, "&Telnet negotiation mode:", IDC_ACTSTATIC, 2,
1907 "Passive", IDC_TPASSIVE, "Active",
1908 IDC_TACTIVE, NULL);
a5f3e637 1909 checkbox(&cp, "&Keyboard sends telnet Backspace and Interrupt",
1910 IDC_TELNETKEY);
eee63b77 1911 checkbox(&cp, "Return key sends telnet New Line instead of ^M",
1912 IDC_TELNETRET);
32874aea 1913 endbox(&cp);
1914 }
3ac9cd9f 1915 }
1916
1917 if (panel == rloginpanelstart) {
566bba77 1918 /* The Rlogin panel. Accelerators used: [acgoh] sl */
32874aea 1919 struct ctlpos cp;
1920 ctlposinit(&cp, hwnd, 80, 3, 13);
1921 if (dlgtype == 0) {
1922 bartitle(&cp, "Options controlling Rlogin connections",
1923 IDC_TITLE_RLOGIN);
1924 beginbox(&cp, "Data to send to the server", IDC_BOX_RLOGIN1);
1925 staticedit(&cp, "Terminal-&speed string", IDC_R_TSSTATIC,
1926 IDC_R_TSEDIT, 50);
1927 staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC,
1928 IDC_RLLUSEREDIT, 50);
1929 endbox(&cp);
1930 }
3ac9cd9f 1931 }
1932
1933 if (panel == sshpanelstart) {
759712a6 1934 /* The SSH panel. Accelerators used: [acgoh] r pe12ni sd */
32874aea 1935 struct ctlpos cp;
1936 ctlposinit(&cp, hwnd, 80, 3, 13);
1937 if (dlgtype == 0) {
1938 bartitle(&cp, "Options controlling SSH connections",
1939 IDC_TITLE_SSH);
1940 beginbox(&cp, "Data to send to the server", IDC_BOX_SSH1);
1941 multiedit(&cp,
1942 "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100,
1943 NULL);
1944 endbox(&cp);
ca20bfcf 1945 beginbox(&cp, "Protocol options", IDC_BOX_SSH2);
32874aea 1946 checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY);
1947 checkbox(&cp, "Enable compr&ession", IDC_COMPRESS);
1948 radioline(&cp, "Preferred SSH protocol version:",
38d228a2 1949 IDC_SSHPROTSTATIC, 4,
1950 "1 on&ly", IDC_SSHPROT1ONLY,
759712a6 1951 "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2,
1952 "2 o&nly", IDC_SSHPROT2ONLY, NULL);
32874aea 1953 endbox(&cp);
ca20bfcf 1954 beginbox(&cp, "Encryption options", IDC_BOX_SSH3);
1955 prefslist(&cipherlist, &cp, "Encryption cipher &selection policy:",
1956 IDC_CIPHERSTATIC2, IDC_CIPHERLIST, IDC_CIPHERUP,
1957 IDC_CIPHERDN);
cb4d4768 1958 checkbox(&cp, "Enable non-standard use of single-&DES in SSH 2",
1959 IDC_SSH2DES);
ca20bfcf 1960 endbox(&cp);
1961 }
1962 }
1963
1964 if (panel == sshauthpanelstart) {
566bba77 1965 /* The SSH authentication panel. Accelerators used: [acgoh] m fkiuw */
ca20bfcf 1966 struct ctlpos cp;
1967 ctlposinit(&cp, hwnd, 80, 3, 13);
1968 if (dlgtype == 0) {
1969 bartitle(&cp, "Options controlling SSH authentication",
1970 IDC_TITLE_SSHAUTH);
1971 beginbox(&cp, "Authentication methods",
1972 IDC_BOX_SSHAUTH1);
f091e308 1973 checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication (SSH1)",
ca20bfcf 1974 IDC_AUTHTIS);
f091e308 1975 checkbox(&cp, "Attempt \"keyboard-&interactive\" authentication"
1976 " (SSH2)", IDC_AUTHKI);
ca20bfcf 1977 endbox(&cp);
1978 beginbox(&cp, "Authentication parameters",
1979 IDC_BOX_SSHAUTH2);
1980 checkbox(&cp, "Allow agent &forwarding", IDC_AGENTFWD);
5bb641e1 1981 checkbox(&cp, "Allow attempted changes of &username in SSH2",
1982 IDC_CHANGEUSER);
ca20bfcf 1983 editbutton(&cp, "Private &key file for authentication:",
1984 IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...",
1985 IDC_PKBUTTON);
1986 endbox(&cp);
32874aea 1987 }
3ac9cd9f 1988 }
1989
2c9c6388 1990 if (panel == sshbugspanelstart) {
1991 /* The SSH bugs panel. Accelerators used: [acgoh] isrmep */
1992 struct ctlpos cp;
1993 ctlposinit(&cp, hwnd, 80, 3, 13);
1994 if (dlgtype == 0) {
1995 bartitle(&cp, "Workarounds for SSH server bugs",
1996 IDC_TITLE_SSHBUGS);
1997 beginbox(&cp, "Detection of known bugs in SSH servers",
1998 IDC_BOX_SSHBUGS1);
1999 staticddl(&cp, "Chokes on SSH1 &ignore messages",
2000 IDC_BUGS_IGNORE1, IDC_BUGD_IGNORE1, 20);
2001 staticddl(&cp, "Refuses all SSH1 pa&ssword camouflage",
2002 IDC_BUGS_PLAINPW1, IDC_BUGD_PLAINPW1, 20);
2003 staticddl(&cp, "Chokes on SSH1 &RSA authentication",
2004 IDC_BUGS_RSA1, IDC_BUGD_RSA1, 20);
2005 staticddl(&cp, "Miscomputes SSH2 H&MAC keys",
2006 IDC_BUGS_HMAC2, IDC_BUGD_HMAC2, 20);
2007 staticddl(&cp, "Miscomputes SSH2 &encryption keys",
2008 IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20);
2009 staticddl(&cp, "Requires &padding on SSH2 RSA signatures",
2010 IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20);
8e975795 2011 staticddl(&cp, "Chokes on &Diffie-Hellman group exchange",
2012 IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX2, 20);
2c9c6388 2013 endbox(&cp);
2014 }
2015 }
2016
3ac9cd9f 2017 if (panel == tunnelspanelstart) {
566bba77 2018 /* The Tunnels panel. Accelerators used: [acgoh] deilmrstxp */
32874aea 2019 struct ctlpos cp;
2020 ctlposinit(&cp, hwnd, 80, 3, 13);
2021 if (dlgtype == 0) {
2022 bartitle(&cp, "Options controlling SSH tunnelling",
2023 IDC_TITLE_TUNNELS);
d74d141c 2024 beginbox(&cp, "X11 forwarding", IDC_BOX_TUNNELS1);
32874aea 2025 checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD);
2026 multiedit(&cp, "&X display location", IDC_X11_DISPSTATIC,
2027 IDC_X11_DISPLAY, 50, NULL);
2028 endbox(&cp);
d74d141c 2029 beginbox(&cp, "Port forwarding", IDC_BOX_TUNNELS2);
beefa433 2030 checkbox(&cp, "Local ports accept connections from o&ther hosts",
2031 IDC_LPORT_ALL);
566bba77 2032 checkbox(&cp, "Remote &ports do the same (SSH v2 only)",
beefa433 2033 IDC_RPORT_ALL);
d74d141c 2034 staticbtn(&cp, "Forwarded ports:", IDC_PFWDSTATIC,
2035 "&Remove", IDC_PFWDREMOVE);
2036 fwdsetter(&cp, IDC_PFWDLIST,
2037 "Add new forwarded port:", IDC_PFWDSTATIC2,
2038 "&Source port", IDC_SPORTSTATIC, IDC_SPORTEDIT,
2039 "Dest&ination", IDC_DPORTSTATIC, IDC_DPORTEDIT,
a4b92c62 2040 "A&dd", IDC_PFWDADD,
2041 "&Local", IDC_PFWDLOCAL,
2042 "Re&mote", IDC_PFWDREMOTE);
d74d141c 2043 endbox(&cp);
2044
32874aea 2045 }
3ac9cd9f 2046 }
2047}
2048
c8d7378d 2049/*
2050 * Helper function to load the session selected in SESSLIST
2051 * if any, as this is done in more than one place in
2052 * GenericMainDlgProc(). 0 => failure.
2053 */
2054static int load_selected_session(HWND hwnd)
2055{
2056 int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
2057 LB_GETCURSEL, 0, 0);
2058 int isdef;
2059 if (n == LB_ERR) {
2060 MessageBeep(0);
2061 return 0;
2062 }
0b4f0bc0 2063 isdef = !strcmp(sesslist.sessions[n], "Default Settings");
2064 load_settings(sesslist.sessions[n], !isdef, &cfg);
c8d7378d 2065 init_dlg_ctrls(hwnd, TRUE);
2066 if (!isdef)
0b4f0bc0 2067 SetDlgItemText(hwnd, IDC_SESSEDIT, sesslist.sessions[n]);
c8d7378d 2068 else
2069 SetDlgItemText(hwnd, IDC_SESSEDIT, "");
2070 /* Restore the selection, which will have been clobbered by
2071 * SESSEDIT handling. */
2072 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, n, 0);
2073 return 1;
2074}
2075
3ac9cd9f 2076/*
2077 * This function is the configuration box.
c96a8fef 2078 */
32874aea 2079static int GenericMainDlgProc(HWND hwnd, UINT msg,
2080 WPARAM wParam, LPARAM lParam, int dlgtype)
2081{
927d4fc5 2082 HWND hw, treeview;
2083 struct treeview_faff tvfaff;
2084 HTREEITEM hsession;
c96a8fef 2085 OPENFILENAME of;
2086 char filename[sizeof(cfg.keyfile)];
2087 CHOOSEFONT cf;
2088 LOGFONT lf;
2089 char fontstatic[256];
b278b14a 2090 char portname[32];
32874aea 2091 struct servent *service;
374330e2 2092 int i;
ca20bfcf 2093 static UINT draglistmsg = WM_NULL;
374330e2 2094
2095 switch (msg) {
2096 case WM_INITDIALOG:
a094ae43 2097 readytogo = 0;
c96a8fef 2098 SetWindowLong(hwnd, GWL_USERDATA, 0);
70133c0e 2099 if (help_path)
2100 SetWindowLong(hwnd, GWL_EXSTYLE,
2101 GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
2102 else {
2103 HWND item = GetDlgItem(hwnd, IDC_HELPBTN);
2104 if (item)
2105 DestroyWindow(item);
2106 }
2107 requested_help = FALSE;
648947d4 2108 SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,
2109 (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)));
c96a8fef 2110 /*
2111 * Centre the window.
2112 */
2113 { /* centre the window */
2114 RECT rs, rd;
2115
2116 hw = GetDesktopWindow();
32874aea 2117 if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd))
2118 MoveWindow(hwnd,
2119 (rs.right + rs.left + rd.left - rd.right) / 2,
2120 (rs.bottom + rs.top + rd.top - rd.bottom) / 2,
2121 rd.right - rd.left, rd.bottom - rd.top, TRUE);
c96a8fef 2122 }
2123
2124 /*
927d4fc5 2125 * Create the tree view.
c96a8fef 2126 */
32874aea 2127 {
2128 RECT r;
c96a8fef 2129 WPARAM font;
32874aea 2130 HWND tvstatic;
2131
2132 r.left = 3;
2133 r.right = r.left + 75;
2134 r.top = 3;
2135 r.bottom = r.top + 10;
2136 MapDialogRect(hwnd, &r);
2137 tvstatic = CreateWindowEx(0, "STATIC", "Cate&gory:",
2138 WS_CHILD | WS_VISIBLE,
2139 r.left, r.top,
2140 r.right - r.left, r.bottom - r.top,
2141 hwnd, (HMENU) IDCX_TVSTATIC, hinst,
2142 NULL);
c96a8fef 2143 font = SendMessage(hwnd, WM_GETFONT, 0, 0);
927d4fc5 2144 SendMessage(tvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
2145
32874aea 2146 r.left = 3;
2147 r.right = r.left + 75;
2148 r.top = 13;
a401e5f3 2149 r.bottom = r.top + 219;
32874aea 2150 MapDialogRect(hwnd, &r);
2151 treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "",
2152 WS_CHILD | WS_VISIBLE |
2153 WS_TABSTOP | TVS_HASLINES |
2154 TVS_DISABLEDRAGDROP | TVS_HASBUTTONS
2155 | TVS_LINESATROOT |
2156 TVS_SHOWSELALWAYS, r.left, r.top,
2157 r.right - r.left, r.bottom - r.top,
2158 hwnd, (HMENU) IDCX_TREEVIEW, hinst,
2159 NULL);
927d4fc5 2160 font = SendMessage(hwnd, WM_GETFONT, 0, 0);
2161 SendMessage(treeview, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
32874aea 2162 tvfaff.treeview = treeview;
2163 memset(tvfaff.lastat, 0, sizeof(tvfaff.lastat));
2164 }
c96a8fef 2165
2166 /*
3ac9cd9f 2167 * Set up the tree view contents.
c96a8fef 2168 */
32874aea 2169 hsession = treeview_insert(&tvfaff, 0, "Session");
2170 treeview_insert(&tvfaff, 1, "Logging");
2171 treeview_insert(&tvfaff, 0, "Terminal");
2172 treeview_insert(&tvfaff, 1, "Keyboard");
2173 treeview_insert(&tvfaff, 1, "Bell");
0d2086c5 2174 treeview_insert(&tvfaff, 1, "Features");
32874aea 2175 treeview_insert(&tvfaff, 0, "Window");
2176 treeview_insert(&tvfaff, 1, "Appearance");
d0cadfcd 2177 treeview_insert(&tvfaff, 1, "Behaviour");
32874aea 2178 treeview_insert(&tvfaff, 1, "Translation");
2179 treeview_insert(&tvfaff, 1, "Selection");
2180 treeview_insert(&tvfaff, 1, "Colours");
2181 treeview_insert(&tvfaff, 0, "Connection");
2182 if (dlgtype == 0) {
8eebd221 2183 treeview_insert(&tvfaff, 1, "Proxy");
32874aea 2184 treeview_insert(&tvfaff, 1, "Telnet");
2185 treeview_insert(&tvfaff, 1, "Rlogin");
2186 if (backends[3].backend != NULL) {
2187 treeview_insert(&tvfaff, 1, "SSH");
ca20bfcf 2188 /* XXX long name is ugly */
2189 /* XXX make it closed by default? */
2190 treeview_insert(&tvfaff, 2, "Auth");
32874aea 2191 treeview_insert(&tvfaff, 2, "Tunnels");
2c9c6388 2192 treeview_insert(&tvfaff, 2, "Bugs");
32874aea 2193 }
2194 }
2195
2196 /*
2197 * Put the treeview selection on to the Session panel. This
2198 * should also cause creation of the relevant controls.
2199 */
2200 TreeView_SelectItem(treeview, hsession);
2201
2202 /*
2203 * Set focus into the first available control.
2204 */
2205 {
2206 HWND ctl;
2207 ctl = GetDlgItem(hwnd, IDC_HOST);
2208 if (!ctl)
2209 ctl = GetDlgItem(hwnd, IDC_CLOSEEXIT);
2210 SetFocus(ctl);
2211 }
c96a8fef 2212
2213 SetWindowLong(hwnd, GWL_USERDATA, 1);
dc35b97d 2214 sesslist_has_focus = 0;
c96a8fef 2215 return 0;
1cd246bb 2216 case WM_LBUTTONUP:
32874aea 2217 /*
2218 * Button release should trigger WM_OK if there was a
2219 * previous double click on the session list.
2220 */
2221 ReleaseCapture();
2222 if (readytogo)
2223 SendMessage(hwnd, WM_COMMAND, IDOK, 0);
2224 break;
c96a8fef 2225 case WM_NOTIFY:
927d4fc5 2226 if (LOWORD(wParam) == IDCX_TREEVIEW &&
32874aea 2227 ((LPNMHDR) lParam)->code == TVN_SELCHANGED) {
2228 HTREEITEM i =
2229 TreeView_GetSelection(((LPNMHDR) lParam)->hwndFrom);
927d4fc5 2230 TVITEM item;
32874aea 2231 int j;
c96a8fef 2232 char buffer[64];
78a79d97 2233
2234 SendMessage (hwnd, WM_SETREDRAW, FALSE, 0);
2235
32874aea 2236 item.hItem = i;
c96a8fef 2237 item.pszText = buffer;
2238 item.cchTextMax = sizeof(buffer);
927d4fc5 2239 item.mask = TVIF_TEXT;
32874aea 2240 TreeView_GetItem(((LPNMHDR) lParam)->hwndFrom, &item);
3ac9cd9f 2241 for (j = controlstartvalue; j < controlendvalue; j++) {
32874aea 2242 HWND item = GetDlgItem(hwnd, j);
2243 if (item)
2244 DestroyWindow(item);
2245 }
927d4fc5 2246 if (!strcmp(buffer, "Session"))
3ac9cd9f 2247 create_controls(hwnd, dlgtype, sessionpanelstart);
0965bee0 2248 if (!strcmp(buffer, "Logging"))
2249 create_controls(hwnd, dlgtype, loggingpanelstart);
c96a8fef 2250 if (!strcmp(buffer, "Keyboard"))
3ac9cd9f 2251 create_controls(hwnd, dlgtype, keyboardpanelstart);
c96a8fef 2252 if (!strcmp(buffer, "Terminal"))
3ac9cd9f 2253 create_controls(hwnd, dlgtype, terminalpanelstart);
156686ef 2254 if (!strcmp(buffer, "Bell"))
2255 create_controls(hwnd, dlgtype, bellpanelstart);
0d2086c5 2256 if (!strcmp(buffer, "Features"))
2257 create_controls(hwnd, dlgtype, featurespanelstart);
c96a8fef 2258 if (!strcmp(buffer, "Window"))
3ac9cd9f 2259 create_controls(hwnd, dlgtype, windowpanelstart);
4c4f2716 2260 if (!strcmp(buffer, "Appearance"))
3ac9cd9f 2261 create_controls(hwnd, dlgtype, appearancepanelstart);
d0cadfcd 2262 if (!strcmp(buffer, "Behaviour"))
2263 create_controls(hwnd, dlgtype, behaviourpanelstart);
9c964e85 2264 if (!strcmp(buffer, "Tunnels"))
3ac9cd9f 2265 create_controls(hwnd, dlgtype, tunnelspanelstart);
927d4fc5 2266 if (!strcmp(buffer, "Connection"))
3ac9cd9f 2267 create_controls(hwnd, dlgtype, connectionpanelstart);
8eebd221 2268 if (!strcmp(buffer, "Proxy"))
2269 create_controls(hwnd, dlgtype, proxypanelstart);
c96a8fef 2270 if (!strcmp(buffer, "Telnet"))
3ac9cd9f 2271 create_controls(hwnd, dlgtype, telnetpanelstart);
c91409da 2272 if (!strcmp(buffer, "Rlogin"))
3ac9cd9f 2273 create_controls(hwnd, dlgtype, rloginpanelstart);
c96a8fef 2274 if (!strcmp(buffer, "SSH"))
3ac9cd9f 2275 create_controls(hwnd, dlgtype, sshpanelstart);
ca20bfcf 2276 if (!strcmp(buffer, "Auth"))
2277 create_controls(hwnd, dlgtype, sshauthpanelstart);
2c9c6388 2278 if (!strcmp(buffer, "Bugs"))
2279 create_controls(hwnd, dlgtype, sshbugspanelstart);
c96a8fef 2280 if (!strcmp(buffer, "Selection"))
3ac9cd9f 2281 create_controls(hwnd, dlgtype, selectionpanelstart);
c96a8fef 2282 if (!strcmp(buffer, "Colours"))
3ac9cd9f 2283 create_controls(hwnd, dlgtype, colourspanelstart);
c96a8fef 2284 if (!strcmp(buffer, "Translation"))
3ac9cd9f 2285 create_controls(hwnd, dlgtype, translationpanelstart);
2286
c8d7378d 2287 init_dlg_ctrls(hwnd, FALSE);
78a79d97 2288
2289 SendMessage (hwnd, WM_SETREDRAW, TRUE, 0);
2290 InvalidateRect (hwnd, NULL, TRUE);
c96a8fef 2291
32874aea 2292 SetFocus(((LPNMHDR) lParam)->hwndFrom); /* ensure focus stays */
c96a8fef 2293 return 0;
2294 }
2295 break;
374330e2 2296 case WM_COMMAND:
c96a8fef 2297 /*
2298 * Only process WM_COMMAND once the dialog is fully formed.
2299 */
32874aea 2300 if (GetWindowLong(hwnd, GWL_USERDATA) == 1)
2301 switch (LOWORD(wParam)) {
2302 case IDOK:
c8d7378d 2303 /* Behaviour of the "Open" button is different if the
2304 * session list has focus, *unless* the user just
2305 * double-clicked... */
2306 if (sesslist_has_focus && !readytogo) {
2307 if (!load_selected_session(hwnd)) {
2308 MessageBeep(0);
2309 return 0;
2310 }
2311 }
2312 /* If at this point we have a valid session, go! */
70133c0e 2313 if (*cfg.host) {
2314 if (requested_help) {
2315 WinHelp(hwnd, help_path, HELP_QUIT, 0);
2316 requested_help = FALSE;
2317 }
32874aea 2318 EndDialog(hwnd, 1);
70133c0e 2319 } else
32874aea 2320 MessageBeep(0);
2321 return 0;
70133c0e 2322 case IDC_HELPBTN:
2323 if (HIWORD(wParam) == BN_CLICKED ||
2324 HIWORD(wParam) == BN_DOUBLECLICKED) {
2325 if (help_path) {
2326 WinHelp(hwnd, help_path,
2327 help_has_contents ? HELP_FINDER : HELP_CONTENTS,
2328 0);
2329 requested_help = TRUE;
2330 }
2331 }
2332 break;
32874aea 2333 case IDCANCEL:
70133c0e 2334 if (requested_help) {
2335 WinHelp(hwnd, help_path, HELP_QUIT, 0);
2336 requested_help = FALSE;
2337 }
32874aea 2338 EndDialog(hwnd, 0);
2339 return 0;
2340 case IDC_PROTTELNET:
2341 case IDC_PROTRLOGIN:
2342 case IDC_PROTSSH:
2343 case IDC_PROTRAW:
2344 if (HIWORD(wParam) == BN_CLICKED ||
2345 HIWORD(wParam) == BN_DOUBLECLICKED) {
2346 int i = IsDlgButtonChecked(hwnd, IDC_PROTSSH);
2347 int j = IsDlgButtonChecked(hwnd, IDC_PROTTELNET);
2348 int k = IsDlgButtonChecked(hwnd, IDC_PROTRLOGIN);
2349 cfg.protocol =
2350 i ? PROT_SSH : j ? PROT_TELNET : k ? PROT_RLOGIN :
2351 PROT_RAW;
2b0d98d3 2352 /*
2353 * When switching using the arrow keys, we
2354 * appear to get two of these messages, both
2355 * mentioning the target button in
2356 * LOWORD(wParam), but one of them called while
2357 * the previous button is still checked. This
2358 * causes an unnecessary reset of the port
2359 * number field, which we fix by ensuring here
2360 * that the button selected is indeed the one
2361 * checked.
2362 */
2363 if (IsDlgButtonChecked(hwnd, LOWORD(wParam)) &&
2364 ((cfg.protocol == PROT_SSH && cfg.port != 22)
2365 || (cfg.protocol == PROT_TELNET && cfg.port != 23)
2366 || (cfg.protocol == PROT_RLOGIN
2367 && cfg.port != 513))) {
32874aea 2368 cfg.port = i ? 22 : j ? 23 : 513;
2369 SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE);
2370 }
374330e2 2371 }
32874aea 2372 break;
2373 case IDC_HOST:
2374 if (HIWORD(wParam) == EN_CHANGE)
2375 GetDlgItemText(hwnd, IDC_HOST, cfg.host,
2376 sizeof(cfg.host) - 1);
2377 break;
2378 case IDC_PORT:
2379 if (HIWORD(wParam) == EN_CHANGE) {
2380 GetDlgItemText(hwnd, IDC_PORT, portname, 31);
2381 if (isdigit(portname[0]))
2382 MyGetDlgItemInt(hwnd, IDC_PORT, &cfg.port);
2383 else {
2384 service = getservbyname(portname, NULL);
2385 if (service)
2386 cfg.port = ntohs(service->s_port);
2387 else
2388 cfg.port = 0;
2389 }
b278b14a 2390 }
32874aea 2391 break;
2392 case IDC_SESSEDIT:
2393 if (HIWORD(wParam) == EN_CHANGE) {
2394 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
2395 (WPARAM) - 1, 0);
2396 GetDlgItemText(hwnd, IDC_SESSEDIT,
2397 savedsession, sizeof(savedsession) - 1);
2398 savedsession[sizeof(savedsession) - 1] = '\0';
2399 }
2400 break;
2401 case IDC_SESSSAVE:
2402 if (HIWORD(wParam) == BN_CLICKED ||
2403 HIWORD(wParam) == BN_DOUBLECLICKED) {
2404 /*
2405 * Save a session
2406 */
2407 char str[2048];
2408 GetDlgItemText(hwnd, IDC_SESSEDIT, str,
2409 sizeof(str) - 1);
2410 if (!*str) {
2411 int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
2412 LB_GETCURSEL, 0, 0);
2413 if (n == LB_ERR) {
2414 MessageBeep(0);
2415 break;
2416 }
0b4f0bc0 2417 strcpy(str, sesslist.sessions[n]);
32874aea 2418 }
2419 save_settings(str, !!strcmp(str, "Default Settings"),
2420 &cfg);
0b4f0bc0 2421 get_sesslist(&sesslist, FALSE);
2422 get_sesslist(&sesslist, TRUE);
c8d7378d 2423 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
2424 FALSE, 0);
32874aea 2425 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
2426 0, 0);
0b4f0bc0 2427 for (i = 0; i < sesslist.nsessions; i++)
32874aea 2428 SendDlgItemMessage(hwnd, IDC_SESSLIST,
2429 LB_ADDSTRING, 0,
0b4f0bc0 2430 (LPARAM) (sesslist.sessions[i]));
32874aea 2431 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
2432 (WPARAM) - 1, 0);
c8d7378d 2433 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
2434 TRUE, 0);
2435 InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL,
2436 TRUE);
32874aea 2437 }
2438 break;
2439 case IDC_SESSLIST:
2440 case IDC_SESSLOAD:
c8d7378d 2441 if (LOWORD(wParam) == IDC_SESSLIST) {
2442 if (HIWORD(wParam) == LBN_SETFOCUS)
2443 sesslist_has_focus = 1;
2444 else if (HIWORD(wParam) == LBN_KILLFOCUS)
2445 sesslist_has_focus = 0;
2446 }
32874aea 2447 if (LOWORD(wParam) == IDC_SESSLOAD &&
2448 HIWORD(wParam) != BN_CLICKED &&
2449 HIWORD(wParam) != BN_DOUBLECLICKED) break;
2450 if (LOWORD(wParam) == IDC_SESSLIST &&
2451 HIWORD(wParam) != LBN_DBLCLK) break;
c8d7378d 2452 /* Load the session selected in SESSLIST. */
2453 if (load_selected_session(hwnd) &&
2454 LOWORD(wParam) == IDC_SESSLIST) {
32874aea 2455 /*
2456 * A double-click on a saved session should
2457 * actually start the session, not just load it.
2458 * Unless it's Default Settings or some other
2459 * host-less set of saved settings.
2460 */
2461 if (*cfg.host) {
2462 readytogo = TRUE;
2463 SetCapture(hwnd);
2464 }
374330e2 2465 }
32874aea 2466 break;
2467 case IDC_SESSDEL:
2468 if (HIWORD(wParam) == BN_CLICKED ||
2469 HIWORD(wParam) == BN_DOUBLECLICKED) {
2470 int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
2471 LB_GETCURSEL, 0, 0);
2472 if (n == LB_ERR || n == 0) {
2473 MessageBeep(0);
2474 break;
2475 }
0b4f0bc0 2476 del_settings(sesslist.sessions[n]);
2477 get_sesslist(&sesslist, FALSE);
2478 get_sesslist(&sesslist, TRUE);
c8d7378d 2479 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
2480 FALSE, 0);
32874aea 2481 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
2482 0, 0);
0b4f0bc0 2483 for (i = 0; i < sesslist.nsessions; i++)
32874aea 2484 SendDlgItemMessage(hwnd, IDC_SESSLIST,
2485 LB_ADDSTRING, 0,
0b4f0bc0 2486 (LPARAM) (sesslist.sessions[i]));
32874aea 2487 SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
2488 (WPARAM) - 1, 0);
c8d7378d 2489 SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
2490 TRUE, 0);
2491 InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL,
2492 TRUE);
374330e2 2493 }
32874aea 2494 case IDC_PINGEDIT:
2495 if (HIWORD(wParam) == EN_CHANGE)
2496 MyGetDlgItemInt(hwnd, IDC_PINGEDIT,
2497 &cfg.ping_interval);
2498 break;
2184a5d9 2499 case IDC_NODELAY:
2500 if (HIWORD(wParam) == BN_CLICKED ||
2501 HIWORD(wParam) == BN_DOUBLECLICKED)
2502 cfg.tcp_nodelay =
2503 IsDlgButtonChecked(hwnd, IDC_NODELAY);
2504 break;
32874aea 2505 case IDC_DEL008:
2506 case IDC_DEL127:
2507 if (HIWORD(wParam) == BN_CLICKED ||
2508 HIWORD(wParam) == BN_DOUBLECLICKED)
2509 cfg.bksp_is_delete =
2510 IsDlgButtonChecked(hwnd, IDC_DEL127);
2511 break;
2512 case IDC_HOMETILDE:
2513 case IDC_HOMERXVT:
2514 if (HIWORD(wParam) == BN_CLICKED ||
2515 HIWORD(wParam) == BN_DOUBLECLICKED)
2516 cfg.rxvt_homeend =
2517 IsDlgButtonChecked(hwnd, IDC_HOMERXVT);
2518 break;
2519 case IDC_FUNCTILDE:
2520 case IDC_FUNCLINUX:
2521 case IDC_FUNCXTERM:
2522 case IDC_FUNCVT400:
2523 case IDC_FUNCVT100P:
2524 case IDC_FUNCSCO:
2525 if (HIWORD(wParam) == BN_CLICKED ||
2526 HIWORD(wParam) == BN_DOUBLECLICKED)
2527 switch (LOWORD(wParam)) {
2528 case IDC_FUNCTILDE:
2529 cfg.funky_type = 0;
2530 break;
2531 case IDC_FUNCLINUX:
2532 cfg.funky_type = 1;
2533 break;
2534 case IDC_FUNCXTERM:
2535 cfg.funky_type = 2;
2536 break;
2537 case IDC_FUNCVT400:
2538 cfg.funky_type = 3;
2539 break;
2540 case IDC_FUNCVT100P:
2541 cfg.funky_type = 4;
2542 break;
2543 case IDC_FUNCSCO:
2544 cfg.funky_type = 5;
2545 break;
2546 }
2547 break;
2548 case IDC_KPNORMAL:
2549 case IDC_KPAPPLIC:
2550 if (HIWORD(wParam) == BN_CLICKED ||
2551 HIWORD(wParam) == BN_DOUBLECLICKED) {
2552 cfg.app_keypad =
2553 IsDlgButtonChecked(hwnd, IDC_KPAPPLIC);
2554 cfg.nethack_keypad = FALSE;
f37caa11 2555 }
32874aea 2556 break;
2557 case IDC_KPNH:
2558 if (HIWORD(wParam) == BN_CLICKED ||
2559 HIWORD(wParam) == BN_DOUBLECLICKED) {
2560 cfg.app_keypad = FALSE;
2561 cfg.nethack_keypad = TRUE;
2562 }
2563 break;
2564 case IDC_CURNORMAL:
2565 case IDC_CURAPPLIC:
2566 if (HIWORD(wParam) == BN_CLICKED ||
2567 HIWORD(wParam) == BN_DOUBLECLICKED)
2568 cfg.app_cursor =
2569 IsDlgButtonChecked(hwnd, IDC_CURAPPLIC);
2570 break;
2571 case IDC_NOAPPLICC:
2572 if (HIWORD(wParam) == BN_CLICKED ||
2573 HIWORD(wParam) == BN_DOUBLECLICKED)
2574 cfg.no_applic_c =
2575 IsDlgButtonChecked(hwnd, IDC_NOAPPLICC);
2576 break;
2577 case IDC_NOAPPLICK:
2578 if (HIWORD(wParam) == BN_CLICKED ||
2579 HIWORD(wParam) == BN_DOUBLECLICKED)
2580 cfg.no_applic_k =
2581 IsDlgButtonChecked(hwnd, IDC_NOAPPLICK);
2582 break;
c0d36a72 2583 case IDC_NOMOUSEREP:
2584 if (HIWORD(wParam) == BN_CLICKED ||
2585 HIWORD(wParam) == BN_DOUBLECLICKED)
2586 cfg.no_mouse_rep =
2587 IsDlgButtonChecked(hwnd, IDC_NOMOUSEREP);
2588 break;
0d2086c5 2589 case IDC_NORESIZE:
2590 if (HIWORD(wParam) == BN_CLICKED ||
2591 HIWORD(wParam) == BN_DOUBLECLICKED)
2592 cfg.no_remote_resize =
2593 IsDlgButtonChecked(hwnd, IDC_NORESIZE);
2594 break;
2595 case IDC_NOALTSCREEN:
2596 if (HIWORD(wParam) == BN_CLICKED ||
2597 HIWORD(wParam) == BN_DOUBLECLICKED)
2598 cfg.no_alt_screen =
2599 IsDlgButtonChecked(hwnd, IDC_NOALTSCREEN);
2600 break;
2601 case IDC_NOWINTITLE:
2602 if (HIWORD(wParam) == BN_CLICKED ||
2603 HIWORD(wParam) == BN_DOUBLECLICKED)
2604 cfg.no_remote_wintitle =
2605 IsDlgButtonChecked(hwnd, IDC_NOWINTITLE);
2606 break;
2607 case IDC_NODBACKSPACE:
2608 if (HIWORD(wParam) == BN_CLICKED ||
2609 HIWORD(wParam) == BN_DOUBLECLICKED)
2610 cfg.no_dbackspace =
2611 IsDlgButtonChecked(hwnd, IDC_NODBACKSPACE);
2612 break;
2613 case IDC_NOCHARSET:
2614 if (HIWORD(wParam) == BN_CLICKED ||
2615 HIWORD(wParam) == BN_DOUBLECLICKED)
2616 cfg.no_remote_charset =
2617 IsDlgButtonChecked(hwnd, IDC_NOCHARSET);
2618 break;
32874aea 2619 case IDC_ALTF4:
2620 if (HIWORD(wParam) == BN_CLICKED ||
2621 HIWORD(wParam) == BN_DOUBLECLICKED)
2622 cfg.alt_f4 = IsDlgButtonChecked(hwnd, IDC_ALTF4);
2623 break;
2624 case IDC_ALTSPACE:
2625 if (HIWORD(wParam) == BN_CLICKED ||
2626 HIWORD(wParam) == BN_DOUBLECLICKED)
2627 cfg.alt_space =
2628 IsDlgButtonChecked(hwnd, IDC_ALTSPACE);
2629 break;
2630 case IDC_ALTONLY:
2631 if (HIWORD(wParam) == BN_CLICKED ||
2632 HIWORD(wParam) == BN_DOUBLECLICKED)
2633 cfg.alt_only =
2634 IsDlgButtonChecked(hwnd, IDC_ALTONLY);
2635 break;
2636 case IDC_ECHOBACKEND:
2637 case IDC_ECHOYES:
2638 case IDC_ECHONO:
2639 if (HIWORD(wParam) == BN_CLICKED ||
2640 HIWORD(wParam) == BN_DOUBLECLICKED) {
2641 if (LOWORD(wParam) == IDC_ECHOBACKEND)
2642 cfg.localecho = LD_BACKEND;
2643 if (LOWORD(wParam) == IDC_ECHOYES)
2644 cfg.localecho = LD_YES;
2645 if (LOWORD(wParam) == IDC_ECHONO)
2646 cfg.localecho = LD_NO;
2647 }
2648 break;
2649 case IDC_EDITBACKEND:
2650 case IDC_EDITYES:
2651 case IDC_EDITNO:
2652 if (HIWORD(wParam) == BN_CLICKED ||
2653 HIWORD(wParam) == BN_DOUBLECLICKED) {
2654 if (LOWORD(wParam) == IDC_EDITBACKEND)
2655 cfg.localedit = LD_BACKEND;
2656 if (LOWORD(wParam) == IDC_EDITYES)
2657 cfg.localedit = LD_YES;
2658 if (LOWORD(wParam) == IDC_EDITNO)
2659 cfg.localedit = LD_NO;
2660 }
2661 break;
2662 case IDC_ANSWEREDIT:
2663 if (HIWORD(wParam) == EN_CHANGE)
2664 GetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback,
2665 sizeof(cfg.answerback) - 1);
2666 break;
2667 case IDC_ALWAYSONTOP:
2668 if (HIWORD(wParam) == BN_CLICKED ||
2669 HIWORD(wParam) == BN_DOUBLECLICKED)
2670 cfg.alwaysontop =
2671 IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP);
2672 break;
8f57d753 2673 case IDC_FULLSCREENONALTENTER:
2674 if (HIWORD(wParam) == BN_CLICKED ||
2675 HIWORD(wParam) == BN_DOUBLECLICKED)
2676 cfg.fullscreenonaltenter =
2677 IsDlgButtonChecked(hwnd, IDC_FULLSCREENONALTENTER);
2678 break;
32874aea 2679 case IDC_SCROLLKEY:
2680 if (HIWORD(wParam) == BN_CLICKED ||
2681 HIWORD(wParam) == BN_DOUBLECLICKED)
2682 cfg.scroll_on_key =
2683 IsDlgButtonChecked(hwnd, IDC_SCROLLKEY);
2684 break;
2685 case IDC_SCROLLDISP:
2686 if (HIWORD(wParam) == BN_CLICKED ||
2687 HIWORD(wParam) == BN_DOUBLECLICKED)
2688 cfg.scroll_on_disp =
2689 IsDlgButtonChecked(hwnd, IDC_SCROLLDISP);
2690 break;
2691 case IDC_COMPOSEKEY:
2692 if (HIWORD(wParam) == BN_CLICKED ||
2693 HIWORD(wParam) == BN_DOUBLECLICKED)
2694 cfg.compose_key =
2695 IsDlgButtonChecked(hwnd, IDC_COMPOSEKEY);
2696 break;
2697 case IDC_CTRLALTKEYS:
2698 if (HIWORD(wParam) == BN_CLICKED ||
2699 HIWORD(wParam) == BN_DOUBLECLICKED)
2700 cfg.ctrlaltkeys =
2701 IsDlgButtonChecked(hwnd, IDC_CTRLALTKEYS);
2702 break;
a5f3e637 2703 case IDC_TELNETKEY:
2704 if (HIWORD(wParam) == BN_CLICKED ||
2705 HIWORD(wParam) == BN_DOUBLECLICKED)
2706 cfg.telnet_keyboard =
2707 IsDlgButtonChecked(hwnd, IDC_TELNETKEY);
2708 break;
eee63b77 2709 case IDC_TELNETRET:
2710 if (HIWORD(wParam) == BN_CLICKED ||
2711 HIWORD(wParam) == BN_DOUBLECLICKED)
2712 cfg.telnet_newline =
2713 IsDlgButtonChecked(hwnd, IDC_TELNETRET);
2714 break;
32874aea 2715 case IDC_WRAPMODE:
2716 if (HIWORD(wParam) == BN_CLICKED ||
2717 HIWORD(wParam) == BN_DOUBLECLICKED)
2718 cfg.wrap_mode =
2719 IsDlgButtonChecked(hwnd, IDC_WRAPMODE);
2720 break;
2721 case IDC_DECOM:
2722 if (HIWORD(wParam) == BN_CLICKED ||
2723 HIWORD(wParam) == BN_DOUBLECLICKED)
2724 cfg.dec_om = IsDlgButtonChecked(hwnd, IDC_DECOM);
2725 break;
2726 case IDC_LFHASCR:
2727 if (HIWORD(wParam) == BN_CLICKED ||
2728 HIWORD(wParam) == BN_DOUBLECLICKED)
2729 cfg.lfhascr =
2730 IsDlgButtonChecked(hwnd, IDC_LFHASCR);
2731 break;
2732 case IDC_ROWSEDIT:
2733 if (HIWORD(wParam) == EN_CHANGE)
2734 MyGetDlgItemInt(hwnd, IDC_ROWSEDIT, &cfg.height);
2735 break;
2736 case IDC_COLSEDIT:
2737 if (HIWORD(wParam) == EN_CHANGE)
2738 MyGetDlgItemInt(hwnd, IDC_COLSEDIT, &cfg.width);
2739 break;
2740 case IDC_SAVEEDIT:
2741 if (HIWORD(wParam) == EN_CHANGE)
2742 MyGetDlgItemInt(hwnd, IDC_SAVEEDIT, &cfg.savelines);
2743 break;
2744 case IDC_CHOOSEFONT:
c0a18295 2745 {
2746 HDC hdc = GetDC(0);
2747 lf.lfHeight = -MulDiv(cfg.fontheight,
2748 GetDeviceCaps(hdc, LOGPIXELSY),
2749 72);
2750 ReleaseDC(0, hdc);
2751 }
32874aea 2752 lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
2753 lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;
2754 lf.lfWeight = (cfg.fontisbold ? FW_BOLD : 0);
2755 lf.lfCharSet = cfg.fontcharset;
2756 lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
2757 lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
2758 lf.lfQuality = DEFAULT_QUALITY;
2759 lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
2760 strncpy(lf.lfFaceName, cfg.font,
2761 sizeof(lf.lfFaceName) - 1);
2762 lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0';
2763
2764 cf.lStructSize = sizeof(cf);
2765 cf.hwndOwner = hwnd;
2766 cf.lpLogFont = &lf;
2767 cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST |
2768 CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
2769
2770 if (ChooseFont(&cf)) {
2771 strncpy(cfg.font, lf.lfFaceName, sizeof(cfg.font) - 1);
2772 cfg.font[sizeof(cfg.font) - 1] = '\0';
2773 cfg.fontisbold = (lf.lfWeight == FW_BOLD);
2774 cfg.fontcharset = lf.lfCharSet;
2775 cfg.fontheight = cf.iPointSize / 10;
2776 fmtfont(fontstatic);
2777 SetDlgItemText(hwnd, IDC_FONTSTATIC, fontstatic);
2778 }
2779 break;
2780 case IDC_BELL_DISABLED:
2781 case IDC_BELL_DEFAULT:
2782 case IDC_BELL_WAVEFILE:
2783 case IDC_BELL_VISUAL:
2784 if (HIWORD(wParam) == BN_CLICKED ||
2785 HIWORD(wParam) == BN_DOUBLECLICKED) {
2786 if (LOWORD(wParam) == IDC_BELL_DISABLED)
2787 cfg.beep = BELL_DISABLED;
2788 if (LOWORD(wParam) == IDC_BELL_DEFAULT)
2789 cfg.beep = BELL_DEFAULT;
2790 if (LOWORD(wParam) == IDC_BELL_WAVEFILE)
2791 cfg.beep = BELL_WAVEFILE;
2792 if (LOWORD(wParam) == IDC_BELL_VISUAL)
2793 cfg.beep = BELL_VISUAL;
2794 }
2795 break;
f8a28d1f 2796 case IDC_B_IND_DISABLED:
2797 case IDC_B_IND_FLASH:
2798 case IDC_B_IND_STEADY:
2799 if (HIWORD(wParam) == BN_CLICKED ||
2800 HIWORD(wParam) == BN_DOUBLECLICKED) {
2801 if (LOWORD(wParam) == IDC_B_IND_DISABLED)
2802 cfg.beep_ind = B_IND_DISABLED;
2803 if (LOWORD(wParam) == IDC_B_IND_FLASH)
2804 cfg.beep_ind = B_IND_FLASH;
2805 if (LOWORD(wParam) == IDC_B_IND_STEADY)
2806 cfg.beep_ind = B_IND_STEADY;
2807 }
2808 break;
32874aea 2809 case IDC_BELL_WAVEBROWSE:
2810 memset(&of, 0, sizeof(of));
03169ad0 2811#ifdef OPENFILENAME_SIZE_VERSION_400
32874aea 2812 of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
03169ad0 2813#else
32874aea 2814 of.lStructSize = sizeof(of);
03169ad0 2815#endif
32874aea 2816 of.hwndOwner = hwnd;
2817 of.lpstrFilter = "Wave Files\0*.WAV\0AllFiles\0*\0\0\0";
2818 of.lpstrCustomFilter = NULL;
2819 of.nFilterIndex = 1;
2820 of.lpstrFile = filename;
2821 strcpy(filename, cfg.bell_wavefile);
2822 of.nMaxFile = sizeof(filename);
2823 of.lpstrFileTitle = NULL;
2824 of.lpstrInitialDir = NULL;
2825 of.lpstrTitle = "Select Bell Sound File";
2826 of.Flags = 0;
2827 if (GetOpenFileName(&of)) {
2828 strcpy(cfg.bell_wavefile, filename);
2829 SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,
2830 cfg.bell_wavefile);
2831 }
2832 break;
2833 case IDC_BELL_WAVEEDIT:
2834 if (HIWORD(wParam) == EN_CHANGE)
2835 GetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,
2836 cfg.bell_wavefile,
2837 sizeof(cfg.bell_wavefile) - 1);
2838 break;
2839 case IDC_BELLOVL:
2840 if (HIWORD(wParam) == BN_CLICKED ||
2841 HIWORD(wParam) == BN_DOUBLECLICKED)
2842 cfg.bellovl =
2843 IsDlgButtonChecked(hwnd, IDC_BELLOVL);
2844 break;
2845 case IDC_BELLOVLN:
2846 if (HIWORD(wParam) == EN_CHANGE)
2847 MyGetDlgItemInt(hwnd, IDC_BELLOVLN, &cfg.bellovl_n);
2848 break;
2849 case IDC_BELLOVLT:
2850 if (HIWORD(wParam) == EN_CHANGE)
2851 MyGetDlgItemFlt(hwnd, IDC_BELLOVLT, &cfg.bellovl_t,
2852 1000);
2853 break;
2854 case IDC_BELLOVLS:
2855 if (HIWORD(wParam) == EN_CHANGE)
2856 MyGetDlgItemFlt(hwnd, IDC_BELLOVLS, &cfg.bellovl_s,
2857 1000);
2858 break;
2859 case IDC_BLINKTEXT:
2860 if (HIWORD(wParam) == BN_CLICKED ||
2861 HIWORD(wParam) == BN_DOUBLECLICKED)
2862 cfg.blinktext =
2863 IsDlgButtonChecked(hwnd, IDC_BLINKTEXT);
2864 break;
2865 case IDC_BCE:
2866 if (HIWORD(wParam) == BN_CLICKED ||
2867 HIWORD(wParam) == BN_DOUBLECLICKED)
2868 cfg.bce = IsDlgButtonChecked(hwnd, IDC_BCE);
2869 break;
2870 case IDC_WINNAME:
2871 if (HIWORD(wParam) == BN_CLICKED ||
2872 HIWORD(wParam) == BN_DOUBLECLICKED)
2873 cfg.win_name_always =
2874 IsDlgButtonChecked(hwnd, IDC_WINNAME);
2875 break;
2876 case IDC_HIDEMOUSE:
2877 if (HIWORD(wParam) == BN_CLICKED ||
2878 HIWORD(wParam) == BN_DOUBLECLICKED)
2879 cfg.hide_mouseptr =
2880 IsDlgButtonChecked(hwnd, IDC_HIDEMOUSE);
2881 break;
2882 case IDC_SUNKENEDGE:
2883 if (HIWORD(wParam) == BN_CLICKED ||
2884 HIWORD(wParam) == BN_DOUBLECLICKED)
2885 cfg.sunken_edge =
2886 IsDlgButtonChecked(hwnd, IDC_SUNKENEDGE);
2887 break;
5a73255e 2888 case IDC_WINBEDIT:
2889 if (HIWORD(wParam) == EN_CHANGE)
2890 MyGetDlgItemInt(hwnd, IDC_WINBEDIT,
2891 &cfg.window_border);
2892 if (cfg.window_border > 32)
2893 cfg.window_border = 32;
2894 break;
32874aea 2895 case IDC_CURBLOCK:
2896 if (HIWORD(wParam) == BN_CLICKED ||
2897 HIWORD(wParam) == BN_DOUBLECLICKED)
2898 cfg.cursor_type = 0;
2899 break;
2900 case IDC_CURUNDER:
2901 if (HIWORD(wParam) == BN_CLICKED ||
2902 HIWORD(wParam) == BN_DOUBLECLICKED)
2903 cfg.cursor_type = 1;
2904 break;
2905 case IDC_CURVERT:
2906 if (HIWORD(wParam) == BN_CLICKED ||
2907 HIWORD(wParam) == BN_DOUBLECLICKED)
2908 cfg.cursor_type = 2;
2909 break;
2910 case IDC_BLINKCUR:
2911 if (HIWORD(wParam) == BN_CLICKED ||
2912 HIWORD(wParam) == BN_DOUBLECLICKED)
2913 cfg.blink_cur =
2914 IsDlgButtonChecked(hwnd, IDC_BLINKCUR);
2915 break;
2916 case IDC_SCROLLBAR:
2917 if (HIWORD(wParam) == BN_CLICKED ||
2918 HIWORD(wParam) == BN_DOUBLECLICKED)
2919 cfg.scrollbar =
2920 IsDlgButtonChecked(hwnd, IDC_SCROLLBAR);
2921 break;
a401e5f3 2922 case IDC_SCROLLBARFULLSCREEN:
2923 if (HIWORD(wParam) == BN_CLICKED ||
2924 HIWORD(wParam) == BN_DOUBLECLICKED)
2925 cfg.scrollbar_in_fullscreen =
2926 IsDlgButtonChecked(hwnd, IDC_SCROLLBARFULLSCREEN);
2927 break;
ad5c93cc 2928 case IDC_RESIZETERM:
2929 case IDC_RESIZEFONT:
2930 case IDC_RESIZENONE:
0ed2f48e 2931 case IDC_RESIZEEITHER:
32874aea 2932 if (HIWORD(wParam) == BN_CLICKED ||
ad5c93cc 2933 HIWORD(wParam) == BN_DOUBLECLICKED) {
2934 cfg.resize_action =
2935 IsDlgButtonChecked(hwnd,
2936 IDC_RESIZETERM) ? RESIZE_TERM :
2937 IsDlgButtonChecked(hwnd,
2938 IDC_RESIZEFONT) ? RESIZE_FONT :
0ed2f48e 2939 IsDlgButtonChecked(hwnd,
2940 IDC_RESIZEEITHER) ? RESIZE_EITHER :
ad5c93cc 2941 RESIZE_DISABLED;
2942 }
5a73255e 2943 break;
32874aea 2944 case IDC_WINEDIT:
2945 if (HIWORD(wParam) == EN_CHANGE)
2946 GetDlgItemText(hwnd, IDC_WINEDIT, cfg.wintitle,
2947 sizeof(cfg.wintitle) - 1);
2948 break;
2949 case IDC_COEALWAYS:
2950 case IDC_COENEVER:
2951 case IDC_COENORMAL:
2952 if (HIWORD(wParam) == BN_CLICKED ||
2953 HIWORD(wParam) == BN_DOUBLECLICKED) {
2954 cfg.close_on_exit =
2955 IsDlgButtonChecked(hwnd,
2956 IDC_COEALWAYS) ? COE_ALWAYS :
2957 IsDlgButtonChecked(hwnd,
2958 IDC_COENEVER) ? COE_NEVER :
2959 COE_NORMAL;
2960 }
2961 break;
2962 case IDC_CLOSEWARN:
2963 if (HIWORD(wParam) == BN_CLICKED ||
2964 HIWORD(wParam) == BN_DOUBLECLICKED)
2965 cfg.warn_on_close =
2966 IsDlgButtonChecked(hwnd, IDC_CLOSEWARN);
2967 break;
2968 case IDC_TTEDIT:
2969 if (HIWORD(wParam) == EN_CHANGE)
2970 GetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype,
2971 sizeof(cfg.termtype) - 1);
2972 break;
8eebd221 2973
2974 /* proxy config */
2975 case IDC_PROXYHOSTEDIT:
2976 if (HIWORD(wParam) == EN_CHANGE)
2977 GetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host,
2978 sizeof(cfg.proxy_host) - 1);
2979 break;
2980 case IDC_PROXYPORTEDIT:
2981 if (HIWORD(wParam) == EN_CHANGE) {
2982 GetDlgItemText(hwnd, IDC_PROXYPORTEDIT, portname, 31);
2983 if (isdigit(portname[0]))
2984 MyGetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, &cfg.proxy_port);
2985 else {
2986 service = getservbyname(portname, NULL);
2987 if (service)
2988 cfg.proxy_port = ntohs(service->s_port);
2989 else
2990 cfg.proxy_port = 0;
2991 }
2992 }
2993 break;
2994 case IDC_PROXYEXCLUDEEDIT:
2995 if (HIWORD(wParam) == EN_CHANGE)
2996 GetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT,
2997 cfg.proxy_exclude_list,
2998 sizeof(cfg.proxy_exclude_list) - 1);
2999 break;
3000 case IDC_PROXYUSEREDIT:
3001 if (HIWORD(wParam) == EN_CHANGE)
3002 GetDlgItemText(hwnd, IDC_PROXYUSEREDIT,
3003 cfg.proxy_username,
3004 sizeof(cfg.proxy_username) - 1);
3005 break;
3006 case IDC_PROXYPASSEDIT:
3007 if (HIWORD(wParam) == EN_CHANGE)
3008 GetDlgItemText(hwnd, IDC_PROXYPASSEDIT,
3009 cfg.proxy_password,
3010 sizeof(cfg.proxy_password) - 1);
3011 break;
3012 case IDC_PROXYTELNETCMDEDIT:
3013 if (HIWORD(wParam) == EN_CHANGE)
3014 GetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT,
3015 cfg.proxy_telnet_command,
3016 sizeof(cfg.proxy_telnet_command) - 1);
3017 break;
3018 case IDC_PROXYSOCKSVER5:
3019 case IDC_PROXYSOCKSVER4:
3020 if (HIWORD(wParam) == BN_CLICKED ||
3021 HIWORD(wParam) == BN_DOUBLECLICKED) {
3022 cfg.proxy_socks_version =
3023 IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5;
3024 }
3025 break;
3026 case IDC_PROXYTYPENONE:
3027 case IDC_PROXYTYPEHTTP:
3028 case IDC_PROXYTYPESOCKS:
3029 case IDC_PROXYTYPETELNET:
3030 if (HIWORD(wParam) == BN_CLICKED ||
3031 HIWORD(wParam) == BN_DOUBLECLICKED) {
3032 cfg.proxy_type =
3033 IsDlgButtonChecked(hwnd, IDC_PROXYTYPEHTTP) ? PROXY_HTTP :
3034 IsDlgButtonChecked(hwnd, IDC_PROXYTYPESOCKS) ? PROXY_SOCKS :
3035 IsDlgButtonChecked(hwnd, IDC_PROXYTYPETELNET) ? PROXY_TELNET :
3036 PROXY_NONE;
3037 }
3038 break;
3039
32874aea 3040 case IDC_LGFEDIT:
3041 if (HIWORD(wParam) == EN_CHANGE)
3042 GetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename,
3043 sizeof(cfg.logfilename) - 1);
3044 break;
3045 case IDC_LGFBUTTON:
3046 memset(&of, 0, sizeof(of));
e1c8e0ed 3047#ifdef OPENFILENAME_SIZE_VERSION_400
32874aea 3048 of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
e1c8e0ed 3049#else
32874aea 3050 of.lStructSize = sizeof(of);
e1c8e0ed 3051#endif
32874aea 3052 of.hwndOwner = hwnd;
3053 of.lpstrFilter = "All Files\0*\0\0\0";
3054 of.lpstrCustomFilter = NULL;
3055 of.nFilterIndex = 1;
3056 of.lpstrFile = filename;
3057 strcpy(filename, cfg.logfilename);
3058 of.nMaxFile = sizeof(filename);
3059 of.lpstrFileTitle = NULL;
3060 of.lpstrInitialDir = NULL;
3061 of.lpstrTitle = "Select session log file";
3062 of.Flags = 0;
3063 if (GetSaveFileName(&of)) {
3064 strcpy(cfg.logfilename, filename);
3065 SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename);
374330e2 3066 }
32874aea 3067 break;
3068 case IDC_LSTATOFF:
3069 case IDC_LSTATASCII:
3070 case IDC_LSTATRAW:
00db133f 3071 case IDC_LSTATPACKET:
32874aea 3072 if (HIWORD(wParam) == BN_CLICKED ||
3073 HIWORD(wParam) == BN_DOUBLECLICKED) {
3074 if (IsDlgButtonChecked(hwnd, IDC_LSTATOFF))
00db133f 3075 cfg.logtype = LGTYP_NONE;
32874aea 3076 if (IsDlgButtonChecked(hwnd, IDC_LSTATASCII))
00db133f 3077 cfg.logtype = LGTYP_ASCII;
32874aea 3078 if (IsDlgButtonChecked(hwnd, IDC_LSTATRAW))
00db133f 3079 cfg.logtype = LGTYP_DEBUG;
3080 if (IsDlgButtonChecked(hwnd, IDC_LSTATPACKET))
3081 cfg.logtype = LGTYP_PACKETS;
374330e2 3082 }
32874aea 3083 break;
3084 case IDC_LSTATXASK:
3085 case IDC_LSTATXAPN:
3086 case IDC_LSTATXOVR:
3087 if (HIWORD(wParam) == BN_CLICKED ||
3088 HIWORD(wParam) == BN_DOUBLECLICKED) {
3089 if (IsDlgButtonChecked(hwnd, IDC_LSTATXASK))
3090 cfg.logxfovr = LGXF_ASK;
3091 if (IsDlgButtonChecked(hwnd, IDC_LSTATXAPN))
3092 cfg.logxfovr = LGXF_APN;
3093 if (IsDlgButtonChecked(hwnd, IDC_LSTATXOVR))
3094 cfg.logxfovr = LGXF_OVR;
374330e2 3095 }
32874aea 3096 break;
3097 case IDC_TSEDIT:
3098 case IDC_R_TSEDIT:
3099 if (HIWORD(wParam) == EN_CHANGE)
3100 GetDlgItemText(hwnd, LOWORD(wParam), cfg.termspeed,
3101 sizeof(cfg.termspeed) - 1);
3102 break;
3103 case IDC_LOGEDIT:
3104 if (HIWORD(wParam) == EN_CHANGE)
3105 GetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username,
3106 sizeof(cfg.username) - 1);
3107 break;
3108 case IDC_RLLUSEREDIT:
3109 if (HIWORD(wParam) == EN_CHANGE)
3110 GetDlgItemText(hwnd, IDC_RLLUSEREDIT,
3111 cfg.localusername,
3112 sizeof(cfg.localusername) - 1);
3113 break;
3114 case IDC_EMBSD:
3115 case IDC_EMRFC:
3116 cfg.rfc_environ = IsDlgButtonChecked(hwnd, IDC_EMRFC);
3117 break;
8faa456c 3118 case IDC_TPASSIVE:
3119 case IDC_TACTIVE:
3120 cfg.passive_telnet =
3121 IsDlgButtonChecked(hwnd, IDC_TPASSIVE);
3122 break;
32874aea 3123 case IDC_ENVADD:
3124 if (HIWORD(wParam) == BN_CLICKED ||
3125 HIWORD(wParam) == BN_DOUBLECLICKED) {
3126 char str[sizeof(cfg.environmt)];
3127 char *p;
3128 GetDlgItemText(hwnd, IDC_VAREDIT, str,
3129 sizeof(str) - 1);
3130 if (!*str) {
3131 MessageBeep(0);
3132 break;
3133 }
3134 p = str + strlen(str);
3135 *p++ = '\t';
3136 GetDlgItemText(hwnd, IDC_VALEDIT, p,
3137 sizeof(str) - 1 - (p - str));
3138 if (!*p) {
3139 MessageBeep(0);
3140 break;
3141 }
3142 p = cfg.environmt;
3143 while (*p) {
3144 while (*p)
3145 p++;
3146 p++;
3147 }
3148 if ((p - cfg.environmt) + strlen(str) + 2 <
3149 sizeof(cfg.environmt)) {
3150 strcpy(p, str);
3151 p[strlen(str) + 1] = '\0';
3152 SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_ADDSTRING,
3153 0, (LPARAM) str);
3154 SetDlgItemText(hwnd, IDC_VAREDIT, "");
3155 SetDlgItemText(hwnd, IDC_VALEDIT, "");
3156 } else {
3157 MessageBox(hwnd, "Environment too big",
3158 "PuTTY Error", MB_OK | MB_ICONERROR);
3159 }
374330e2 3160 }
32874aea 3161 break;
3162 case IDC_ENVREMOVE:
3163 if (HIWORD(wParam) != BN_CLICKED &&
3164 HIWORD(wParam) != BN_DOUBLECLICKED) break;
3165 i =
3166 SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_GETCURSEL, 0,
3167 0);
3168 if (i == LB_ERR)
3169 MessageBeep(0);
3170 else {
3171 char *p, *q;
3172
3173 SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_DELETESTRING,
3174 i, 0);
3175 p = cfg.environmt;
3176 while (i > 0) {
3177 if (!*p)
3178 goto disaster;
3179 while (*p)
3180 p++;
3181 p++;
3182 i--;
3183 }
3184 q = p;
374330e2 3185 if (!*p)
3186 goto disaster;
374330e2 3187 while (*p)
32874aea 3188 p++;
3189 p++;
3190 while (*p) {
3191 while (*p)
3192 *q++ = *p++;
374330e2 3193 *q++ = *p++;
32874aea 3194 }
3195 *q = '\0';
3196 disaster:;
374330e2 3197 }
32874aea 3198 break;
3199 case IDC_NOPTY:
3200 if (HIWORD(wParam) == BN_CLICKED ||
3201 HIWORD(wParam) == BN_DOUBLECLICKED)
3202 cfg.nopty = IsDlgButtonChecked(hwnd, IDC_NOPTY);
3203 break;
3204 case IDC_COMPRESS:
3205 if (HIWORD(wParam) == BN_CLICKED ||
3206 HIWORD(wParam) == BN_DOUBLECLICKED)
3207 cfg.compression =
3208 IsDlgButtonChecked(hwnd, IDC_COMPRESS);
3209 break;
cb4d4768 3210 case IDC_SSH2DES:
3211 if (HIWORD(wParam) == BN_CLICKED ||
3212 HIWORD(wParam) == BN_DOUBLECLICKED)
3213 cfg.ssh2_des_cbc =
3214 IsDlgButtonChecked(hwnd, IDC_SSH2DES);
3215 break;
32874aea 3216 case IDC_AGENTFWD:
3217 if (HIWORD(wParam) == BN_CLICKED ||
3218 HIWORD(wParam) == BN_DOUBLECLICKED)
3219 cfg.agentfwd =
3220 IsDlgButtonChecked(hwnd, IDC_AGENTFWD);
3221 break;
5bb641e1 3222 case IDC_CHANGEUSER:
3223 if (HIWORD(wParam) == BN_CLICKED ||
3224 HIWORD(wParam) == BN_DOUBLECLICKED)
3225 cfg.change_username =
3226 IsDlgButtonChecked(hwnd, IDC_CHANGEUSER);
3227 break;
ca20bfcf 3228 case IDC_CIPHERLIST:
3229 case IDC_CIPHERUP:
3230 case IDC_CIPHERDN:
3231 handle_prefslist(&cipherlist,
3232 cfg.ssh_cipherlist, CIPHER_MAX,
3233 0, hwnd, wParam, lParam);
32874aea 3234 break;
38d228a2 3235 case IDC_SSHPROT1ONLY:
32874aea 3236 case IDC_SSHPROT1:
3237 case IDC_SSHPROT2:
759712a6 3238 case IDC_SSHPROT2ONLY:
32874aea 3239 if (HIWORD(wParam) == BN_CLICKED ||
3240 HIWORD(wParam) == BN_DOUBLECLICKED) {
38d228a2 3241 if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1ONLY))
3242 cfg.sshprot = 0;
32874aea 3243 if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1))
3244 cfg.sshprot = 1;
3245 else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2))
3246 cfg.sshprot = 2;
759712a6 3247 else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2ONLY))
3248 cfg.sshprot = 3;
32874aea 3249 }
3250 break;
3251 case IDC_AUTHTIS:
3252 if (HIWORD(wParam) == BN_CLICKED ||
3253 HIWORD(wParam) == BN_DOUBLECLICKED)
3254 cfg.try_tis_auth =
3255 IsDlgButtonChecked(hwnd, IDC_AUTHTIS);
3256 break;
f091e308 3257 case IDC_AUTHKI:
3258 if (HIWORD(wParam) == BN_CLICKED ||
3259 HIWORD(wParam) == BN_DOUBLECLICKED)
3260 cfg.try_ki_auth =
3261 IsDlgButtonChecked(hwnd, IDC_AUTHKI);
3262 break;
32874aea 3263 case IDC_PKEDIT:
3264 if (HIWORD(wParam) == EN_CHANGE)
3265 GetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile,
3266 sizeof(cfg.keyfile) - 1);
3267 break;
3268 case IDC_CMDEDIT:
3269 if (HIWORD(wParam) == EN_CHANGE)
3270 GetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd,
3271 sizeof(cfg.remote_cmd) - 1);
3272 break;
3273 case IDC_PKBUTTON:
3274 memset(&of, 0, sizeof(of));
7cca0d81 3275#ifdef OPENFILENAME_SIZE_VERSION_400
32874aea 3276 of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
7cca0d81 3277#else
32874aea 3278 of.lStructSize = sizeof(of);
7cca0d81 3279#endif
32874aea 3280 of.hwndOwner = hwnd;
e2210ffc 3281 of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0"
3282 "AllFiles\0*\0\0\0";
32874aea 3283 of.lpstrCustomFilter = NULL;
3284 of.nFilterIndex = 1;
3285 of.lpstrFile = filename;
3286 strcpy(filename, cfg.keyfile);
3287 of.nMaxFile = sizeof(filename);
3288 of.lpstrFileTitle = NULL;
3289 of.lpstrInitialDir = NULL;
7c0f5956 3290 of.lpstrTitle = "Select Private Key File";
32874aea 3291 of.Flags = 0;
3292 if (GetOpenFileName(&of)) {
3293 strcpy(cfg.keyfile, filename);
3294 SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile);
374330e2 3295 }
32874aea 3296 break;
3297 case IDC_RAWCNP:
3298 cfg.rawcnp = IsDlgButtonChecked(hwnd, IDC_RAWCNP);
b90840c3 3299 break;
a7419ea4 3300 case IDC_RTFPASTE:
3301 cfg.rtf_paste = IsDlgButtonChecked(hwnd, IDC_RTFPASTE);
3302 break;
32874aea 3303 case IDC_MBWINDOWS:
3304 case IDC_MBXTERM:
3305 cfg.mouse_is_xterm = IsDlgButtonChecked(hwnd, IDC_MBXTERM);
3306 break;
6908fed7 3307 case IDC_SELTYPELEX:
3308 case IDC_SELTYPERECT:
3309 cfg.rect_select = IsDlgButtonChecked(hwnd, IDC_SELTYPERECT);
3310 break;
b90840c3 3311 case IDC_MOUSEOVERRIDE:
3312 cfg.mouse_override = IsDlgButtonChecked(hwnd, IDC_MOUSEOVERRIDE);
3313 break;
32874aea 3314 case IDC_CCSET:
3315 {
3316 BOOL ok;
3317 int i;
3318 int n = GetDlgItemInt(hwnd, IDC_CCEDIT, &ok, FALSE);
3319
3320 if (!ok)
3321 MessageBeep(0);
3322 else {
4eeb7d09 3323 for (i = 0; i < 128; i++)
32874aea 3324 if (SendDlgItemMessage
3325 (hwnd, IDC_CCLIST, LB_GETSEL, i, 0)) {
3326 char str[100];
3327 cfg.wordness[i] = n;
3328 SendDlgItemMessage(hwnd, IDC_CCLIST,
3329 LB_DELETESTRING, i, 0);
3330 sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i,
3331 (i >= 0x21 && i != 0x7F) ? i : ' ',
3332 cfg.wordness[i]);
3333 SendDlgItemMessage(hwnd, IDC_CCLIST,
3334 LB_INSERTSTRING, i,
3335 (LPARAM) str);
3336 }
3337 }
374330e2 3338 }
32874aea 3339 break;
3340 case IDC_BOLDCOLOUR:
3341 if (HIWORD(wParam) == BN_CLICKED ||
3342 HIWORD(wParam) == BN_DOUBLECLICKED) {
3343 int n, i;
3344 cfg.bold_colour =
3345 IsDlgButtonChecked(hwnd, IDC_BOLDCOLOUR);
c8d7378d 3346 SendDlgItemMessage(hwnd, IDC_COLOURLIST, WM_SETREDRAW,
3347 FALSE, 0);
32874aea 3348 n =
3349 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
3350 LB_GETCOUNT, 0, 0);
3351 if (n != 12 + 10 * cfg.bold_colour) {
3352 for (i = n; i-- > 0;)
3353 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
3354 LB_DELETESTRING, i, 0);
3355 for (i = 0; i < 22; i++)
3356 if (cfg.bold_colour || permcolour[i])
3357 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
3358 LB_ADDSTRING, 0,
3359 (LPARAM) colours[i]);
3360 }
c8d7378d 3361 SendDlgItemMessage(hwnd, IDC_COLOURLIST, WM_SETREDRAW,
3362 TRUE, 0);
3363 InvalidateRect(GetDlgItem(hwnd, IDC_COLOURLIST), NULL,
3364 TRUE);
374330e2 3365 }
32874aea 3366 break;
3367 case IDC_PALETTE:
3368 if (HIWORD(wParam) == BN_CLICKED ||
3369 HIWORD(wParam) == BN_DOUBLECLICKED)
3370 cfg.try_palette =
3371 IsDlgButtonChecked(hwnd, IDC_PALETTE);
3372 break;
3373 case IDC_COLOURLIST:
3374 if (HIWORD(wParam) == LBN_DBLCLK ||
3375 HIWORD(wParam) == LBN_SELCHANGE) {
c8d7378d 3376 int i =
3377 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
3378 LB_GETCURSEL,
3379 0, 0);
32874aea 3380 if (!cfg.bold_colour)
3381 i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2);
3382 SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0],
3383 FALSE);
3384 SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1],
3385 FALSE);
3386 SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2],
3387 FALSE);
3388 }
3389 break;
3390 case IDC_CHANGE:
3391 if (HIWORD(wParam) == BN_CLICKED ||
3392 HIWORD(wParam) == BN_DOUBLECLICKED) {
3393 static CHOOSECOLOR cc;
3394 static DWORD custom[16] = { 0 }; /* zero initialisers */
c8d7378d 3395 int i =
3396 SendDlgItemMessage(hwnd, IDC_COLOURLIST,
3397 LB_GETCURSEL,
3398 0, 0);
32874aea 3399 if (!cfg.bold_colour)
3400 i = (i < 3 ? i * 2 : i == 3 ? 5 : i * 2 - 2);
3401 cc.lStructSize = sizeof(cc);
3402 cc.hwndOwner = hwnd;
3403 cc.hInstance = (HWND) hinst;
3404 cc.lpCustColors = custom;
3405 cc.rgbResult =
3406 RGB(cfg.colours[i][0], cfg.colours[i][1],
3407 cfg.colours[i][2]);
3408 cc.Flags = CC_FULLOPEN | CC_RGBINIT;
3409 if (ChooseColor(&cc)) {
3410 cfg.colours[i][0] =
3411 (unsigned char) (cc.rgbResult & 0xFF);
3412 cfg.colours[i][1] =
3413 (unsigned char) (cc.rgbResult >> 8) & 0xFF;
3414 cfg.colours[i][2] =
3415 (unsigned char) (cc.rgbResult >> 16) & 0xFF;
3416 SetDlgItemInt(hwnd, IDC_RVALUE, cfg.colours[i][0],
3417 FALSE);
3418 SetDlgItemInt(hwnd, IDC_GVALUE, cfg.colours[i][1],
3419 FALSE);
3420 SetDlgItemInt(hwnd, IDC_BVALUE, cfg.colours[i][2],
3421 FALSE);
3422 }
3423 }
3424 break;
4eeb7d09 3425 case IDC_CODEPAGE:
875b193f 3426 if (HIWORD(wParam) == CBN_SELCHANGE) {
3427 int index = SendDlgItemMessage(hwnd, IDC_CODEPAGE,
3428 CB_GETCURSEL, 0, 0);
3429 SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_GETLBTEXT,
3430 index, (LPARAM)cfg.line_codepage);
b8ae1f0f 3431 } else if (HIWORD(wParam) == CBN_EDITCHANGE) {
3432 GetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage,
3433 sizeof(cfg.line_codepage) - 1);
3434 } else if (HIWORD(wParam) == CBN_KILLFOCUS) {
3435 strcpy(cfg.line_codepage,
3436 cp_name(decode_codepage(cfg.line_codepage)));
3437 SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage);
32874aea 3438 }
3439 break;
b44b307a 3440 case IDC_PRINTER:
3441 if (HIWORD(wParam) == CBN_SELCHANGE) {
3442 int index = SendDlgItemMessage(hwnd, IDC_PRINTER,
3443 CB_GETCURSEL, 0, 0);
3444 SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETLBTEXT,
3445 index, (LPARAM)cfg.printer);
3446 } else if (HIWORD(wParam) == CBN_EDITCHANGE) {
3447 GetDlgItemText(hwnd, IDC_PRINTER, cfg.printer,
3448 sizeof(cfg.printer) - 1);
3449 }
3450 if (!strcmp(cfg.printer, PRINTER_DISABLED_STRING))
3451 *cfg.printer = '\0';
3452 break;
a9c02454 3453 case IDC_CAPSLOCKCYR:
3454 if (HIWORD(wParam) == BN_CLICKED ||
3455 HIWORD(wParam) == BN_DOUBLECLICKED) {
3456 cfg.xlat_capslockcyr =
3457 IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR);
3458 }
3459 break;
32874aea 3460 case IDC_VTXWINDOWS:
3461 case IDC_VTOEMANSI:
3462 case IDC_VTOEMONLY:
3463 case IDC_VTPOORMAN:
4eeb7d09 3464 case IDC_VTUNICODE:
32874aea 3465 cfg.vtmode =
3466 (IsDlgButtonChecked(hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS
3467 : IsDlgButtonChecked(hwnd,
3468 IDC_VTOEMANSI) ? VT_OEMANSI :
3469 IsDlgButtonChecked(hwnd,
3470 IDC_VTOEMONLY) ? VT_OEMONLY :
4eeb7d09 3471 IsDlgButtonChecked(hwnd,
3472 IDC_VTUNICODE) ? VT_UNICODE :
32874aea 3473 VT_POORMAN);
3474 break;
3475 case IDC_X11_FORWARD:
3476 if (HIWORD(wParam) == BN_CLICKED ||
3477 HIWORD(wParam) == BN_DOUBLECLICKED)
beefa433 3478 cfg.x11_forward =
3479 IsDlgButtonChecked(hwnd, IDC_X11_FORWARD);
32874aea 3480 break;
d74d141c 3481 case IDC_LPORT_ALL:
3482 if (HIWORD(wParam) == BN_CLICKED ||
3483 HIWORD(wParam) == BN_DOUBLECLICKED)
beefa433 3484 cfg.lport_acceptall =
3485 IsDlgButtonChecked(hwnd, IDC_LPORT_ALL);
3486 break;
3487 case IDC_RPORT_ALL:
3488 if (HIWORD(wParam) == BN_CLICKED ||
3489 HIWORD(wParam) == BN_DOUBLECLICKED)
3490 cfg.rport_acceptall =
3491 IsDlgButtonChecked(hwnd, IDC_RPORT_ALL);
d74d141c 3492 break;
32874aea 3493 case IDC_X11_DISPLAY:
3494 if (HIWORD(wParam) == EN_CHANGE)
3495 GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display,
3496 sizeof(cfg.x11_display) - 1);
3497 break;
d74d141c 3498 case IDC_PFWDADD:
3499 if (HIWORD(wParam) == BN_CLICKED ||
3500 HIWORD(wParam) == BN_DOUBLECLICKED) {
3501 char str[sizeof(cfg.portfwd)];
3502 char *p;
3503 if (IsDlgButtonChecked(hwnd, IDC_PFWDLOCAL))
3504 str[0] = 'L';
3505 else
3506 str[0] = 'R';
3507 GetDlgItemText(hwnd, IDC_SPORTEDIT, str+1,
3508 sizeof(str) - 2);
3509 if (!str[1]) {
3510 MessageBox(hwnd,
3511 "You need to specify a source port number",
3512 "PuTTY Error", MB_OK | MB_ICONERROR);
3513 break;
3514 }
3515 p = str + strlen(str);
3516 *p++ = '\t';
3517 GetDlgItemText(hwnd, IDC_DPORTEDIT, p,
3518 sizeof(str) - 1 - (p - str));
3519 if (!*p || !strchr(p, ':')) {
3520 MessageBox(hwnd,
3521 "You need to specify a destination address\n"
3522 "in the form \"host.name:port\"",
3523 "PuTTY Error", MB_OK | MB_ICONERROR);
3524 break;
3525 }
3526 p = cfg.portfwd;
3527 while (*p) {
3528 while (*p)
3529 p++;
3530 p++;
3531 }
3532 if ((p - cfg.portfwd) + strlen(str) + 2 <
3533 sizeof(cfg.portfwd)) {
3534 strcpy(p, str);
3535 p[strlen(str) + 1] = '\0';
3536 SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_ADDSTRING,
3537 0, (LPARAM) str);
3538 SetDlgItemText(hwnd, IDC_SPORTEDIT, "");
3539 SetDlgItemText(hwnd, IDC_DPORTEDIT, "");
3540 } else {
3541 MessageBox(hwnd, "Too many forwardings",
3542 "PuTTY Error", MB_OK | MB_ICONERROR);
3543 }
3544 }
3545 break;
3546 case IDC_PFWDREMOVE:
3547 if (HIWORD(wParam) != BN_CLICKED &&
3548 HIWORD(wParam) != BN_DOUBLECLICKED) break;
3549 i = SendDlgItemMessage(hwnd, IDC_PFWDLIST,
3550 LB_GETCURSEL, 0, 0);
3551 if (i == LB_ERR)
3552 MessageBeep(0);
3553 else {
3554 char *p, *q;
3555
3556 SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_DELETESTRING,
3557 i, 0);
3558 p = cfg.portfwd;
3559 while (i > 0) {
3560 if (!*p)
3561 goto disaster2;
3562 while (*p)
3563 p++;
3564 p++;
3565 i--;
3566 }
3567 q = p;
3568 if (!*p)
3569 goto disaster2;
3570 while (*p)
3571 p++;
3572 p++;
3573 while (*p) {
3574 while (*p)
3575 *q++ = *p++;
3576 *q++ = *p++;
3577 }
3578 *q = '\0';
3579 disaster2:;
3580 }
3581 break;
2c9c6388 3582 case IDC_BUGD_IGNORE1:
3583 if (HIWORD(wParam) == CBN_SELCHANGE) {
3584 int index = SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1,
3585 CB_GETCURSEL, 0, 0);
3586 cfg.sshbug_ignore1 = (index == 0 ? BUG_AUTO :
3587 index == 1 ? BUG_OFF : BUG_ON);
3588 }
3589 break;
3590 case IDC_BUGD_PLAINPW1:
3591 if (HIWORD(wParam) == CBN_SELCHANGE) {
3592 int index = SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1,
3593 CB_GETCURSEL, 0, 0);
3594 cfg.sshbug_plainpw1 = (index == 0 ? BUG_AUTO :
3595 index == 1 ? BUG_OFF : BUG_ON);
3596 }
3597 break;
3598 case IDC_BUGD_RSA1:
3599 if (HIWORD(wParam) == CBN_SELCHANGE) {
3600 int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSA1,
3601 CB_GETCURSEL, 0, 0);
3602 cfg.sshbug_rsa1 = (index == 0 ? BUG_AUTO :
3603 index == 1 ? BUG_OFF : BUG_ON);
3604 }
3605 break;
3606 case IDC_BUGD_HMAC2:
3607 if (HIWORD(wParam) == CBN_SELCHANGE) {
3608 int index = SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2,
3609 CB_GETCURSEL, 0, 0);
3610 cfg.sshbug_hmac2 = (index == 0 ? BUG_AUTO :
3611 index == 1 ? BUG_OFF : BUG_ON);
3612 }
3613 break;
3614 case IDC_BUGD_DERIVEKEY2:
3615 if (HIWORD(wParam) == CBN_SELCHANGE) {
3616 int index = SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2,
3617 CB_GETCURSEL, 0, 0);
3618 cfg.sshbug_derivekey2 = (index == 0 ? BUG_AUTO :
3619 index == 1 ? BUG_OFF : BUG_ON);
3620 }
3621 break;
3622 case IDC_BUGD_RSAPAD2:
3623 if (HIWORD(wParam) == CBN_SELCHANGE) {
3624 int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2,
3625 CB_GETCURSEL, 0, 0);
3626 cfg.sshbug_rsapad2 = (index == 0 ? BUG_AUTO :
3627 index == 1 ? BUG_OFF : BUG_ON);
3628 }
3629 break;
8e975795 3630 case IDC_BUGD_DHGEX2:
3631 if (HIWORD(wParam) == CBN_SELCHANGE) {
3632 int index = SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2,
3633 CB_GETCURSEL, 0, 0);
3634 cfg.sshbug_dhgex2 = (index == 0 ? BUG_AUTO :
3635 index == 1 ? BUG_OFF : BUG_ON);
3636 }
3637 break;
374330e2 3638 }
374330e2 3639 return 0;
70133c0e 3640 case WM_HELP:
3641 if (help_path) {
3642 int id = ((LPHELPINFO)lParam)->iCtrlId;
3643 char *cmd = help_context_cmd(id);
3644 if (cmd) {
3645 WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
3646 requested_help = TRUE;
3647 } else {
3648 MessageBeep(0);
3649 }
3650 }
3651 break;
374330e2 3652 case WM_CLOSE:
70133c0e 3653 if (requested_help) {
3654 WinHelp(hwnd, help_path, HELP_QUIT, 0);
3655 requested_help = FALSE;
3656 }
32874aea 3657 EndDialog(hwnd, 0);
374330e2 3658 return 0;
c9def1b8 3659
3660 /* Grrr Explorer will maximize Dialogs! */
3661 case WM_SIZE:
3662 if (wParam == SIZE_MAXIMIZED)
32874aea 3663 force_normal(hwnd);
c9def1b8 3664 return 0;
ca20bfcf 3665
3666 default:
3667 /*
3668 * Handle application-defined messages eg. DragListBox
3669 */
3670 /* First find out what the number is (once). */
3671 if (draglistmsg == WM_NULL)
3672 draglistmsg = RegisterWindowMessage (DRAGLISTMSGSTRING);
3673
3674 if (msg == draglistmsg) {
3675 /* Only process once dialog is fully formed. */
3676 if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) {
3677 case IDC_CIPHERLIST:
3678 return handle_prefslist(&cipherlist,
3679 cfg.ssh_cipherlist, CIPHER_MAX,
3680 1, hwnd, wParam, lParam);
3681 }
3682 }
3683 return 0;
3684
374330e2 3685 }
3686 return 0;
3687}
3688
32874aea 3689static int CALLBACK MainDlgProc(HWND hwnd, UINT msg,
3690 WPARAM wParam, LPARAM lParam)
3691{
374330e2 3692 if (msg == WM_COMMAND && LOWORD(wParam) == IDOK) {
374330e2 3693 }
c96a8fef 3694 if (msg == WM_COMMAND && LOWORD(wParam) == IDCX_ABOUT) {
374330e2 3695 EnableWindow(hwnd, 0);
f5eca4f8 3696 DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
374330e2 3697 EnableWindow(hwnd, 1);
32874aea 3698 SetActiveWindow(hwnd);
374330e2 3699 }
32874aea 3700 return GenericMainDlgProc(hwnd, msg, wParam, lParam, 0);
374330e2 3701}
3702
32874aea 3703static int CALLBACK ReconfDlgProc(HWND hwnd, UINT msg,
3704 WPARAM wParam, LPARAM lParam)
3705{
3706 return GenericMainDlgProc(hwnd, msg, wParam, lParam, 1);
374330e2 3707}
3708
32874aea 3709void defuse_showwindow(void)
3710{
301b66db 3711 /*
3712 * Work around the fact that the app's first call to ShowWindow
3713 * will ignore the default in favour of the shell-provided
3714 * setting.
3715 */
3716 {
32874aea 3717 HWND hwnd;
3718 hwnd = CreateDialog(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX),
3719 NULL, NullDlgProc);
3720 ShowWindow(hwnd, SW_HIDE);
f5eca4f8 3721 SetActiveWindow(hwnd);
32874aea 3722 DestroyWindow(hwnd);
301b66db 3723 }
3724}
3725
32874aea 3726int do_config(void)
3727{
374330e2 3728 int ret;
3729
0b4f0bc0 3730 get_sesslist(&sesslist, TRUE);
6584031a 3731 savedsession[0] = '\0';
32874aea 3732 ret =
3733 DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc);
0b4f0bc0 3734 get_sesslist(&sesslist, FALSE);
374330e2 3735
3736 return ret;
3737}
3738
32874aea 3739int do_reconfig(HWND hwnd)
3740{
374330e2 3741 Config backup_cfg;
3742 int ret;
3743
3744 backup_cfg = cfg; /* structure copy */
32874aea 3745 ret =
3746 DialogBox(hinst, MAKEINTRESOURCE(IDD_RECONF), hwnd, ReconfDlgProc);
374330e2 3747 if (!ret)
3748 cfg = backup_cfg; /* structure copy */
c9def1b8 3749
374330e2 3750 return ret;
3751}
3752
a8327734 3753void logevent(void *frontend, char *string)
32874aea 3754{
71346075 3755 char timebuf[40];
3756 time_t t;
3757
a8327734 3758 log_eventlog(logctx, string);
fb89f7ff 3759
c5e9c988 3760 if (nevents >= negsize) {
374330e2 3761 negsize += 64;
32874aea 3762 events = srealloc(events, negsize * sizeof(*events));
374330e2 3763 }
71346075 3764
3765 time(&t);
32874aea 3766 strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t",
3767 localtime(&t));
71346075 3768
32874aea 3769 events[nevents] = smalloc(strlen(timebuf) + strlen(string) + 1);
71346075 3770 strcpy(events[nevents], timebuf);
3771 strcat(events[nevents], string);
9ad90448 3772 if (logbox) {
32874aea 3773 int count;
3774 SendDlgItemMessage(logbox, IDN_LIST, LB_ADDSTRING,
3775 0, (LPARAM) events[nevents]);
3776 count = SendDlgItemMessage(logbox, IDN_LIST, LB_GETCOUNT, 0, 0);
3777 SendDlgItemMessage(logbox, IDN_LIST, LB_SETTOPINDEX, count - 1, 0);
9ad90448 3778 }
bce816e7 3779 nevents++;
374330e2 3780}
3781
32874aea 3782void showeventlog(HWND hwnd)
3783{
374330e2 3784 if (!logbox) {
32874aea 3785 logbox = CreateDialog(hinst, MAKEINTRESOURCE(IDD_LOGBOX),
3786 hwnd, LogProc);
3787 ShowWindow(logbox, SW_SHOWNORMAL);
374330e2 3788 }
9ecf8e5a 3789 SetActiveWindow(logbox);
374330e2 3790}
3791
32874aea 3792void showabout(HWND hwnd)
3793{
3794 DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
374330e2 3795}
3796
a8327734 3797void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
32874aea 3798 char *keystr, char *fingerprint)
3799{
d5859615 3800 int ret;
374330e2 3801
d5859615 3802 static const char absentmsg[] =
32874aea 3803 "The server's host key is not cached in the registry. You\n"
3804 "have no guarantee that the server is the computer you\n"
3805 "think it is.\n"
3806 "The server's key fingerprint is:\n"
3807 "%s\n"
3808 "If you trust this host, hit Yes to add the key to\n"
3809 "PuTTY's cache and carry on connecting.\n"
d0718310 3810 "If you want to carry on connecting just once, without\n"
3811 "adding the key to the cache, hit No.\n"
3812 "If you do not trust this host, hit Cancel to abandon the\n"
32874aea 3813 "connection.\n";
d5859615 3814
3815 static const char wrongmsg[] =
32874aea 3816 "WARNING - POTENTIAL SECURITY BREACH!\n"
3817 "\n"
3818 "The server's host key does not match the one PuTTY has\n"
3819 "cached in the registry. This means that either the\n"
3820 "server administrator has changed the host key, or you\n"
3821 "have actually connected to another computer pretending\n"
3822 "to be the server.\n"
3823 "The new key fingerprint is:\n"
3824 "%s\n"
3825 "If you were expecting this change and trust the new key,\n"
3826 "hit Yes to update PuTTY's cache and continue connecting.\n"
3827 "If you want to carry on connecting but without updating\n"
3828 "the cache, hit No.\n"
3829 "If you want to abandon the connection completely, hit\n"
3830 "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" "choice.\n";
d5859615 3831
3832 static const char mbtitle[] = "PuTTY Security Alert";
de3df031 3833
32874aea 3834 char message[160 +
c8d7378d 3835 /* sensible fingerprint max size */
32874aea 3836 (sizeof(absentmsg) > sizeof(wrongmsg) ?
3837 sizeof(absentmsg) : sizeof(wrongmsg))];
de3df031 3838
3839 /*
d5859615 3840 * Verify the key against the registry.
de3df031 3841 */
d4857987 3842 ret = verify_host_key(host, port, keytype, keystr);
d5859615 3843
32874aea 3844 if (ret == 0) /* success - key matched OK */
3845 return;
3846 if (ret == 2) { /* key was different */
3847 int mbret;
3848 sprintf(message, wrongmsg, fingerprint);
3849 mbret = MessageBox(NULL, message, mbtitle,
3850 MB_ICONWARNING | MB_YESNOCANCEL);
3851 if (mbret == IDYES)
3852 store_host_key(host, port, keytype, keystr);
3853 if (mbret == IDCANCEL)
93b581bd 3854 cleanup_exit(0);
de3df031 3855 }
32874aea 3856 if (ret == 1) { /* key was absent */
3857 int mbret;
3858 sprintf(message, absentmsg, fingerprint);
3859 mbret = MessageBox(NULL, message, mbtitle,
d0718310 3860 MB_ICONWARNING | MB_YESNOCANCEL);
3861 if (mbret == IDYES)
3862 store_host_key(host, port, keytype, keystr);
3863 if (mbret == IDCANCEL)
93b581bd 3864 cleanup_exit(0);
de3df031 3865 }
de3df031 3866}
e1c8e0ed 3867
3868/*
ca20bfcf 3869 * Ask whether the selected cipher is acceptable (since it was
3870 * below the configured 'warn' threshold).
3871 * cs: 0 = both ways, 1 = client->server, 2 = server->client
3872 */
a8327734 3873void askcipher(void *frontend, char *ciphername, int cs)
ca20bfcf 3874{
3875 static const char mbtitle[] = "PuTTY Security Alert";
3876 static const char msg[] =
3877 "The first %.35scipher supported by the server\n"
3878 "is %.64s, which is below the configured\n"
3879 "warning threshold.\n"
3880 "Do you want to continue with this connection?\n";
3881 /* guessed cipher name + type max length */
3882 char message[100 + sizeof(msg)];
3883 int mbret;
3884
3885 sprintf(message, msg,
3886 (cs == 0) ? "" :
3887 (cs == 1) ? "client-to-server " :
3888 "server-to-client ",
3889 ciphername);
3890 mbret = MessageBox(NULL, message, mbtitle,
3891 MB_ICONWARNING | MB_YESNO);
3892 if (mbret == IDYES)
3893 return;
3894 else
93b581bd 3895 cleanup_exit(0);
ca20bfcf 3896}
3897
3898/*
e1c8e0ed 3899 * Ask whether to wipe a session log file before writing to it.
3900 * Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
3901 */
a8327734 3902int askappend(void *frontend, char *filename)
32874aea 3903{
e1c8e0ed 3904 static const char mbtitle[] = "PuTTY Log to File";
3905 static const char msgtemplate[] =
3906 "The session log file \"%.*s\" already exists.\n"
3907 "You can overwrite it with a new session log,\n"
3908 "append your session log to the end of it,\n"
3909 "or disable session logging for this session.\n"
3910 "Hit Yes to wipe the file, No to append to it,\n"
3911 "or Cancel to disable logging.";
3912 char message[sizeof(msgtemplate) + FILENAME_MAX];
3913 int mbret;
32874aea 3914 if (cfg.logxfovr != LGXF_ASK) {
3915 return ((cfg.logxfovr == LGXF_OVR) ? 2 : 1);
9f89f96e 3916 }
e1c8e0ed 3917 sprintf(message, msgtemplate, FILENAME_MAX, filename);
3918
3919 mbret = MessageBox(NULL, message, mbtitle,
32874aea 3920 MB_ICONQUESTION | MB_YESNOCANCEL);
e1c8e0ed 3921 if (mbret == IDYES)
3922 return 2;
3923 else if (mbret == IDNO)
3924 return 1;
3925 else
3926 return 0;
3927}
7bedb13c 3928
3929/*
3930 * Warn about the obsolescent key file format.
a8327734 3931 *
3932 * Uniquely among these functions, this one does _not_ expect a
3933 * frontend handle. This means that if PuTTY is ported to a
3934 * platform which requires frontend handles, this function will be
3935 * an anomaly. Fortunately, the problem it addresses will not have
3936 * been present on that platform, so it can plausibly be
3937 * implemented as an empty function.
7bedb13c 3938 */
3939void old_keyfile_warning(void)
3940{
3941 static const char mbtitle[] = "PuTTY Key File Warning";
3942 static const char message[] =
3943 "You are loading an SSH 2 private key which has an\n"
3944 "old version of the file format. This means your key\n"
3945 "file is not fully tamperproof. Future versions of\n"
3946 "PuTTY may stop supporting this private key format,\n"
3947 "so we recommend you convert your key to the new\n"
3948 "format.\n"
3949 "\n"
3950 "You can perform this conversion by loading the key\n"
3951 "into PuTTYgen and then saving it again.";
3952
3953 MessageBox(NULL, message, mbtitle, MB_OK);
3954}