15 static char **events
= NULL
;
16 static int nevents
= 0, negsize
= 0;
19 static int sesslist_has_focus
;
21 static struct prefslist cipherlist
;
23 void force_normal(HWND hwnd
)
25 static int recurse
= 0;
33 wp
.length
= sizeof(wp
);
34 if (GetWindowPlacement(hwnd
, &wp
) && wp
.showCmd
== SW_SHOWMAXIMIZED
) {
35 wp
.showCmd
= SW_SHOWNORMAL
;
36 SetWindowPlacement(hwnd
, &wp
);
41 static void MyGetDlgItemInt(HWND hwnd
, int id
, int *result
)
45 n
= GetDlgItemInt(hwnd
, id
, &ok
, FALSE
);
50 static void MyGetDlgItemFlt(HWND hwnd
, int id
, int *result
, int scale
)
54 ok
= GetDlgItemText(hwnd
, id
, text
, sizeof(text
) - 1);
56 *result
= (int) (scale
* atof(text
));
59 static void MySetDlgItemFlt(HWND hwnd
, int id
, double value
)
62 sprintf(text
, "%g", value
);
63 SetDlgItemText(hwnd
, id
, text
);
66 static int CALLBACK
LogProc(HWND hwnd
, UINT msg
,
67 WPARAM wParam
, LPARAM lParam
)
74 static int tabs
[4] = { 78, 108 };
75 SendDlgItemMessage(hwnd
, IDN_LIST
, LB_SETTABSTOPS
, 2,
78 for (i
= 0; i
< nevents
; i
++)
79 SendDlgItemMessage(hwnd
, IDN_LIST
, LB_ADDSTRING
,
80 0, (LPARAM
) events
[i
]);
83 switch (LOWORD(wParam
)) {
87 SetActiveWindow(GetParent(hwnd
));
91 if (HIWORD(wParam
) == BN_CLICKED
||
92 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
95 selcount
= SendDlgItemMessage(hwnd
, IDN_LIST
,
96 LB_GETSELCOUNT
, 0, 0);
97 if (selcount
== 0) { /* don't even try to copy zero items */
102 selitems
= smalloc(selcount
* sizeof(int));
104 int count
= SendDlgItemMessage(hwnd
, IDN_LIST
,
111 static unsigned char sel_nl
[] = SEL_NL
;
113 if (count
== 0) { /* can't copy zero stuff */
119 for (i
= 0; i
< count
; i
++)
121 strlen(events
[selitems
[i
]]) + sizeof(sel_nl
);
123 clipdata
= smalloc(size
);
126 for (i
= 0; i
< count
; i
++) {
127 char *q
= events
[selitems
[i
]];
128 int qlen
= strlen(q
);
131 memcpy(p
, sel_nl
, sizeof(sel_nl
));
134 write_aclip(clipdata
, size
, TRUE
);
139 for (i
= 0; i
< nevents
; i
++)
140 SendDlgItemMessage(hwnd
, IDN_LIST
, LB_SETSEL
,
149 SetActiveWindow(GetParent(hwnd
));
156 static int CALLBACK
LicenceProc(HWND hwnd
, UINT msg
,
157 WPARAM wParam
, LPARAM lParam
)
163 switch (LOWORD(wParam
)) {
176 static int CALLBACK
AboutProc(HWND hwnd
, UINT msg
,
177 WPARAM wParam
, LPARAM lParam
)
181 SetDlgItemText(hwnd
, IDA_VERSION
, ver
);
184 switch (LOWORD(wParam
)) {
187 EndDialog(hwnd
, TRUE
);
190 EnableWindow(hwnd
, 0);
191 DialogBox(hinst
, MAKEINTRESOURCE(IDD_LICENCEBOX
),
193 EnableWindow(hwnd
, 1);
194 SetActiveWindow(hwnd
);
198 /* Load web browser */
199 ShellExecute(hwnd
, "open",
200 "http://www.chiark.greenend.org.uk/~sgtatham/putty/",
201 0, 0, SW_SHOWDEFAULT
);
206 EndDialog(hwnd
, TRUE
);
213 * Null dialog procedure.
215 static int CALLBACK
NullDlgProc(HWND hwnd
, UINT msg
,
216 WPARAM wParam
, LPARAM lParam
)
221 static char savedsession
[2048];
224 IDC_ABOUT
, IDCX_TVSTATIC
, IDCX_TREEVIEW
, controlstartvalue
,
369 appearancepanelstart
,
370 IDC_TITLE_APPEARANCE
,
390 connectionpanelstart
,
391 IDC_TITLE_CONNECTION
,
498 translationpanelstart
,
499 IDC_TITLE_TRANSLATION
,
500 IDC_BOX_TRANSLATION1
,
501 IDC_BOX_TRANSLATION2
,
537 static const char *const colours
[] = {
538 "Default Foreground", "Default Bold Foreground",
539 "Default Background", "Default Bold Background",
540 "Cursor Text", "Cursor Colour",
541 "ANSI Black", "ANSI Black Bold",
542 "ANSI Red", "ANSI Red Bold",
543 "ANSI Green", "ANSI Green Bold",
544 "ANSI Yellow", "ANSI Yellow Bold",
545 "ANSI Blue", "ANSI Blue Bold",
546 "ANSI Magenta", "ANSI Magenta Bold",
547 "ANSI Cyan", "ANSI Cyan Bold",
548 "ANSI White", "ANSI White Bold"
550 static const int permcolour
[] = {
551 TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, TRUE
,
552 TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
,
553 TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
, TRUE
, FALSE
556 static void fmtfont(char *buf
)
558 sprintf(buf
, "Font: %s, ", cfg
.font
);
560 strcat(buf
, "bold, ");
561 if (cfg
.fontheight
== 0)
562 strcat(buf
, "default height");
564 sprintf(buf
+ strlen(buf
), "%d-point",
565 (cfg
.fontheight
< 0 ?
-cfg
.fontheight
: cfg
.fontheight
));
568 /* 2nd arg: NZ => don't redraw session list (use when loading
570 static void init_dlg_ctrls(HWND hwnd
, int keepsess
)
573 char fontstatic
[256];
575 SetDlgItemText(hwnd
, IDC_HOST
, cfg
.host
);
576 SetDlgItemText(hwnd
, IDC_SESSEDIT
, savedsession
);
579 n
= SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_GETCOUNT
, 0, 0);
580 for (i
= n
; i
-- > 0;)
581 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_DELETESTRING
, i
, 0);
582 for (i
= 0; i
< nsessions
; i
++)
583 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_ADDSTRING
,
584 0, (LPARAM
) (sessions
[i
]));
586 SetDlgItemInt(hwnd
, IDC_PORT
, cfg
.port
, FALSE
);
587 CheckRadioButton(hwnd
, IDC_PROTRAW
, IDC_PROTSSH
,
588 cfg
.protocol
== PROT_SSH ? IDC_PROTSSH
:
589 cfg
.protocol
== PROT_TELNET ? IDC_PROTTELNET
:
591 PROT_RLOGIN ? IDC_PROTRLOGIN
: IDC_PROTRAW
);
592 SetDlgItemInt(hwnd
, IDC_PINGEDIT
, cfg
.ping_interval
, FALSE
);
594 CheckRadioButton(hwnd
, IDC_DEL008
, IDC_DEL127
,
595 cfg
.bksp_is_delete ? IDC_DEL127
: IDC_DEL008
);
596 CheckRadioButton(hwnd
, IDC_HOMETILDE
, IDC_HOMERXVT
,
597 cfg
.rxvt_homeend ? IDC_HOMERXVT
: IDC_HOMETILDE
);
598 CheckRadioButton(hwnd
, IDC_FUNCTILDE
, IDC_FUNCSCO
,
599 cfg
.funky_type
== 0 ? IDC_FUNCTILDE
:
600 cfg
.funky_type
== 1 ? IDC_FUNCLINUX
:
601 cfg
.funky_type
== 2 ? IDC_FUNCXTERM
:
602 cfg
.funky_type
== 3 ? IDC_FUNCVT400
:
603 cfg
.funky_type
== 4 ? IDC_FUNCVT100P
:
604 cfg
.funky_type
== 5 ? IDC_FUNCSCO
: IDC_FUNCTILDE
);
605 CheckDlgButton(hwnd
, IDC_NOAPPLICC
, cfg
.no_applic_c
);
606 CheckDlgButton(hwnd
, IDC_NOAPPLICK
, cfg
.no_applic_k
);
607 CheckRadioButton(hwnd
, IDC_CURNORMAL
, IDC_CURAPPLIC
,
608 cfg
.app_cursor ? IDC_CURAPPLIC
: IDC_CURNORMAL
);
609 CheckRadioButton(hwnd
, IDC_KPNORMAL
, IDC_KPNH
,
610 cfg
.nethack_keypad ? IDC_KPNH
:
611 cfg
.app_keypad ? IDC_KPAPPLIC
: IDC_KPNORMAL
);
612 CheckDlgButton(hwnd
, IDC_ALTF4
, cfg
.alt_f4
);
613 CheckDlgButton(hwnd
, IDC_ALTSPACE
, cfg
.alt_space
);
614 CheckDlgButton(hwnd
, IDC_ALTONLY
, cfg
.alt_only
);
615 CheckDlgButton(hwnd
, IDC_COMPOSEKEY
, cfg
.compose_key
);
616 CheckDlgButton(hwnd
, IDC_CTRLALTKEYS
, cfg
.ctrlaltkeys
);
617 CheckDlgButton(hwnd
, IDC_TELNETKEY
, cfg
.telnet_keyboard
);
618 CheckRadioButton(hwnd
, IDC_ECHOBACKEND
, IDC_ECHONO
,
619 cfg
.localecho
== LD_BACKEND ? IDC_ECHOBACKEND
:
620 cfg
.localecho
== LD_YES ? IDC_ECHOYES
: IDC_ECHONO
);
621 CheckRadioButton(hwnd
, IDC_EDITBACKEND
, IDC_EDITNO
,
622 cfg
.localedit
== LD_BACKEND ? IDC_EDITBACKEND
:
623 cfg
.localedit
== LD_YES ? IDC_EDITYES
: IDC_EDITNO
);
624 SetDlgItemText(hwnd
, IDC_ANSWEREDIT
, cfg
.answerback
);
625 CheckDlgButton(hwnd
, IDC_ALWAYSONTOP
, cfg
.alwaysontop
);
626 CheckDlgButton(hwnd
, IDC_SCROLLKEY
, cfg
.scroll_on_key
);
627 CheckDlgButton(hwnd
, IDC_SCROLLDISP
, cfg
.scroll_on_disp
);
629 CheckDlgButton(hwnd
, IDC_WRAPMODE
, cfg
.wrap_mode
);
630 CheckDlgButton(hwnd
, IDC_DECOM
, cfg
.dec_om
);
631 CheckDlgButton(hwnd
, IDC_LFHASCR
, cfg
.lfhascr
);
632 SetDlgItemInt(hwnd
, IDC_ROWSEDIT
, cfg
.height
, FALSE
);
633 SetDlgItemInt(hwnd
, IDC_COLSEDIT
, cfg
.width
, FALSE
);
634 SetDlgItemInt(hwnd
, IDC_SAVEEDIT
, cfg
.savelines
, FALSE
);
636 SetDlgItemText(hwnd
, IDC_FONTSTATIC
, fontstatic
);
637 CheckRadioButton(hwnd
, IDC_BELL_DISABLED
, IDC_BELL_VISUAL
,
638 cfg
.beep
== BELL_DISABLED ? IDC_BELL_DISABLED
:
639 cfg
.beep
== BELL_DEFAULT ? IDC_BELL_DEFAULT
:
640 cfg
.beep
== BELL_WAVEFILE ? IDC_BELL_WAVEFILE
:
642 BELL_VISUAL ? IDC_BELL_VISUAL
: IDC_BELL_DEFAULT
);
643 CheckRadioButton(hwnd
, IDC_B_IND_DISABLED
, IDC_B_IND_STEADY
,
645 B_IND_DISABLED ? IDC_B_IND_DISABLED
: cfg
.beep_ind
==
646 B_IND_FLASH ? IDC_B_IND_FLASH
: cfg
.beep_ind
==
647 B_IND_STEADY ? IDC_B_IND_STEADY
: IDC_B_IND_DISABLED
);
648 SetDlgItemText(hwnd
, IDC_BELL_WAVEEDIT
, cfg
.bell_wavefile
);
649 CheckDlgButton(hwnd
, IDC_BELLOVL
, cfg
.bellovl
);
650 SetDlgItemInt(hwnd
, IDC_BELLOVLN
, cfg
.bellovl_n
, FALSE
);
651 MySetDlgItemFlt(hwnd
, IDC_BELLOVLT
, cfg
.bellovl_t
/ 1000.0);
652 MySetDlgItemFlt(hwnd
, IDC_BELLOVLS
, cfg
.bellovl_s
/ 1000.0);
654 CheckDlgButton(hwnd
, IDC_BCE
, cfg
.bce
);
655 CheckDlgButton(hwnd
, IDC_BLINKTEXT
, cfg
.blinktext
);
657 SetDlgItemText(hwnd
, IDC_WINEDIT
, cfg
.wintitle
);
658 CheckDlgButton(hwnd
, IDC_WINNAME
, cfg
.win_name_always
);
659 CheckDlgButton(hwnd
, IDC_HIDEMOUSE
, cfg
.hide_mouseptr
);
660 CheckDlgButton(hwnd
, IDC_SUNKENEDGE
, cfg
.sunken_edge
);
661 CheckRadioButton(hwnd
, IDC_CURBLOCK
, IDC_CURVERT
,
662 cfg
.cursor_type
== 0 ? IDC_CURBLOCK
:
663 cfg
.cursor_type
== 1 ? IDC_CURUNDER
: IDC_CURVERT
);
664 CheckDlgButton(hwnd
, IDC_BLINKCUR
, cfg
.blink_cur
);
665 CheckDlgButton(hwnd
, IDC_SCROLLBAR
, cfg
.scrollbar
);
666 CheckDlgButton(hwnd
, IDC_LOCKSIZE
, cfg
.locksize
);
667 CheckRadioButton(hwnd
, IDC_COEALWAYS
, IDC_COENORMAL
,
668 cfg
.close_on_exit
== COE_NORMAL ? IDC_COENORMAL
:
670 COE_NEVER ? IDC_COENEVER
: IDC_COEALWAYS
);
671 CheckDlgButton(hwnd
, IDC_CLOSEWARN
, cfg
.warn_on_close
);
673 SetDlgItemText(hwnd
, IDC_TTEDIT
, cfg
.termtype
);
674 SetDlgItemText(hwnd
, IDC_TSEDIT
, cfg
.termspeed
);
675 SetDlgItemText(hwnd
, IDC_R_TSEDIT
, cfg
.termspeed
);
676 SetDlgItemText(hwnd
, IDC_RLLUSEREDIT
, cfg
.localusername
);
677 SetDlgItemText(hwnd
, IDC_LOGEDIT
, cfg
.username
);
678 SetDlgItemText(hwnd
, IDC_LGFEDIT
, cfg
.logfilename
);
679 CheckRadioButton(hwnd
, IDC_LSTATOFF
, IDC_LSTATRAW
,
680 cfg
.logtype
== 0 ? IDC_LSTATOFF
:
681 cfg
.logtype
== 1 ? IDC_LSTATASCII
: IDC_LSTATRAW
);
682 CheckRadioButton(hwnd
, IDC_LSTATXOVR
, IDC_LSTATXASK
,
683 cfg
.logxfovr
== LGXF_OVR ? IDC_LSTATXOVR
:
684 cfg
.logxfovr
== LGXF_ASK ? IDC_LSTATXASK
:
687 char *p
= cfg
.environmt
;
688 SendDlgItemMessage(hwnd
, IDC_ENVLIST
, LB_RESETCONTENT
, 0, 0);
690 SendDlgItemMessage(hwnd
, IDC_ENVLIST
, LB_ADDSTRING
, 0,
696 SendDlgItemMessage(hwnd
, IDC_PFWDLIST
, LB_ADDSTRING
, 0,
701 CheckRadioButton(hwnd
, IDC_EMBSD
, IDC_EMRFC
,
702 cfg
.rfc_environ ? IDC_EMRFC
: IDC_EMBSD
);
703 CheckRadioButton(hwnd
, IDC_TPASSIVE
, IDC_TACTIVE
,
704 cfg
.passive_telnet ? IDC_TPASSIVE
: IDC_TACTIVE
);
706 SetDlgItemText(hwnd
, IDC_TTEDIT
, cfg
.termtype
);
707 SetDlgItemText(hwnd
, IDC_LOGEDIT
, cfg
.username
);
708 CheckDlgButton(hwnd
, IDC_NOPTY
, cfg
.nopty
);
709 CheckDlgButton(hwnd
, IDC_COMPRESS
, cfg
.compression
);
710 CheckDlgButton(hwnd
, IDC_BUGGYMAC
, cfg
.buggymac
);
711 CheckDlgButton(hwnd
, IDC_AGENTFWD
, cfg
.agentfwd
);
712 CheckRadioButton(hwnd
, IDC_SSHPROT1
, IDC_SSHPROT2
,
713 cfg
.sshprot
== 1 ? IDC_SSHPROT1
: IDC_SSHPROT2
);
714 CheckDlgButton(hwnd
, IDC_AUTHTIS
, cfg
.try_tis_auth
);
715 SetDlgItemText(hwnd
, IDC_PKEDIT
, cfg
.keyfile
);
716 SetDlgItemText(hwnd
, IDC_CMDEDIT
, cfg
.remote_cmd
);
720 static const struct { char *s
; int c
; } ciphers
[] = {
721 { "3DES", CIPHER_3DES
},
722 { "Blowfish", CIPHER_BLOWFISH
},
723 { "DES (SSH 1 only)", CIPHER_DES
},
724 { "AES (SSH 2 only)", CIPHER_AES
},
725 { "-- warn below here --", CIPHER_WARN
}
728 /* Set up the "selected ciphers" box. */
729 /* (cipherlist assumed to contain all ciphers) */
730 SendDlgItemMessage(hwnd
, IDC_CIPHERLIST
, LB_RESETCONTENT
, 0, 0);
731 for (i
= 0; i
< CIPHER_MAX
; i
++) {
732 int c
= cfg
.ssh_cipherlist
[i
];
735 for (j
= 0; j
< (sizeof ciphers
) / (sizeof ciphers
[0]); j
++) {
736 if (ciphers
[j
].c
== c
) {
741 pos
= SendDlgItemMessage(hwnd
, IDC_CIPHERLIST
, LB_ADDSTRING
,
743 SendDlgItemMessage(hwnd
, IDC_CIPHERLIST
, LB_SETITEMDATA
,
746 SendDlgItemMessage(hwnd
, IDC_CIPHERLIST
, LB_ADDSTRING
,
747 0, (LPARAM
) "FIXME1");
748 SendDlgItemMessage(hwnd
, IDC_CIPHERLIST
, LB_ADDSTRING
,
749 0, (LPARAM
) "FIXME2");
754 CheckRadioButton(hwnd
, IDC_MBWINDOWS
, IDC_MBXTERM
,
755 cfg
.mouse_is_xterm ? IDC_MBXTERM
: IDC_MBWINDOWS
);
756 CheckDlgButton(hwnd
, IDC_RAWCNP
, cfg
.rawcnp
);
758 static int tabs
[4] = { 25, 61, 96, 128 };
759 SendDlgItemMessage(hwnd
, IDC_CCLIST
, LB_SETTABSTOPS
, 4,
762 for (i
= 0; i
< 128; i
++) {
764 sprintf(str
, "%d\t(0x%02X)\t%c\t%d", i
, i
,
765 (i
>= 0x21 && i
!= 0x7F) ? i
: ' ', cfg
.wordness
[i
]);
766 SendDlgItemMessage(hwnd
, IDC_CCLIST
, LB_ADDSTRING
, 0,
770 CheckDlgButton(hwnd
, IDC_BOLDCOLOUR
, cfg
.bold_colour
);
771 CheckDlgButton(hwnd
, IDC_PALETTE
, cfg
.try_palette
);
774 n
= SendDlgItemMessage(hwnd
, IDC_COLOURLIST
, LB_GETCOUNT
, 0, 0);
775 for (i
= n
; i
-- > 0;)
776 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
777 LB_DELETESTRING
, i
, 0);
778 for (i
= 0; i
< 22; i
++)
779 if (cfg
.bold_colour
|| permcolour
[i
])
780 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
, LB_ADDSTRING
, 0,
781 (LPARAM
) colours
[i
]);
783 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
, LB_SETCURSEL
, 0, 0);
784 SetDlgItemInt(hwnd
, IDC_RVALUE
, cfg
.colours
[0][0], FALSE
);
785 SetDlgItemInt(hwnd
, IDC_GVALUE
, cfg
.colours
[0][1], FALSE
);
786 SetDlgItemInt(hwnd
, IDC_BVALUE
, cfg
.colours
[0][2], FALSE
);
792 SendDlgItemMessage(hwnd
, IDC_CODEPAGE
, CB_RESETCONTENT
, 0, 0);
793 for (i
= 0; (cp
= cp_enumerate(i
)) != NULL
; i
++) {
794 SendDlgItemMessage(hwnd
, IDC_CODEPAGE
, CB_ADDSTRING
,
796 if (!strcmp(cp
, cfg
.line_codepage
))
799 SendDlgItemMessage(hwnd
, IDC_CODEPAGE
, CB_SETCURSEL
, index
, 0);
802 CheckRadioButton(hwnd
, IDC_VTXWINDOWS
, IDC_VTUNICODE
,
803 cfg
.vtmode
== VT_XWINDOWS ? IDC_VTXWINDOWS
:
804 cfg
.vtmode
== VT_OEMANSI ? IDC_VTOEMANSI
:
805 cfg
.vtmode
== VT_OEMONLY ? IDC_VTOEMONLY
:
806 cfg
.vtmode
== VT_UNICODE ? IDC_VTUNICODE
:
809 CheckDlgButton(hwnd
, IDC_X11_FORWARD
, cfg
.x11_forward
);
810 SetDlgItemText(hwnd
, IDC_X11_DISPLAY
, cfg
.x11_display
);
812 CheckDlgButton(hwnd
, IDC_LPORT_ALL
, cfg
.lport_acceptall
);
813 CheckRadioButton(hwnd
, IDC_PFWDLOCAL
, IDC_PFWDREMOTE
, IDC_PFWDLOCAL
);
816 struct treeview_faff
{
821 static HTREEITEM
treeview_insert(struct treeview_faff
*faff
,
822 int level
, char *text
)
827 ins
.hParent
= (level
> 0 ? faff
->lastat
[level
- 1] : TVI_ROOT
);
828 ins
.hInsertAfter
= faff
->lastat
[level
];
829 #if _WIN32_IE >= 0x0400 && defined NONAMELESSUNION
830 #define INSITEM DUMMYUNIONNAME.item
834 ins
.INSITEM
.mask
= TVIF_TEXT
;
835 ins
.INSITEM
.pszText
= text
;
836 newitem
= TreeView_InsertItem(faff
->treeview
, &ins
);
838 TreeView_Expand(faff
->treeview
, faff
->lastat
[level
- 1],
840 faff
->lastat
[level
] = newitem
;
841 for (i
= level
+ 1; i
< 4; i
++)
842 faff
->lastat
[i
] = NULL
;
847 * Create the panelfuls of controls in the configuration box.
849 static void create_controls(HWND hwnd
, int dlgtype
, int panel
)
851 if (panel
== sessionpanelstart
) {
852 /* The Session panel. Accelerators used: [acgo] nprtih elsd w */
854 ctlposinit(&cp
, hwnd
, 80, 3, 13);
855 bartitle(&cp
, "Basic options for your PuTTY session",
858 beginbox(&cp
, "Specify your connection by host name or IP address",
861 "Host &Name (or IP address)",
862 IDC_HOSTSTATIC
, IDC_HOST
, 75,
863 "&Port", IDC_PORTSTATIC
, IDC_PORT
, 25, NULL
);
864 if (backends
[3].backend
== NULL
) {
865 /* this is PuTTYtel, so only three protocols available */
866 radioline(&cp
, "Protocol:", IDC_PROTSTATIC
, 3,
868 "&Telnet", IDC_PROTTELNET
,
869 "Rlog&in", IDC_PROTRLOGIN
, NULL
);
871 radioline(&cp
, "Protocol:", IDC_PROTSTATIC
, 4,
873 "&Telnet", IDC_PROTTELNET
,
874 "Rlog&in", IDC_PROTRLOGIN
,
883 beginbox(&cp
, "Load, save or delete a stored session",
885 sesssaver(&cp
, "Sav&ed Sessions",
886 IDC_SESSSTATIC
, IDC_SESSEDIT
, IDC_SESSLIST
,
887 "&Load", IDC_SESSLOAD
,
888 "&Save", IDC_SESSSAVE
, "&Delete", IDC_SESSDEL
, NULL
);
891 beginbox(&cp
, NULL
, IDC_BOX_SESSION3
);
892 radioline(&cp
, "Close &window on exit:", IDC_CLOSEEXIT
, 4,
893 "Always", IDC_COEALWAYS
,
894 "Never", IDC_COENEVER
,
895 "Only on clean exit", IDC_COENORMAL
, NULL
);
899 if (panel
== loggingpanelstart
) {
900 /* The Logging panel. Accelerators used: [acgo] tplfwe */
902 ctlposinit(&cp
, hwnd
, 80, 3, 13);
903 bartitle(&cp
, "Options controlling session logging",
905 beginbox(&cp
, NULL
, IDC_BOX_LOGGING1
);
907 "Session logging:", IDC_LSTATSTATIC
,
908 "Logging &turned off completely", IDC_LSTATOFF
,
909 "Log &printable output only", IDC_LSTATASCII
,
910 "&Log all session output", IDC_LSTATRAW
, NULL
);
911 editbutton(&cp
, "Log &file name:",
912 IDC_LGFSTATIC
, IDC_LGFEDIT
, "Bro&wse...",
915 "What to do if the log file already &exists:",
916 IDC_LSTATXIST
, "Always overwrite it", IDC_LSTATXOVR
,
917 "Always append to the end of it", IDC_LSTATXAPN
,
918 "Ask the user every time", IDC_LSTATXASK
, NULL
);
922 if (panel
== terminalpanelstart
) {
923 /* The Terminal panel. Accelerators used: [acgo] wdlen hts */
925 ctlposinit(&cp
, hwnd
, 80, 3, 13);
926 bartitle(&cp
, "Options controlling the terminal emulation",
928 beginbox(&cp
, "Set various terminal options", IDC_BOX_TERMINAL1
);
929 checkbox(&cp
, "Auto &wrap mode initially on", IDC_WRAPMODE
);
930 checkbox(&cp
, "&DEC Origin Mode initially on", IDC_DECOM
);
931 checkbox(&cp
, "Implicit CR in every &LF", IDC_LFHASCR
);
932 checkbox(&cp
, "Use background colour to &erase screen", IDC_BCE
);
933 checkbox(&cp
, "Enable bli&nking text", IDC_BLINKTEXT
);
935 "An&swerback to ^E:", IDC_ANSWERBACK
,
936 IDC_ANSWEREDIT
, 100, NULL
);
939 beginbox(&cp
, "Line discipline options", IDC_BOX_TERMINAL2
);
940 radioline(&cp
, "Local ec&ho:", IDC_ECHOSTATIC
, 3,
941 "Auto", IDC_ECHOBACKEND
,
942 "Force on", IDC_ECHOYES
, "Force off", IDC_ECHONO
, NULL
);
943 radioline(&cp
, "Local line edi&ting:", IDC_EDITSTATIC
, 3,
944 "Auto", IDC_EDITBACKEND
,
945 "Force on", IDC_EDITYES
, "Force off", IDC_EDITNO
, NULL
);
949 if (panel
== bellpanelstart
) {
950 /* The Bell panel. Accelerators used: [acgo] bdsm wit */
952 ctlposinit(&cp
, hwnd
, 80, 3, 13);
953 bartitle(&cp
, "Options controlling the terminal bell",
955 beginbox(&cp
, "Set the style of bell", IDC_BOX_BELL1
);
957 "Action to happen when a &bell occurs:", IDC_BELLSTATIC
,
958 "None (bell disabled)", IDC_BELL_DISABLED
,
959 "Play Windows Default Sound", IDC_BELL_DEFAULT
,
960 "Play a custom sound file", IDC_BELL_WAVEFILE
,
961 "Visual bell (flash window)", IDC_BELL_VISUAL
, NULL
);
962 editbutton(&cp
, "Custom sound file to play as a bell:",
963 IDC_BELL_WAVESTATIC
, IDC_BELL_WAVEEDIT
,
964 "Bro&wse...", IDC_BELL_WAVEBROWSE
);
965 radioline(&cp
, "Taskbar/caption &indication on bell:",
966 IDC_B_IND_STATIC
, 3, "Disabled", IDC_B_IND_DISABLED
,
967 "Flashing", IDC_B_IND_FLASH
, "Steady", IDC_B_IND_STEADY
,
970 beginbox(&cp
, "Control the bell overload behaviour",
972 checkbox(&cp
, "Bell is temporarily &disabled when over-used",
974 staticedit(&cp
, "Over-use means this &many bells...",
975 IDC_BELLOVLNSTATIC
, IDC_BELLOVLN
, 20);
976 staticedit(&cp
, "... in &this many seconds",
977 IDC_BELLOVLTSTATIC
, IDC_BELLOVLT
, 20);
979 "The bell is re-enabled after a few seconds of silence.",
981 staticedit(&cp
, "Seconds of &silence required", IDC_BELLOVLSSTATIC
,
986 if (panel
== keyboardpanelstart
) {
987 /* The Keyboard panel. Accelerators used: [acgo] bhf ruyntd */
989 ctlposinit(&cp
, hwnd
, 80, 3, 13);
991 bartitle(&cp, "Options controlling the effects of keys",
994 beginbox(&cp
, "Change the sequences sent by:", IDC_BOX_KEYBOARD1
);
995 radioline(&cp
, "The &Backspace key", IDC_DELSTATIC
, 2,
996 "Control-H", IDC_DEL008
,
997 "Control-? (127)", IDC_DEL127
, NULL
);
998 radioline(&cp
, "The &Home and End keys", IDC_HOMESTATIC
, 2,
999 "Standard", IDC_HOMETILDE
, "rxvt", IDC_HOMERXVT
, NULL
);
1000 radioline(&cp
, "The &Function keys and keypad", IDC_FUNCSTATIC
, 3,
1001 "ESC[n~", IDC_FUNCTILDE
,
1002 "Linux", IDC_FUNCLINUX
,
1003 "Xterm R6", IDC_FUNCXTERM
,
1004 "VT400", IDC_FUNCVT400
,
1005 "VT100+", IDC_FUNCVT100P
, "SCO", IDC_FUNCSCO
, NULL
);
1007 beginbox(&cp
, "Application keypad settings:", IDC_BOX_KEYBOARD2
);
1009 "Application c&ursor keys totally disabled",
1011 radioline(&cp
, "Initial state of cu&rsor keys:", IDC_CURSTATIC
, 2,
1012 "Normal", IDC_CURNORMAL
,
1013 "Application", IDC_CURAPPLIC
, NULL
);
1015 "Application ke&ypad keys totally disabled",
1017 radioline(&cp
, "Initial state of &numeric keypad:", IDC_KPSTATIC
,
1018 3, "Normal", IDC_KPNORMAL
, "Application", IDC_KPAPPLIC
,
1019 "NetHack", IDC_KPNH
, NULL
);
1021 beginbox(&cp
, "Enable extra keyboard features:",
1023 checkbox(&cp
, "AltGr ac&ts as Compose key", IDC_COMPOSEKEY
);
1024 checkbox(&cp
, "Control-Alt is &different from AltGr",
1029 if (panel
== windowpanelstart
) {
1030 /* The Window panel. Accelerators used: [acgo] rmz sdkp w4ylt */
1032 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1033 bartitle(&cp
, "Options controlling PuTTY's window",
1035 beginbox(&cp
, "Set the size of the window", IDC_BOX_WINDOW1
);
1037 "&Rows", IDC_ROWSSTATIC
, IDC_ROWSEDIT
, 50,
1038 "Colu&mns", IDC_COLSSTATIC
, IDC_COLSEDIT
, 50, NULL
);
1039 checkbox(&cp
, "Lock window size against resi&zing", IDC_LOCKSIZE
);
1041 beginbox(&cp
, "Control the scrollback in the window",
1043 staticedit(&cp
, "Lines of &scrollback",
1044 IDC_SAVESTATIC
, IDC_SAVEEDIT
, 50);
1045 checkbox(&cp
, "&Display scrollbar", IDC_SCROLLBAR
);
1046 checkbox(&cp
, "Reset scrollback on &keypress", IDC_SCROLLKEY
);
1047 checkbox(&cp
, "Reset scrollback on dis&play activity",
1050 beginbox(&cp
, NULL
, IDC_BOX_WINDOW3
);
1051 checkbox(&cp
, "&Warn before closing window", IDC_CLOSEWARN
);
1052 checkbox(&cp
, "Window closes on ALT-F&4", IDC_ALTF4
);
1053 checkbox(&cp
, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE
);
1054 checkbox(&cp
, "System menu appears on A< alone", IDC_ALTONLY
);
1055 checkbox(&cp
, "Ensure window is always on &top", IDC_ALWAYSONTOP
);
1059 if (panel
== appearancepanelstart
) {
1060 /* The Appearance panel. Accelerators used: [acgo] luvb h ti p s */
1062 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1063 bartitle(&cp
, "Options controlling PuTTY's appearance",
1064 IDC_TITLE_APPEARANCE
);
1065 beginbox(&cp
, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1
);
1066 radioline(&cp
, "Cursor appearance:", IDC_CURSORSTATIC
, 3,
1067 "B&lock", IDC_CURBLOCK
,
1068 "&Underline", IDC_CURUNDER
,
1069 "&Vertical line", IDC_CURVERT
, NULL
);
1070 checkbox(&cp
, "Cursor &blinks", IDC_BLINKCUR
);
1072 beginbox(&cp
, "Set the font used in the terminal window",
1073 IDC_BOX_APPEARANCE2
);
1074 staticbtn(&cp
, "", IDC_FONTSTATIC
, "C&hange...", IDC_CHOOSEFONT
);
1076 beginbox(&cp
, "Adjust the use of the window title",
1077 IDC_BOX_APPEARANCE3
);
1079 "Window &title:", IDC_WINTITLE
, IDC_WINEDIT
, 100, NULL
);
1080 checkbox(&cp
, "Avoid ever using &icon title", IDC_WINNAME
);
1082 beginbox(&cp
, "Adjust the use of the mouse pointer",
1083 IDC_BOX_APPEARANCE4
);
1084 checkbox(&cp
, "Hide mouse &pointer when typing in window",
1087 beginbox(&cp
, "Adjust the window border", IDC_BOX_APPEARANCE5
);
1088 checkbox(&cp
, "&Sunken-edge border (slightly thicker)",
1093 if (panel
== translationpanelstart
) {
1094 /* The Translation panel. Accelerators used: [acgo] xbep t s */
1096 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1097 bartitle(&cp
, "Options controlling character set translation",
1098 IDC_TITLE_TRANSLATION
);
1099 beginbox(&cp
, "Adjust how PuTTY displays line drawing characters",
1100 IDC_BOX_TRANSLATION1
);
1102 "Handling of line drawing characters:", IDC_VTSTATIC
,
1103 "Font has &XWindows encoding", IDC_VTXWINDOWS
,
1104 "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI
,
1105 "Use font in O&EM mode only", IDC_VTOEMONLY
,
1106 "&Poor man's line drawing (" "+" ", " "-" " and " "|" ")",
1107 IDC_VTPOORMAN
, "&Unicode mode", IDC_VTUNICODE
, NULL
);
1109 beginbox(&cp
, "Character set translation on received data",
1110 IDC_BOX_TRANSLATION2
);
1112 "Received data assumed to be in which character set:",
1113 IDC_CODEPAGESTATIC
, IDC_CODEPAGE
);
1117 if (panel
== selectionpanelstart
) {
1118 /* The Selection panel. Accelerators used: [acgo] d wx hst */
1120 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1121 bartitle(&cp
, "Options controlling copy and paste",
1122 IDC_TITLE_SELECTION
);
1123 beginbox(&cp
, "Translation of pasted characters",
1124 IDC_BOX_SELECTION1
);
1126 "&Don't translate line drawing chars into +, - and |",
1129 beginbox(&cp
, "Control which mouse button does which thing",
1130 IDC_BOX_SELECTION2
);
1131 radiobig(&cp
, "Action of mouse buttons:", IDC_MBSTATIC
,
1132 "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS
,
1133 "&xterm (Right extends, Middle pastes)", IDC_MBXTERM
,
1136 beginbox(&cp
, "Control the select-one-word-at-a-time mode",
1137 IDC_BOX_SELECTION3
);
1138 charclass(&cp
, "C&haracter classes:", IDC_CCSTATIC
, IDC_CCLIST
,
1139 "&Set", IDC_CCSET
, IDC_CCEDIT
,
1140 "&to class", IDC_CCSTATIC2
);
1144 if (panel
== colourspanelstart
) {
1145 /* The Colours panel. Accelerators used: [acgo] blum */
1147 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1148 bartitle(&cp
, "Options controlling use of colours",
1150 beginbox(&cp
, "General options for colour usage",
1152 checkbox(&cp
, "&Bolded text is a different colour",
1154 checkbox(&cp
, "Attempt to use &logical palettes", IDC_PALETTE
);
1156 beginbox(&cp
, "Adjust the precise colours PuTTY displays",
1158 colouredit(&cp
, "Select a colo&ur and then click to modify it:",
1159 IDC_COLOURSTATIC
, IDC_COLOURLIST
,
1160 "&Modify...", IDC_CHANGE
,
1161 "Red:", IDC_RSTATIC
, IDC_RVALUE
,
1162 "Green:", IDC_GSTATIC
, IDC_GVALUE
,
1163 "Blue:", IDC_BSTATIC
, IDC_BVALUE
, NULL
);
1167 if (panel
== connectionpanelstart
) {
1168 /* The Connection panel. Accelerators used: [acgo] tuk */
1170 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1171 bartitle(&cp
, "Options controlling the connection",
1172 IDC_TITLE_CONNECTION
);
1174 beginbox(&cp
, "Data to send to the server",
1175 IDC_BOX_CONNECTION1
);
1176 staticedit(&cp
, "Terminal-&type string", IDC_TTSTATIC
,
1178 staticedit(&cp
, "Auto-login &username", IDC_LOGSTATIC
,
1182 beginbox(&cp
, "Adjust telnet session.", IDC_BOX_CONNECTION1
);
1183 checkbox(&cp
, "Keyboard sends telnet Backspace and Interrupt",
1187 beginbox(&cp
, "Sending of null packets to keep session active",
1188 IDC_BOX_CONNECTION2
);
1189 staticedit(&cp
, "Seconds between &keepalives (0 to turn off)",
1190 IDC_PINGSTATIC
, IDC_PINGEDIT
, 20);
1194 if (panel
== telnetpanelstart
) {
1195 /* The Telnet panel. Accelerators used: [acgo] svldr bftk */
1197 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1199 bartitle(&cp
, "Options controlling Telnet connections",
1201 beginbox(&cp
, "Data to send to the server", IDC_BOX_TELNET1
);
1202 staticedit(&cp
, "Terminal-&speed string", IDC_TSSTATIC
,
1204 envsetter(&cp
, "Environment variables:", IDC_ENVSTATIC
,
1205 "&Variable", IDC_VARSTATIC
, IDC_VAREDIT
, "Va&lue",
1206 IDC_VALSTATIC
, IDC_VALEDIT
, IDC_ENVLIST
, "A&dd",
1207 IDC_ENVADD
, "&Remove", IDC_ENVREMOVE
);
1209 beginbox(&cp
, "Telnet protocol adjustments", IDC_BOX_TELNET2
);
1210 radioline(&cp
, "Handling of OLD_ENVIRON ambiguity:",
1211 IDC_EMSTATIC
, 2, "&BSD (commonplace)", IDC_EMBSD
,
1212 "R&FC 1408 (unusual)", IDC_EMRFC
, NULL
);
1213 radioline(&cp
, "&Telnet negotiation mode:", IDC_ACTSTATIC
, 2,
1214 "Passive", IDC_TPASSIVE
, "Active",
1216 checkbox(&cp
, "&Keyboard sends telnet Backspace and Interrupt",
1222 if (panel
== rloginpanelstart
) {
1223 /* The Rlogin panel. Accelerators used: [acgo] sl */
1225 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1227 bartitle(&cp
, "Options controlling Rlogin connections",
1229 beginbox(&cp
, "Data to send to the server", IDC_BOX_RLOGIN1
);
1230 staticedit(&cp
, "Terminal-&speed string", IDC_R_TSSTATIC
,
1232 staticedit(&cp
, "&Local username:", IDC_RLLUSERSTATIC
,
1233 IDC_RLLUSEREDIT
, 50);
1238 if (panel
== sshpanelstart
) {
1239 /* The SSH panel. Accelerators used: [acgo] r pe12i sud */
1241 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1243 bartitle(&cp
, "Options controlling SSH connections",
1245 beginbox(&cp
, "Data to send to the server", IDC_BOX_SSH1
);
1247 "&Remote command:", IDC_CMDSTATIC
, IDC_CMDEDIT
, 100,
1250 beginbox(&cp
, "Protocol options", IDC_BOX_SSH2
);
1251 checkbox(&cp
, "Don't allocate a &pseudo-terminal", IDC_NOPTY
);
1252 checkbox(&cp
, "Enable compr&ession", IDC_COMPRESS
);
1253 radioline(&cp
, "Preferred SSH protocol version:",
1254 IDC_SSHPROTSTATIC
, 2,
1255 "&1", IDC_SSHPROT1
, "&2", IDC_SSHPROT2
, NULL
);
1256 checkbox(&cp
, "&Imitate SSH 2 MAC bug in commercial <= v2.3.x",
1259 beginbox(&cp
, "Encryption options", IDC_BOX_SSH3
);
1260 prefslist(&cipherlist
, &cp
, "Encryption cipher &selection policy:",
1261 IDC_CIPHERSTATIC2
, IDC_CIPHERLIST
, IDC_CIPHERUP
,
1267 if (panel
== sshauthpanelstart
) {
1268 /* The SSH authentication panel. Accelerators used: [acgo] m fkw */
1270 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1272 bartitle(&cp
, "Options controlling SSH authentication",
1274 beginbox(&cp
, "Authentication methods",
1276 checkbox(&cp
, "Atte&mpt TIS or CryptoCard authentication",
1279 beginbox(&cp
, "Authentication parameters",
1281 checkbox(&cp
, "Allow agent &forwarding", IDC_AGENTFWD
);
1282 editbutton(&cp
, "Private &key file for authentication:",
1283 IDC_PKSTATIC
, IDC_PKEDIT
, "Bro&wse...",
1289 if (panel
== tunnelspanelstart
) {
1290 /* The Tunnels panel. Accelerators used: [acgo] deilmrstx */
1292 ctlposinit(&cp
, hwnd
, 80, 3, 13);
1294 bartitle(&cp
, "Options controlling SSH tunnelling",
1296 beginbox(&cp
, "X11 forwarding", IDC_BOX_TUNNELS1
);
1297 checkbox(&cp
, "&Enable X11 forwarding", IDC_X11_FORWARD
);
1298 multiedit(&cp
, "&X display location", IDC_X11_DISPSTATIC
,
1299 IDC_X11_DISPLAY
, 50, NULL
);
1301 beginbox(&cp
, "Port forwarding", IDC_BOX_TUNNELS2
);
1302 checkbox(&cp
, "Local ports accept connections from o&ther hosts", IDC_LPORT_ALL
);
1303 staticbtn(&cp
, "Forwarded ports:", IDC_PFWDSTATIC
,
1304 "&Remove", IDC_PFWDREMOVE
);
1305 fwdsetter(&cp
, IDC_PFWDLIST
,
1306 "Add new forwarded port:", IDC_PFWDSTATIC2
,
1307 "&Source port", IDC_SPORTSTATIC
, IDC_SPORTEDIT
,
1308 "Dest&ination", IDC_DPORTSTATIC
, IDC_DPORTEDIT
,
1309 "A&dd", IDC_PFWDADD
);
1310 bareradioline(&cp
, 2,
1311 "&Local", IDC_PFWDLOCAL
, "Re&mote", IDC_PFWDREMOTE
, NULL
);
1319 * Helper function to load the session selected in SESSLIST
1320 * if any, as this is done in more than one place in
1321 * GenericMainDlgProc(). 0 => failure.
1323 static int load_selected_session(HWND hwnd
)
1325 int n
= SendDlgItemMessage(hwnd
, IDC_SESSLIST
,
1326 LB_GETCURSEL
, 0, 0);
1332 isdef
= !strcmp(sessions
[n
], "Default Settings");
1333 load_settings(sessions
[n
], !isdef
, &cfg
);
1334 init_dlg_ctrls(hwnd
, TRUE
);
1336 SetDlgItemText(hwnd
, IDC_SESSEDIT
, sessions
[n
]);
1338 SetDlgItemText(hwnd
, IDC_SESSEDIT
, "");
1339 /* Restore the selection, which will have been clobbered by
1340 * SESSEDIT handling. */
1341 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_SETCURSEL
, n
, 0);
1346 * This function is the configuration box.
1348 static int GenericMainDlgProc(HWND hwnd
, UINT msg
,
1349 WPARAM wParam
, LPARAM lParam
, int dlgtype
)
1352 struct treeview_faff tvfaff
;
1355 char filename
[sizeof(cfg
.keyfile
)];
1358 char fontstatic
[256];
1360 struct servent
*service
;
1362 static UINT draglistmsg
= WM_NULL
;
1367 SetWindowLong(hwnd
, GWL_USERDATA
, 0);
1368 SendMessage(hwnd
, WM_SETICON
, (WPARAM
) ICON_BIG
,
1369 (LPARAM
) LoadIcon(hinst
, MAKEINTRESOURCE(IDI_CFGICON
)));
1371 * Centre the window.
1373 { /* centre the window */
1376 hw
= GetDesktopWindow();
1377 if (GetWindowRect(hw
, &rs
) && GetWindowRect(hwnd
, &rd
))
1379 (rs
.right
+ rs
.left
+ rd
.left
- rd
.right
) / 2,
1380 (rs
.bottom
+ rs
.top
+ rd
.top
- rd
.bottom
) / 2,
1381 rd
.right
- rd
.left
, rd
.bottom
- rd
.top
, TRUE
);
1385 * Create the tree view.
1393 r
.right
= r
.left
+ 75;
1395 r
.bottom
= r
.top
+ 10;
1396 MapDialogRect(hwnd
, &r
);
1397 tvstatic
= CreateWindowEx(0, "STATIC", "Cate&gory:",
1398 WS_CHILD
| WS_VISIBLE
,
1400 r
.right
- r
.left
, r
.bottom
- r
.top
,
1401 hwnd
, (HMENU
) IDCX_TVSTATIC
, hinst
,
1403 font
= SendMessage(hwnd
, WM_GETFONT
, 0, 0);
1404 SendMessage(tvstatic
, WM_SETFONT
, font
, MAKELPARAM(TRUE
, 0));
1407 r
.right
= r
.left
+ 75;
1409 r
.bottom
= r
.top
+ 206;
1410 MapDialogRect(hwnd
, &r
);
1411 treeview
= CreateWindowEx(WS_EX_CLIENTEDGE
, WC_TREEVIEW
, "",
1412 WS_CHILD
| WS_VISIBLE
|
1413 WS_TABSTOP
| TVS_HASLINES
|
1414 TVS_DISABLEDRAGDROP
| TVS_HASBUTTONS
1416 TVS_SHOWSELALWAYS
, r
.left
, r
.top
,
1417 r
.right
- r
.left
, r
.bottom
- r
.top
,
1418 hwnd
, (HMENU
) IDCX_TREEVIEW
, hinst
,
1420 font
= SendMessage(hwnd
, WM_GETFONT
, 0, 0);
1421 SendMessage(treeview
, WM_SETFONT
, font
, MAKELPARAM(TRUE
, 0));
1422 tvfaff
.treeview
= treeview
;
1423 memset(tvfaff
.lastat
, 0, sizeof(tvfaff
.lastat
));
1427 * Set up the tree view contents.
1429 hsession
= treeview_insert(&tvfaff
, 0, "Session");
1430 treeview_insert(&tvfaff
, 1, "Logging");
1431 treeview_insert(&tvfaff
, 0, "Terminal");
1432 treeview_insert(&tvfaff
, 1, "Keyboard");
1433 treeview_insert(&tvfaff
, 1, "Bell");
1434 treeview_insert(&tvfaff
, 0, "Window");
1435 treeview_insert(&tvfaff
, 1, "Appearance");
1436 treeview_insert(&tvfaff
, 1, "Translation");
1437 treeview_insert(&tvfaff
, 1, "Selection");
1438 treeview_insert(&tvfaff
, 1, "Colours");
1439 treeview_insert(&tvfaff
, 0, "Connection");
1441 treeview_insert(&tvfaff
, 1, "Telnet");
1442 treeview_insert(&tvfaff
, 1, "Rlogin");
1443 if (backends
[3].backend
!= NULL
) {
1444 treeview_insert(&tvfaff
, 1, "SSH");
1445 /* XXX long name is ugly */
1446 /* XXX make it closed by default? */
1447 treeview_insert(&tvfaff
, 2, "Auth");
1448 treeview_insert(&tvfaff
, 2, "Tunnels");
1453 * Put the treeview selection on to the Session panel. This
1454 * should also cause creation of the relevant controls.
1456 TreeView_SelectItem(treeview
, hsession
);
1459 * Set focus into the first available control.
1463 ctl
= GetDlgItem(hwnd
, IDC_HOST
);
1465 ctl
= GetDlgItem(hwnd
, IDC_CLOSEEXIT
);
1469 SetWindowLong(hwnd
, GWL_USERDATA
, 1);
1470 sesslist_has_focus
= 0;
1474 * Button release should trigger WM_OK if there was a
1475 * previous double click on the session list.
1479 SendMessage(hwnd
, WM_COMMAND
, IDOK
, 0);
1482 if (LOWORD(wParam
) == IDCX_TREEVIEW
&&
1483 ((LPNMHDR
) lParam
)->code
== TVN_SELCHANGED
) {
1485 TreeView_GetSelection(((LPNMHDR
) lParam
)->hwndFrom
);
1490 item
.pszText
= buffer
;
1491 item
.cchTextMax
= sizeof(buffer
);
1492 item
.mask
= TVIF_TEXT
;
1493 TreeView_GetItem(((LPNMHDR
) lParam
)->hwndFrom
, &item
);
1494 for (j
= controlstartvalue
; j
< controlendvalue
; j
++) {
1495 HWND item
= GetDlgItem(hwnd
, j
);
1497 DestroyWindow(item
);
1499 if (!strcmp(buffer
, "Session"))
1500 create_controls(hwnd
, dlgtype
, sessionpanelstart
);
1501 if (!strcmp(buffer
, "Logging"))
1502 create_controls(hwnd
, dlgtype
, loggingpanelstart
);
1503 if (!strcmp(buffer
, "Keyboard"))
1504 create_controls(hwnd
, dlgtype
, keyboardpanelstart
);
1505 if (!strcmp(buffer
, "Terminal"))
1506 create_controls(hwnd
, dlgtype
, terminalpanelstart
);
1507 if (!strcmp(buffer
, "Bell"))
1508 create_controls(hwnd
, dlgtype
, bellpanelstart
);
1509 if (!strcmp(buffer
, "Window"))
1510 create_controls(hwnd
, dlgtype
, windowpanelstart
);
1511 if (!strcmp(buffer
, "Appearance"))
1512 create_controls(hwnd
, dlgtype
, appearancepanelstart
);
1513 if (!strcmp(buffer
, "Tunnels"))
1514 create_controls(hwnd
, dlgtype
, tunnelspanelstart
);
1515 if (!strcmp(buffer
, "Connection"))
1516 create_controls(hwnd
, dlgtype
, connectionpanelstart
);
1517 if (!strcmp(buffer
, "Telnet"))
1518 create_controls(hwnd
, dlgtype
, telnetpanelstart
);
1519 if (!strcmp(buffer
, "Rlogin"))
1520 create_controls(hwnd
, dlgtype
, rloginpanelstart
);
1521 if (!strcmp(buffer
, "SSH"))
1522 create_controls(hwnd
, dlgtype
, sshpanelstart
);
1523 if (!strcmp(buffer
, "Auth"))
1524 create_controls(hwnd
, dlgtype
, sshauthpanelstart
);
1525 if (!strcmp(buffer
, "Selection"))
1526 create_controls(hwnd
, dlgtype
, selectionpanelstart
);
1527 if (!strcmp(buffer
, "Colours"))
1528 create_controls(hwnd
, dlgtype
, colourspanelstart
);
1529 if (!strcmp(buffer
, "Translation"))
1530 create_controls(hwnd
, dlgtype
, translationpanelstart
);
1532 init_dlg_ctrls(hwnd
, FALSE
);
1534 SetFocus(((LPNMHDR
) lParam
)->hwndFrom
); /* ensure focus stays */
1540 * Only process WM_COMMAND once the dialog is fully formed.
1542 if (GetWindowLong(hwnd
, GWL_USERDATA
) == 1)
1543 switch (LOWORD(wParam
)) {
1545 /* Behaviour of the "Open" button is different if the
1546 * session list has focus, *unless* the user just
1547 * double-clicked... */
1548 if (sesslist_has_focus
&& !readytogo
) {
1549 if (!load_selected_session(hwnd
)) {
1554 /* If at this point we have a valid session, go! */
1563 case IDC_PROTTELNET
:
1564 case IDC_PROTRLOGIN
:
1567 if (HIWORD(wParam
) == BN_CLICKED
||
1568 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1569 int i
= IsDlgButtonChecked(hwnd
, IDC_PROTSSH
);
1570 int j
= IsDlgButtonChecked(hwnd
, IDC_PROTTELNET
);
1571 int k
= IsDlgButtonChecked(hwnd
, IDC_PROTRLOGIN
);
1573 i ? PROT_SSH
: j ? PROT_TELNET
: k ? PROT_RLOGIN
:
1575 if ((cfg
.protocol
== PROT_SSH
&& cfg
.port
!= 22)
1576 || (cfg
.protocol
== PROT_TELNET
&& cfg
.port
!= 23)
1577 || (cfg
.protocol
== PROT_RLOGIN
1578 && cfg
.port
!= 513)) {
1579 cfg
.port
= i ?
22 : j ?
23 : 513;
1580 SetDlgItemInt(hwnd
, IDC_PORT
, cfg
.port
, FALSE
);
1585 if (HIWORD(wParam
) == EN_CHANGE
)
1586 GetDlgItemText(hwnd
, IDC_HOST
, cfg
.host
,
1587 sizeof(cfg
.host
) - 1);
1590 if (HIWORD(wParam
) == EN_CHANGE
) {
1591 GetDlgItemText(hwnd
, IDC_PORT
, portname
, 31);
1592 if (isdigit(portname
[0]))
1593 MyGetDlgItemInt(hwnd
, IDC_PORT
, &cfg
.port
);
1595 service
= getservbyname(portname
, NULL
);
1597 cfg
.port
= ntohs(service
->s_port
);
1604 if (HIWORD(wParam
) == EN_CHANGE
) {
1605 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_SETCURSEL
,
1607 GetDlgItemText(hwnd
, IDC_SESSEDIT
,
1608 savedsession
, sizeof(savedsession
) - 1);
1609 savedsession
[sizeof(savedsession
) - 1] = '\0';
1613 if (HIWORD(wParam
) == BN_CLICKED
||
1614 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1619 GetDlgItemText(hwnd
, IDC_SESSEDIT
, str
,
1622 int n
= SendDlgItemMessage(hwnd
, IDC_SESSLIST
,
1623 LB_GETCURSEL
, 0, 0);
1628 strcpy(str
, sessions
[n
]);
1630 save_settings(str
, !!strcmp(str
, "Default Settings"),
1632 get_sesslist(FALSE
);
1634 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, WM_SETREDRAW
,
1636 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_RESETCONTENT
,
1638 for (i
= 0; i
< nsessions
; i
++)
1639 SendDlgItemMessage(hwnd
, IDC_SESSLIST
,
1641 (LPARAM
) (sessions
[i
]));
1642 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_SETCURSEL
,
1644 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, WM_SETREDRAW
,
1646 InvalidateRect(GetDlgItem(hwnd
, IDC_SESSLIST
), NULL
,
1652 if (LOWORD(wParam
) == IDC_SESSLIST
) {
1653 if (HIWORD(wParam
) == LBN_SETFOCUS
)
1654 sesslist_has_focus
= 1;
1655 else if (HIWORD(wParam
) == LBN_KILLFOCUS
)
1656 sesslist_has_focus
= 0;
1658 if (LOWORD(wParam
) == IDC_SESSLOAD
&&
1659 HIWORD(wParam
) != BN_CLICKED
&&
1660 HIWORD(wParam
) != BN_DOUBLECLICKED
) break;
1661 if (LOWORD(wParam
) == IDC_SESSLIST
&&
1662 HIWORD(wParam
) != LBN_DBLCLK
) break;
1663 /* Load the session selected in SESSLIST. */
1664 if (load_selected_session(hwnd
) &&
1665 LOWORD(wParam
) == IDC_SESSLIST
) {
1667 * A double-click on a saved session should
1668 * actually start the session, not just load it.
1669 * Unless it's Default Settings or some other
1670 * host-less set of saved settings.
1679 if (HIWORD(wParam
) == BN_CLICKED
||
1680 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1681 int n
= SendDlgItemMessage(hwnd
, IDC_SESSLIST
,
1682 LB_GETCURSEL
, 0, 0);
1683 if (n
== LB_ERR
|| n
== 0) {
1687 del_settings(sessions
[n
]);
1688 get_sesslist(FALSE
);
1690 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, WM_SETREDRAW
,
1692 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_RESETCONTENT
,
1694 for (i
= 0; i
< nsessions
; i
++)
1695 SendDlgItemMessage(hwnd
, IDC_SESSLIST
,
1697 (LPARAM
) (sessions
[i
]));
1698 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, LB_SETCURSEL
,
1700 SendDlgItemMessage(hwnd
, IDC_SESSLIST
, WM_SETREDRAW
,
1702 InvalidateRect(GetDlgItem(hwnd
, IDC_SESSLIST
), NULL
,
1706 if (HIWORD(wParam
) == EN_CHANGE
)
1707 MyGetDlgItemInt(hwnd
, IDC_PINGEDIT
,
1708 &cfg
.ping_interval
);
1712 if (HIWORD(wParam
) == BN_CLICKED
||
1713 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1714 cfg
.bksp_is_delete
=
1715 IsDlgButtonChecked(hwnd
, IDC_DEL127
);
1719 if (HIWORD(wParam
) == BN_CLICKED
||
1720 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1722 IsDlgButtonChecked(hwnd
, IDC_HOMERXVT
);
1728 case IDC_FUNCVT100P
:
1730 if (HIWORD(wParam
) == BN_CLICKED
||
1731 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1732 switch (LOWORD(wParam
)) {
1745 case IDC_FUNCVT100P
:
1755 if (HIWORD(wParam
) == BN_CLICKED
||
1756 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1758 IsDlgButtonChecked(hwnd
, IDC_KPAPPLIC
);
1759 cfg
.nethack_keypad
= FALSE
;
1763 if (HIWORD(wParam
) == BN_CLICKED
||
1764 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1765 cfg
.app_keypad
= FALSE
;
1766 cfg
.nethack_keypad
= TRUE
;
1771 if (HIWORD(wParam
) == BN_CLICKED
||
1772 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1774 IsDlgButtonChecked(hwnd
, IDC_CURAPPLIC
);
1777 if (HIWORD(wParam
) == BN_CLICKED
||
1778 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1780 IsDlgButtonChecked(hwnd
, IDC_NOAPPLICC
);
1783 if (HIWORD(wParam
) == BN_CLICKED
||
1784 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1786 IsDlgButtonChecked(hwnd
, IDC_NOAPPLICK
);
1789 if (HIWORD(wParam
) == BN_CLICKED
||
1790 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1791 cfg
.alt_f4
= IsDlgButtonChecked(hwnd
, IDC_ALTF4
);
1794 if (HIWORD(wParam
) == BN_CLICKED
||
1795 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1797 IsDlgButtonChecked(hwnd
, IDC_ALTSPACE
);
1800 if (HIWORD(wParam
) == BN_CLICKED
||
1801 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1803 IsDlgButtonChecked(hwnd
, IDC_ALTONLY
);
1805 case IDC_ECHOBACKEND
:
1808 if (HIWORD(wParam
) == BN_CLICKED
||
1809 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1810 if (LOWORD(wParam
) == IDC_ECHOBACKEND
)
1811 cfg
.localecho
= LD_BACKEND
;
1812 if (LOWORD(wParam
) == IDC_ECHOYES
)
1813 cfg
.localecho
= LD_YES
;
1814 if (LOWORD(wParam
) == IDC_ECHONO
)
1815 cfg
.localecho
= LD_NO
;
1818 case IDC_EDITBACKEND
:
1821 if (HIWORD(wParam
) == BN_CLICKED
||
1822 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1823 if (LOWORD(wParam
) == IDC_EDITBACKEND
)
1824 cfg
.localedit
= LD_BACKEND
;
1825 if (LOWORD(wParam
) == IDC_EDITYES
)
1826 cfg
.localedit
= LD_YES
;
1827 if (LOWORD(wParam
) == IDC_EDITNO
)
1828 cfg
.localedit
= LD_NO
;
1831 case IDC_ANSWEREDIT
:
1832 if (HIWORD(wParam
) == EN_CHANGE
)
1833 GetDlgItemText(hwnd
, IDC_ANSWEREDIT
, cfg
.answerback
,
1834 sizeof(cfg
.answerback
) - 1);
1836 case IDC_ALWAYSONTOP
:
1837 if (HIWORD(wParam
) == BN_CLICKED
||
1838 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1840 IsDlgButtonChecked(hwnd
, IDC_ALWAYSONTOP
);
1843 if (HIWORD(wParam
) == BN_CLICKED
||
1844 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1846 IsDlgButtonChecked(hwnd
, IDC_SCROLLKEY
);
1848 case IDC_SCROLLDISP
:
1849 if (HIWORD(wParam
) == BN_CLICKED
||
1850 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1851 cfg
.scroll_on_disp
=
1852 IsDlgButtonChecked(hwnd
, IDC_SCROLLDISP
);
1854 case IDC_COMPOSEKEY
:
1855 if (HIWORD(wParam
) == BN_CLICKED
||
1856 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1858 IsDlgButtonChecked(hwnd
, IDC_COMPOSEKEY
);
1860 case IDC_CTRLALTKEYS
:
1861 if (HIWORD(wParam
) == BN_CLICKED
||
1862 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1864 IsDlgButtonChecked(hwnd
, IDC_CTRLALTKEYS
);
1867 if (HIWORD(wParam
) == BN_CLICKED
||
1868 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1869 cfg
.telnet_keyboard
=
1870 IsDlgButtonChecked(hwnd
, IDC_TELNETKEY
);
1873 if (HIWORD(wParam
) == BN_CLICKED
||
1874 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1876 IsDlgButtonChecked(hwnd
, IDC_WRAPMODE
);
1879 if (HIWORD(wParam
) == BN_CLICKED
||
1880 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1881 cfg
.dec_om
= IsDlgButtonChecked(hwnd
, IDC_DECOM
);
1884 if (HIWORD(wParam
) == BN_CLICKED
||
1885 HIWORD(wParam
) == BN_DOUBLECLICKED
)
1887 IsDlgButtonChecked(hwnd
, IDC_LFHASCR
);
1890 if (HIWORD(wParam
) == EN_CHANGE
)
1891 MyGetDlgItemInt(hwnd
, IDC_ROWSEDIT
, &cfg
.height
);
1894 if (HIWORD(wParam
) == EN_CHANGE
)
1895 MyGetDlgItemInt(hwnd
, IDC_COLSEDIT
, &cfg
.width
);
1898 if (HIWORD(wParam
) == EN_CHANGE
)
1899 MyGetDlgItemInt(hwnd
, IDC_SAVEEDIT
, &cfg
.savelines
);
1901 case IDC_CHOOSEFONT
:
1904 lf
.lfHeight
= -MulDiv(cfg
.fontheight
,
1905 GetDeviceCaps(hdc
, LOGPIXELSY
),
1909 lf
.lfWidth
= lf
.lfEscapement
= lf
.lfOrientation
= 0;
1910 lf
.lfItalic
= lf
.lfUnderline
= lf
.lfStrikeOut
= 0;
1911 lf
.lfWeight
= (cfg
.fontisbold ? FW_BOLD
: 0);
1912 lf
.lfCharSet
= cfg
.fontcharset
;
1913 lf
.lfOutPrecision
= OUT_DEFAULT_PRECIS
;
1914 lf
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
1915 lf
.lfQuality
= DEFAULT_QUALITY
;
1916 lf
.lfPitchAndFamily
= FIXED_PITCH
| FF_DONTCARE
;
1917 strncpy(lf
.lfFaceName
, cfg
.font
,
1918 sizeof(lf
.lfFaceName
) - 1);
1919 lf
.lfFaceName
[sizeof(lf
.lfFaceName
) - 1] = '\0';
1921 cf
.lStructSize
= sizeof(cf
);
1922 cf
.hwndOwner
= hwnd
;
1924 cf
.Flags
= CF_FIXEDPITCHONLY
| CF_FORCEFONTEXIST
|
1925 CF_INITTOLOGFONTSTRUCT
| CF_SCREENFONTS
;
1927 if (ChooseFont(&cf
)) {
1928 strncpy(cfg
.font
, lf
.lfFaceName
, sizeof(cfg
.font
) - 1);
1929 cfg
.font
[sizeof(cfg
.font
) - 1] = '\0';
1930 cfg
.fontisbold
= (lf
.lfWeight
== FW_BOLD
);
1931 cfg
.fontcharset
= lf
.lfCharSet
;
1932 cfg
.fontheight
= cf
.iPointSize
/ 10;
1933 fmtfont(fontstatic
);
1934 SetDlgItemText(hwnd
, IDC_FONTSTATIC
, fontstatic
);
1937 case IDC_BELL_DISABLED
:
1938 case IDC_BELL_DEFAULT
:
1939 case IDC_BELL_WAVEFILE
:
1940 case IDC_BELL_VISUAL
:
1941 if (HIWORD(wParam
) == BN_CLICKED
||
1942 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1943 if (LOWORD(wParam
) == IDC_BELL_DISABLED
)
1944 cfg
.beep
= BELL_DISABLED
;
1945 if (LOWORD(wParam
) == IDC_BELL_DEFAULT
)
1946 cfg
.beep
= BELL_DEFAULT
;
1947 if (LOWORD(wParam
) == IDC_BELL_WAVEFILE
)
1948 cfg
.beep
= BELL_WAVEFILE
;
1949 if (LOWORD(wParam
) == IDC_BELL_VISUAL
)
1950 cfg
.beep
= BELL_VISUAL
;
1953 case IDC_B_IND_DISABLED
:
1954 case IDC_B_IND_FLASH
:
1955 case IDC_B_IND_STEADY
:
1956 if (HIWORD(wParam
) == BN_CLICKED
||
1957 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
1958 if (LOWORD(wParam
) == IDC_B_IND_DISABLED
)
1959 cfg
.beep_ind
= B_IND_DISABLED
;
1960 if (LOWORD(wParam
) == IDC_B_IND_FLASH
)
1961 cfg
.beep_ind
= B_IND_FLASH
;
1962 if (LOWORD(wParam
) == IDC_B_IND_STEADY
)
1963 cfg
.beep_ind
= B_IND_STEADY
;
1966 case IDC_BELL_WAVEBROWSE
:
1967 memset(&of
, 0, sizeof(of
));
1968 #ifdef OPENFILENAME_SIZE_VERSION_400
1969 of
.lStructSize
= OPENFILENAME_SIZE_VERSION_400
;
1971 of
.lStructSize
= sizeof(of
);
1973 of
.hwndOwner
= hwnd
;
1974 of
.lpstrFilter
= "Wave Files\0*.WAV\0AllFiles\0*\0\0\0";
1975 of
.lpstrCustomFilter
= NULL
;
1976 of
.nFilterIndex
= 1;
1977 of
.lpstrFile
= filename
;
1978 strcpy(filename
, cfg
.bell_wavefile
);
1979 of
.nMaxFile
= sizeof(filename
);
1980 of
.lpstrFileTitle
= NULL
;
1981 of
.lpstrInitialDir
= NULL
;
1982 of
.lpstrTitle
= "Select Bell Sound File";
1984 if (GetOpenFileName(&of
)) {
1985 strcpy(cfg
.bell_wavefile
, filename
);
1986 SetDlgItemText(hwnd
, IDC_BELL_WAVEEDIT
,
1990 case IDC_BELL_WAVEEDIT
:
1991 if (HIWORD(wParam
) == EN_CHANGE
)
1992 GetDlgItemText(hwnd
, IDC_BELL_WAVEEDIT
,
1994 sizeof(cfg
.bell_wavefile
) - 1);
1997 if (HIWORD(wParam
) == BN_CLICKED
||
1998 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2000 IsDlgButtonChecked(hwnd
, IDC_BELLOVL
);
2003 if (HIWORD(wParam
) == EN_CHANGE
)
2004 MyGetDlgItemInt(hwnd
, IDC_BELLOVLN
, &cfg
.bellovl_n
);
2007 if (HIWORD(wParam
) == EN_CHANGE
)
2008 MyGetDlgItemFlt(hwnd
, IDC_BELLOVLT
, &cfg
.bellovl_t
,
2012 if (HIWORD(wParam
) == EN_CHANGE
)
2013 MyGetDlgItemFlt(hwnd
, IDC_BELLOVLS
, &cfg
.bellovl_s
,
2017 if (HIWORD(wParam
) == BN_CLICKED
||
2018 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2020 IsDlgButtonChecked(hwnd
, IDC_BLINKTEXT
);
2023 if (HIWORD(wParam
) == BN_CLICKED
||
2024 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2025 cfg
.bce
= IsDlgButtonChecked(hwnd
, IDC_BCE
);
2028 if (HIWORD(wParam
) == BN_CLICKED
||
2029 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2030 cfg
.win_name_always
=
2031 IsDlgButtonChecked(hwnd
, IDC_WINNAME
);
2034 if (HIWORD(wParam
) == BN_CLICKED
||
2035 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2037 IsDlgButtonChecked(hwnd
, IDC_HIDEMOUSE
);
2039 case IDC_SUNKENEDGE
:
2040 if (HIWORD(wParam
) == BN_CLICKED
||
2041 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2043 IsDlgButtonChecked(hwnd
, IDC_SUNKENEDGE
);
2046 if (HIWORD(wParam
) == BN_CLICKED
||
2047 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2048 cfg
.cursor_type
= 0;
2051 if (HIWORD(wParam
) == BN_CLICKED
||
2052 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2053 cfg
.cursor_type
= 1;
2056 if (HIWORD(wParam
) == BN_CLICKED
||
2057 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2058 cfg
.cursor_type
= 2;
2061 if (HIWORD(wParam
) == BN_CLICKED
||
2062 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2064 IsDlgButtonChecked(hwnd
, IDC_BLINKCUR
);
2067 if (HIWORD(wParam
) == BN_CLICKED
||
2068 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2070 IsDlgButtonChecked(hwnd
, IDC_SCROLLBAR
);
2073 if (HIWORD(wParam
) == BN_CLICKED
||
2074 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2076 IsDlgButtonChecked(hwnd
, IDC_LOCKSIZE
);
2079 if (HIWORD(wParam
) == EN_CHANGE
)
2080 GetDlgItemText(hwnd
, IDC_WINEDIT
, cfg
.wintitle
,
2081 sizeof(cfg
.wintitle
) - 1);
2086 if (HIWORD(wParam
) == BN_CLICKED
||
2087 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2089 IsDlgButtonChecked(hwnd
,
2090 IDC_COEALWAYS
) ? COE_ALWAYS
:
2091 IsDlgButtonChecked(hwnd
,
2092 IDC_COENEVER
) ? COE_NEVER
:
2097 if (HIWORD(wParam
) == BN_CLICKED
||
2098 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2100 IsDlgButtonChecked(hwnd
, IDC_CLOSEWARN
);
2103 if (HIWORD(wParam
) == EN_CHANGE
)
2104 GetDlgItemText(hwnd
, IDC_TTEDIT
, cfg
.termtype
,
2105 sizeof(cfg
.termtype
) - 1);
2108 if (HIWORD(wParam
) == EN_CHANGE
)
2109 GetDlgItemText(hwnd
, IDC_LGFEDIT
, cfg
.logfilename
,
2110 sizeof(cfg
.logfilename
) - 1);
2113 memset(&of
, 0, sizeof(of
));
2114 #ifdef OPENFILENAME_SIZE_VERSION_400
2115 of
.lStructSize
= OPENFILENAME_SIZE_VERSION_400
;
2117 of
.lStructSize
= sizeof(of
);
2119 of
.hwndOwner
= hwnd
;
2120 of
.lpstrFilter
= "All Files\0*\0\0\0";
2121 of
.lpstrCustomFilter
= NULL
;
2122 of
.nFilterIndex
= 1;
2123 of
.lpstrFile
= filename
;
2124 strcpy(filename
, cfg
.logfilename
);
2125 of
.nMaxFile
= sizeof(filename
);
2126 of
.lpstrFileTitle
= NULL
;
2127 of
.lpstrInitialDir
= NULL
;
2128 of
.lpstrTitle
= "Select session log file";
2130 if (GetSaveFileName(&of
)) {
2131 strcpy(cfg
.logfilename
, filename
);
2132 SetDlgItemText(hwnd
, IDC_LGFEDIT
, cfg
.logfilename
);
2136 case IDC_LSTATASCII
:
2138 if (HIWORD(wParam
) == BN_CLICKED
||
2139 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2140 if (IsDlgButtonChecked(hwnd
, IDC_LSTATOFF
))
2142 if (IsDlgButtonChecked(hwnd
, IDC_LSTATASCII
))
2144 if (IsDlgButtonChecked(hwnd
, IDC_LSTATRAW
))
2151 if (HIWORD(wParam
) == BN_CLICKED
||
2152 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2153 if (IsDlgButtonChecked(hwnd
, IDC_LSTATXASK
))
2154 cfg
.logxfovr
= LGXF_ASK
;
2155 if (IsDlgButtonChecked(hwnd
, IDC_LSTATXAPN
))
2156 cfg
.logxfovr
= LGXF_APN
;
2157 if (IsDlgButtonChecked(hwnd
, IDC_LSTATXOVR
))
2158 cfg
.logxfovr
= LGXF_OVR
;
2163 if (HIWORD(wParam
) == EN_CHANGE
)
2164 GetDlgItemText(hwnd
, LOWORD(wParam
), cfg
.termspeed
,
2165 sizeof(cfg
.termspeed
) - 1);
2168 if (HIWORD(wParam
) == EN_CHANGE
)
2169 GetDlgItemText(hwnd
, IDC_LOGEDIT
, cfg
.username
,
2170 sizeof(cfg
.username
) - 1);
2172 case IDC_RLLUSEREDIT
:
2173 if (HIWORD(wParam
) == EN_CHANGE
)
2174 GetDlgItemText(hwnd
, IDC_RLLUSEREDIT
,
2176 sizeof(cfg
.localusername
) - 1);
2180 cfg
.rfc_environ
= IsDlgButtonChecked(hwnd
, IDC_EMRFC
);
2184 cfg
.passive_telnet
=
2185 IsDlgButtonChecked(hwnd
, IDC_TPASSIVE
);
2188 if (HIWORD(wParam
) == BN_CLICKED
||
2189 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2190 char str
[sizeof(cfg
.environmt
)];
2192 GetDlgItemText(hwnd
, IDC_VAREDIT
, str
,
2198 p
= str
+ strlen(str
);
2200 GetDlgItemText(hwnd
, IDC_VALEDIT
, p
,
2201 sizeof(str
) - 1 - (p
- str
));
2212 if ((p
- cfg
.environmt
) + strlen(str
) + 2 <
2213 sizeof(cfg
.environmt
)) {
2215 p
[strlen(str
) + 1] = '\0';
2216 SendDlgItemMessage(hwnd
, IDC_ENVLIST
, LB_ADDSTRING
,
2218 SetDlgItemText(hwnd
, IDC_VAREDIT
, "");
2219 SetDlgItemText(hwnd
, IDC_VALEDIT
, "");
2221 MessageBox(hwnd
, "Environment too big",
2222 "PuTTY Error", MB_OK
| MB_ICONERROR
);
2227 if (HIWORD(wParam
) != BN_CLICKED
&&
2228 HIWORD(wParam
) != BN_DOUBLECLICKED
) break;
2230 SendDlgItemMessage(hwnd
, IDC_ENVLIST
, LB_GETCURSEL
, 0,
2237 SendDlgItemMessage(hwnd
, IDC_ENVLIST
, LB_DELETESTRING
,
2264 if (HIWORD(wParam
) == BN_CLICKED
||
2265 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2266 cfg
.nopty
= IsDlgButtonChecked(hwnd
, IDC_NOPTY
);
2269 if (HIWORD(wParam
) == BN_CLICKED
||
2270 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2272 IsDlgButtonChecked(hwnd
, IDC_COMPRESS
);
2275 if (HIWORD(wParam
) == BN_CLICKED
||
2276 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2278 IsDlgButtonChecked(hwnd
, IDC_BUGGYMAC
);
2281 if (HIWORD(wParam
) == BN_CLICKED
||
2282 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2284 IsDlgButtonChecked(hwnd
, IDC_AGENTFWD
);
2286 case IDC_CIPHERLIST
:
2289 handle_prefslist(&cipherlist
,
2290 cfg
.ssh_cipherlist
, CIPHER_MAX
,
2291 0, hwnd
, wParam
, lParam
);
2295 if (HIWORD(wParam
) == BN_CLICKED
||
2296 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2297 if (IsDlgButtonChecked(hwnd
, IDC_SSHPROT1
))
2299 else if (IsDlgButtonChecked(hwnd
, IDC_SSHPROT2
))
2304 if (HIWORD(wParam
) == BN_CLICKED
||
2305 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2307 IsDlgButtonChecked(hwnd
, IDC_AUTHTIS
);
2310 if (HIWORD(wParam
) == EN_CHANGE
)
2311 GetDlgItemText(hwnd
, IDC_PKEDIT
, cfg
.keyfile
,
2312 sizeof(cfg
.keyfile
) - 1);
2315 if (HIWORD(wParam
) == EN_CHANGE
)
2316 GetDlgItemText(hwnd
, IDC_CMDEDIT
, cfg
.remote_cmd
,
2317 sizeof(cfg
.remote_cmd
) - 1);
2320 memset(&of
, 0, sizeof(of
));
2321 #ifdef OPENFILENAME_SIZE_VERSION_400
2322 of
.lStructSize
= OPENFILENAME_SIZE_VERSION_400
;
2324 of
.lStructSize
= sizeof(of
);
2326 of
.hwndOwner
= hwnd
;
2327 of
.lpstrFilter
= "All Files\0*\0\0\0";
2328 of
.lpstrCustomFilter
= NULL
;
2329 of
.nFilterIndex
= 1;
2330 of
.lpstrFile
= filename
;
2331 strcpy(filename
, cfg
.keyfile
);
2332 of
.nMaxFile
= sizeof(filename
);
2333 of
.lpstrFileTitle
= NULL
;
2334 of
.lpstrInitialDir
= NULL
;
2335 of
.lpstrTitle
= "Select Public Key File";
2337 if (GetOpenFileName(&of
)) {
2338 strcpy(cfg
.keyfile
, filename
);
2339 SetDlgItemText(hwnd
, IDC_PKEDIT
, cfg
.keyfile
);
2343 cfg
.rawcnp
= IsDlgButtonChecked(hwnd
, IDC_RAWCNP
);
2346 cfg
.mouse_is_xterm
= IsDlgButtonChecked(hwnd
, IDC_MBXTERM
);
2352 int n
= GetDlgItemInt(hwnd
, IDC_CCEDIT
, &ok
, FALSE
);
2357 for (i
= 0; i
< 128; i
++)
2358 if (SendDlgItemMessage
2359 (hwnd
, IDC_CCLIST
, LB_GETSEL
, i
, 0)) {
2361 cfg
.wordness
[i
] = n
;
2362 SendDlgItemMessage(hwnd
, IDC_CCLIST
,
2363 LB_DELETESTRING
, i
, 0);
2364 sprintf(str
, "%d\t(0x%02X)\t%c\t%d", i
, i
,
2365 (i
>= 0x21 && i
!= 0x7F) ? i
: ' ',
2367 SendDlgItemMessage(hwnd
, IDC_CCLIST
,
2374 case IDC_BOLDCOLOUR
:
2375 if (HIWORD(wParam
) == BN_CLICKED
||
2376 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2379 IsDlgButtonChecked(hwnd
, IDC_BOLDCOLOUR
);
2380 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
, WM_SETREDRAW
,
2383 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
2385 if (n
!= 12 + 10 * cfg
.bold_colour
) {
2386 for (i
= n
; i
-- > 0;)
2387 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
2388 LB_DELETESTRING
, i
, 0);
2389 for (i
= 0; i
< 22; i
++)
2390 if (cfg
.bold_colour
|| permcolour
[i
])
2391 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
2393 (LPARAM
) colours
[i
]);
2395 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
, WM_SETREDRAW
,
2397 InvalidateRect(GetDlgItem(hwnd
, IDC_COLOURLIST
), NULL
,
2402 if (HIWORD(wParam
) == BN_CLICKED
||
2403 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2405 IsDlgButtonChecked(hwnd
, IDC_PALETTE
);
2407 case IDC_COLOURLIST
:
2408 if (HIWORD(wParam
) == LBN_DBLCLK
||
2409 HIWORD(wParam
) == LBN_SELCHANGE
) {
2411 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
2414 if (!cfg
.bold_colour
)
2415 i
= (i
< 3 ? i
* 2 : i
== 3 ?
5 : i
* 2 - 2);
2416 SetDlgItemInt(hwnd
, IDC_RVALUE
, cfg
.colours
[i
][0],
2418 SetDlgItemInt(hwnd
, IDC_GVALUE
, cfg
.colours
[i
][1],
2420 SetDlgItemInt(hwnd
, IDC_BVALUE
, cfg
.colours
[i
][2],
2425 if (HIWORD(wParam
) == BN_CLICKED
||
2426 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2427 static CHOOSECOLOR cc
;
2428 static DWORD custom
[16] = { 0 }; /* zero initialisers */
2430 SendDlgItemMessage(hwnd
, IDC_COLOURLIST
,
2433 if (!cfg
.bold_colour
)
2434 i
= (i
< 3 ? i
* 2 : i
== 3 ?
5 : i
* 2 - 2);
2435 cc
.lStructSize
= sizeof(cc
);
2436 cc
.hwndOwner
= hwnd
;
2437 cc
.hInstance
= (HWND
) hinst
;
2438 cc
.lpCustColors
= custom
;
2440 RGB(cfg
.colours
[i
][0], cfg
.colours
[i
][1],
2442 cc
.Flags
= CC_FULLOPEN
| CC_RGBINIT
;
2443 if (ChooseColor(&cc
)) {
2445 (unsigned char) (cc
.rgbResult
& 0xFF);
2447 (unsigned char) (cc
.rgbResult
>> 8) & 0xFF;
2449 (unsigned char) (cc
.rgbResult
>> 16) & 0xFF;
2450 SetDlgItemInt(hwnd
, IDC_RVALUE
, cfg
.colours
[i
][0],
2452 SetDlgItemInt(hwnd
, IDC_GVALUE
, cfg
.colours
[i
][1],
2454 SetDlgItemInt(hwnd
, IDC_BVALUE
, cfg
.colours
[i
][2],
2460 if (HIWORD(wParam
) == CBN_SELCHANGE
) {
2461 int index
= SendDlgItemMessage(hwnd
, IDC_CODEPAGE
,
2462 CB_GETCURSEL
, 0, 0);
2463 SendDlgItemMessage(hwnd
, IDC_CODEPAGE
, CB_GETLBTEXT
,
2464 index
, (LPARAM
)cfg
.line_codepage
);
2467 case IDC_VTXWINDOWS
:
2473 (IsDlgButtonChecked(hwnd
, IDC_VTXWINDOWS
) ? VT_XWINDOWS
2474 : IsDlgButtonChecked(hwnd
,
2475 IDC_VTOEMANSI
) ? VT_OEMANSI
:
2476 IsDlgButtonChecked(hwnd
,
2477 IDC_VTOEMONLY
) ? VT_OEMONLY
:
2478 IsDlgButtonChecked(hwnd
,
2479 IDC_VTUNICODE
) ? VT_UNICODE
:
2482 case IDC_X11_FORWARD
:
2483 if (HIWORD(wParam
) == BN_CLICKED
||
2484 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2486 IsDlgButtonChecked(hwnd
, IDC_X11_FORWARD
);
2489 if (HIWORD(wParam
) == BN_CLICKED
||
2490 HIWORD(wParam
) == BN_DOUBLECLICKED
)
2491 cfg
.lport_acceptall
=
2492 IsDlgButtonChecked(hwnd
, IDC_LPORT_ALL
);
2494 case IDC_X11_DISPLAY
:
2495 if (HIWORD(wParam
) == EN_CHANGE
)
2496 GetDlgItemText(hwnd
, IDC_X11_DISPLAY
, cfg
.x11_display
,
2497 sizeof(cfg
.x11_display
) - 1);
2500 if (HIWORD(wParam
) == BN_CLICKED
||
2501 HIWORD(wParam
) == BN_DOUBLECLICKED
) {
2502 char str
[sizeof(cfg
.portfwd
)];
2504 if (IsDlgButtonChecked(hwnd
, IDC_PFWDLOCAL
))
2508 GetDlgItemText(hwnd
, IDC_SPORTEDIT
, str
+1,
2512 "You need to specify a source port number",
2513 "PuTTY Error", MB_OK
| MB_ICONERROR
);
2516 p
= str
+ strlen(str
);
2518 GetDlgItemText(hwnd
, IDC_DPORTEDIT
, p
,
2519 sizeof(str
) - 1 - (p
- str
));
2520 if (!*p
|| !strchr(p
, ':')) {
2522 "You need to specify a destination address\n"
2523 "in the form \"host.name:port\"",
2524 "PuTTY Error", MB_OK
| MB_ICONERROR
);
2533 if ((p
- cfg
.portfwd
) + strlen(str
) + 2 <
2534 sizeof(cfg
.portfwd
)) {
2536 p
[strlen(str
) + 1] = '\0';
2537 SendDlgItemMessage(hwnd
, IDC_PFWDLIST
, LB_ADDSTRING
,
2539 SetDlgItemText(hwnd
, IDC_SPORTEDIT
, "");
2540 SetDlgItemText(hwnd
, IDC_DPORTEDIT
, "");
2542 MessageBox(hwnd
, "Too many forwardings",
2543 "PuTTY Error", MB_OK
| MB_ICONERROR
);
2547 case IDC_PFWDREMOVE
:
2548 if (HIWORD(wParam
) != BN_CLICKED
&&
2549 HIWORD(wParam
) != BN_DOUBLECLICKED
) break;
2550 i
= SendDlgItemMessage(hwnd
, IDC_PFWDLIST
,
2551 LB_GETCURSEL
, 0, 0);
2557 SendDlgItemMessage(hwnd
, IDC_PFWDLIST
, LB_DELETESTRING
,
2589 /* Grrr Explorer will maximize Dialogs! */
2591 if (wParam
== SIZE_MAXIMIZED
)
2597 * Handle application-defined messages eg. DragListBox
2599 /* First find out what the number is (once). */
2600 if (draglistmsg
== WM_NULL
)
2601 draglistmsg
= RegisterWindowMessage (DRAGLISTMSGSTRING
);
2603 if (msg
== draglistmsg
) {
2604 /* Only process once dialog is fully formed. */
2605 if (GetWindowLong(hwnd
, GWL_USERDATA
) == 1) switch (LOWORD(wParam
)) {
2606 case IDC_CIPHERLIST
:
2607 return handle_prefslist(&cipherlist
,
2608 cfg
.ssh_cipherlist
, CIPHER_MAX
,
2609 1, hwnd
, wParam
, lParam
);
2618 static int CALLBACK
MainDlgProc(HWND hwnd
, UINT msg
,
2619 WPARAM wParam
, LPARAM lParam
)
2621 if (msg
== WM_COMMAND
&& LOWORD(wParam
) == IDOK
) {
2623 if (msg
== WM_COMMAND
&& LOWORD(wParam
) == IDCX_ABOUT
) {
2624 EnableWindow(hwnd
, 0);
2625 DialogBox(hinst
, MAKEINTRESOURCE(IDD_ABOUTBOX
), hwnd
, AboutProc
);
2626 EnableWindow(hwnd
, 1);
2627 SetActiveWindow(hwnd
);
2629 return GenericMainDlgProc(hwnd
, msg
, wParam
, lParam
, 0);
2632 static int CALLBACK
ReconfDlgProc(HWND hwnd
, UINT msg
,
2633 WPARAM wParam
, LPARAM lParam
)
2635 return GenericMainDlgProc(hwnd
, msg
, wParam
, lParam
, 1);
2638 void defuse_showwindow(void)
2641 * Work around the fact that the app's first call to ShowWindow
2642 * will ignore the default in favour of the shell-provided
2647 hwnd
= CreateDialog(hinst
, MAKEINTRESOURCE(IDD_ABOUTBOX
),
2649 ShowWindow(hwnd
, SW_HIDE
);
2650 SetActiveWindow(hwnd
);
2651 DestroyWindow(hwnd
);
2660 savedsession
[0] = '\0';
2662 DialogBox(hinst
, MAKEINTRESOURCE(IDD_MAINBOX
), NULL
, MainDlgProc
);
2663 get_sesslist(FALSE
);
2668 int do_reconfig(HWND hwnd
)
2673 backup_cfg
= cfg
; /* structure copy */
2675 DialogBox(hinst
, MAKEINTRESOURCE(IDD_RECONF
), hwnd
, ReconfDlgProc
);
2677 cfg
= backup_cfg
; /* structure copy */
2682 void logevent(char *string
)
2687 if (nevents
>= negsize
) {
2689 events
= srealloc(events
, negsize
* sizeof(*events
));
2693 strftime(timebuf
, sizeof(timebuf
), "%Y-%m-%d %H:%M:%S\t",
2696 events
[nevents
] = smalloc(strlen(timebuf
) + strlen(string
) + 1);
2697 strcpy(events
[nevents
], timebuf
);
2698 strcat(events
[nevents
], string
);
2701 SendDlgItemMessage(logbox
, IDN_LIST
, LB_ADDSTRING
,
2702 0, (LPARAM
) events
[nevents
]);
2703 count
= SendDlgItemMessage(logbox
, IDN_LIST
, LB_GETCOUNT
, 0, 0);
2704 SendDlgItemMessage(logbox
, IDN_LIST
, LB_SETTOPINDEX
, count
- 1, 0);
2709 void showeventlog(HWND hwnd
)
2712 logbox
= CreateDialog(hinst
, MAKEINTRESOURCE(IDD_LOGBOX
),
2714 ShowWindow(logbox
, SW_SHOWNORMAL
);
2716 SetActiveWindow(logbox
);
2719 void showabout(HWND hwnd
)
2721 DialogBox(hinst
, MAKEINTRESOURCE(IDD_ABOUTBOX
), hwnd
, AboutProc
);
2724 void verify_ssh_host_key(char *host
, int port
, char *keytype
,
2725 char *keystr
, char *fingerprint
)
2729 static const char absentmsg
[] =
2730 "The server's host key is not cached in the registry. You\n"
2731 "have no guarantee that the server is the computer you\n"
2733 "The server's key fingerprint is:\n"
2735 "If you trust this host, hit Yes to add the key to\n"
2736 "PuTTY's cache and carry on connecting.\n"
2737 "If you want to carry on connecting just once, without\n"
2738 "adding the key to the cache, hit No.\n"
2739 "If you do not trust this host, hit Cancel to abandon the\n"
2742 static const char wrongmsg
[] =
2743 "WARNING - POTENTIAL SECURITY BREACH!\n"
2745 "The server's host key does not match the one PuTTY has\n"
2746 "cached in the registry. This means that either the\n"
2747 "server administrator has changed the host key, or you\n"
2748 "have actually connected to another computer pretending\n"
2749 "to be the server.\n"
2750 "The new key fingerprint is:\n"
2752 "If you were expecting this change and trust the new key,\n"
2753 "hit Yes to update PuTTY's cache and continue connecting.\n"
2754 "If you want to carry on connecting but without updating\n"
2755 "the cache, hit No.\n"
2756 "If you want to abandon the connection completely, hit\n"
2757 "Cancel. Hitting Cancel is the ONLY guaranteed safe\n" "choice.\n";
2759 static const char mbtitle
[] = "PuTTY Security Alert";
2762 /* sensible fingerprint max size */
2763 (sizeof(absentmsg
) > sizeof(wrongmsg
) ?
2764 sizeof(absentmsg
) : sizeof(wrongmsg
))];
2767 * Verify the key against the registry.
2769 ret
= verify_host_key(host
, port
, keytype
, keystr
);
2771 if (ret
== 0) /* success - key matched OK */
2773 if (ret
== 2) { /* key was different */
2775 sprintf(message
, wrongmsg
, fingerprint
);
2776 mbret
= MessageBox(NULL
, message
, mbtitle
,
2777 MB_ICONWARNING
| MB_YESNOCANCEL
);
2779 store_host_key(host
, port
, keytype
, keystr
);
2780 if (mbret
== IDCANCEL
)
2783 if (ret
== 1) { /* key was absent */
2785 sprintf(message
, absentmsg
, fingerprint
);
2786 mbret
= MessageBox(NULL
, message
, mbtitle
,
2787 MB_ICONWARNING
| MB_YESNOCANCEL
);
2789 store_host_key(host
, port
, keytype
, keystr
);
2790 if (mbret
== IDCANCEL
)
2796 * Ask whether the selected cipher is acceptable (since it was
2797 * below the configured 'warn' threshold).
2798 * cs: 0 = both ways, 1 = client->server, 2 = server->client
2800 void askcipher(char *ciphername
, int cs
)
2802 static const char mbtitle
[] = "PuTTY Security Alert";
2803 static const char msg
[] =
2804 "The first %.35scipher supported by the server\n"
2805 "is %.64s, which is below the configured\n"
2806 "warning threshold.\n"
2807 "Do you want to continue with this connection?\n";
2808 /* guessed cipher name + type max length */
2809 char message
[100 + sizeof(msg
)];
2812 sprintf(message
, msg
,
2814 (cs
== 1) ?
"client-to-server " :
2815 "server-to-client ",
2817 mbret
= MessageBox(NULL
, message
, mbtitle
,
2818 MB_ICONWARNING
| MB_YESNO
);
2826 * Ask whether to wipe a session log file before writing to it.
2827 * Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
2829 int askappend(char *filename
)
2831 static const char mbtitle
[] = "PuTTY Log to File";
2832 static const char msgtemplate
[] =
2833 "The session log file \"%.*s\" already exists.\n"
2834 "You can overwrite it with a new session log,\n"
2835 "append your session log to the end of it,\n"
2836 "or disable session logging for this session.\n"
2837 "Hit Yes to wipe the file, No to append to it,\n"
2838 "or Cancel to disable logging.";
2839 char message
[sizeof(msgtemplate
) + FILENAME_MAX
];
2841 if (cfg
.logxfovr
!= LGXF_ASK
) {
2842 return ((cfg
.logxfovr
== LGXF_OVR
) ?
2 : 1);
2844 sprintf(message
, msgtemplate
, FILENAME_MAX
, filename
);
2846 mbret
= MessageBox(NULL
, message
, mbtitle
,
2847 MB_ICONQUESTION
| MB_YESNOCANCEL
);
2850 else if (mbret
== IDNO
)