+ if (panel == loggingpanelstart) {
+ /* The Logging panel. Accelerators used: [acgoh] tplsfwe */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling session logging",
+ IDC_TITLE_LOGGING);
+ beginbox(&cp, NULL, IDC_BOX_LOGGING1);
+ radiobig(&cp,
+ "Session logging:", IDC_LSTATSTATIC,
+ "Logging &turned off completely", IDC_LSTATOFF,
+ "Log &printable output only", IDC_LSTATASCII,
+ "&Log all session output", IDC_LSTATRAW,
+ "Log &SSH packet data", IDC_LSTATPACKET,
+ NULL);
+ editbutton(&cp, "Log &file name:",
+ IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...",
+ IDC_LGFBUTTON);
+ statictext(&cp, "(Log file name can contain &&Y, &&M, &&D for date,"
+ " &&T for time, and &&H for host name)", 2, IDC_LGFEXPLAIN);
+ radiobig(&cp,
+ "What to do if the log file already &exists:",
+ IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR,
+ "Always append to the end of it", IDC_LSTATXAPN,
+ "Ask the user every time", IDC_LSTATXASK, NULL);
+ endbox(&cp);
+ }
+
+ if (panel == terminalpanelstart) {
+ /* The Terminal panel. Accelerators used: [acgoh] wdren lts p */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling the terminal emulation",
+ IDC_TITLE_TERMINAL);
+ beginbox(&cp, "Set various terminal options", IDC_BOX_TERMINAL1);
+ checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE);
+ checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM);
+ checkbox(&cp, "Implicit C&R in every LF", IDC_LFHASCR);
+ checkbox(&cp, "Use background colour to &erase screen", IDC_BCE);
+ checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT);
+ multiedit(&cp,
+ "An&swerback to ^E:", IDC_ANSWERBACK,
+ IDC_ANSWEREDIT, 100, NULL);
+ endbox(&cp);
+
+ beginbox(&cp, "Line discipline options", IDC_BOX_TERMINAL2);
+ radioline(&cp, "&Local echo:", IDC_ECHOSTATIC, 3,
+ "Auto", IDC_ECHOBACKEND,
+ "Force on", IDC_ECHOYES, "Force off", IDC_ECHONO, NULL);
+ radioline(&cp, "Local line edi&ting:", IDC_EDITSTATIC, 3,
+ "Auto", IDC_EDITBACKEND,
+ "Force on", IDC_EDITYES, "Force off", IDC_EDITNO, NULL);
+ endbox(&cp);
+
+ beginbox(&cp, "Remote-controlled printing", IDC_BOX_TERMINAL3);
+ combobox(&cp, "&Printer to send ANSI printer output to:",
+ IDC_PRINTERSTATIC, IDC_PRINTER);
+ endbox(&cp);
+ }
+
+ if (panel == featurespanelstart) {
+ /* The Features panel. Accelerators used: [acgoh] ukswtbrx */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Enabling and disabling advanced terminal features ",
+ IDC_TITLE_FEATURES);
+ beginbox(&cp, NULL, IDC_BOX_FEATURES1);
+ checkbox(&cp, "Disable application c&ursor keys mode", IDC_NOAPPLICC);
+ checkbox(&cp, "Disable application &keypad mode", IDC_NOAPPLICK);
+ checkbox(&cp, "Disable &xterm-style mouse reporting", IDC_NOMOUSEREP);
+ checkbox(&cp, "Disable remote-controlled terminal re&sizing",
+ IDC_NORESIZE);
+ checkbox(&cp, "Disable s&witching to alternate terminal screen",
+ IDC_NOALTSCREEN);
+ checkbox(&cp, "Disable remote-controlled window &title changing",
+ IDC_NOWINTITLE);
+ checkbox(&cp, "Disable destructive &backspace on server sending ^?",
+ IDC_NODBACKSPACE);
+ checkbox(&cp, "Disable remote-controlled cha&racter set configuration",
+ IDC_NOCHARSET);
+ endbox(&cp);
+ }
+
+ if (panel == bellpanelstart) {
+ /* The Bell panel. Accelerators used: [acgoh] bdsm wit */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling the terminal bell",
+ IDC_TITLE_BELL);
+ beginbox(&cp, "Set the style of bell", IDC_BOX_BELL1);
+ radiobig(&cp,
+ "Action to happen when a &bell occurs:", IDC_BELLSTATIC,
+ "None (bell disabled)", IDC_BELL_DISABLED,
+ "Play Windows Default Sound", IDC_BELL_DEFAULT,
+ "Play a custom sound file", IDC_BELL_WAVEFILE,
+ "Visual bell (flash window)", IDC_BELL_VISUAL, NULL);
+ editbutton(&cp, "Custom sound file to play as a bell:",
+ IDC_BELL_WAVESTATIC, IDC_BELL_WAVEEDIT,
+ "Bro&wse...", IDC_BELL_WAVEBROWSE);
+ radioline(&cp, "Taskbar/caption &indication on bell:",
+ IDC_B_IND_STATIC, 3, "Disabled", IDC_B_IND_DISABLED,
+ "Flashing", IDC_B_IND_FLASH, "Steady", IDC_B_IND_STEADY,
+ NULL);
+ endbox(&cp);
+ beginbox(&cp, "Control the bell overload behaviour",
+ IDC_BOX_BELL2);
+ checkbox(&cp, "Bell is temporarily &disabled when over-used",
+ IDC_BELLOVL);
+ staticedit(&cp, "Over-use means this &many bells...",
+ IDC_BELLOVLNSTATIC, IDC_BELLOVLN, 20);
+ staticedit(&cp, "... in &this many seconds",
+ IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20);
+ statictext(&cp,
+ "The bell is re-enabled after a few seconds of silence.",
+ 1, IDC_BELLOVLEXPLAIN);
+ staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC,
+ IDC_BELLOVLS, 20);
+ endbox(&cp);
+ }
+
+ if (panel == keyboardpanelstart) {
+ /* The Keyboard panel. Accelerators used: [acgoh] bef rntd */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling the effects of keys",
+ IDC_TITLE_KEYBOARD);
+ beginbox(&cp, "Change the sequences sent by:", IDC_BOX_KEYBOARD1);
+ radioline(&cp, "The &Backspace key", IDC_DELSTATIC, 2,
+ "Control-H", IDC_DEL008,
+ "Control-? (127)", IDC_DEL127, NULL);
+ radioline(&cp, "The Home and &End keys", IDC_HOMESTATIC, 2,
+ "Standard", IDC_HOMETILDE, "rxvt", IDC_HOMERXVT, NULL);
+ radioline(&cp, "The &Function keys and keypad", IDC_FUNCSTATIC, 3,
+ "ESC[n~", IDC_FUNCTILDE,
+ "Linux", IDC_FUNCLINUX,
+ "Xterm R6", IDC_FUNCXTERM,
+ "VT400", IDC_FUNCVT400,
+ "VT100+", IDC_FUNCVT100P, "SCO", IDC_FUNCSCO, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Application keypad settings:", IDC_BOX_KEYBOARD2);
+ radioline(&cp, "Initial state of cu&rsor keys:", IDC_CURSTATIC, 2,
+ "Normal", IDC_CURNORMAL,
+ "Application", IDC_CURAPPLIC, NULL);
+ radioline(&cp, "Initial state of &numeric keypad:", IDC_KPSTATIC,
+ 3, "Normal", IDC_KPNORMAL, "Application", IDC_KPAPPLIC,
+ "NetHack", IDC_KPNH, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Enable extra keyboard features:",
+ IDC_BOX_KEYBOARD3);
+ checkbox(&cp, "AltGr ac&ts as Compose key", IDC_COMPOSEKEY);
+ checkbox(&cp, "Control-Alt is &different from AltGr",
+ IDC_CTRLALTKEYS);
+ endbox(&cp);
+ }
+
+ if (panel == windowpanelstart) {
+ /* The Window panel. Accelerators used: [acgoh] rmz sdikp */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling PuTTY's window",
+ IDC_TITLE_WINDOW);
+ beginbox(&cp, "Set the size of the window", IDC_BOX_WINDOW1);
+ multiedit(&cp,
+ "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50,
+ "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, NULL);
+ radiobig(&cp, "When window is resi&zed:", IDC_RESIZESTATIC,
+ "Change the number of rows and columns", IDC_RESIZETERM,
+ "Change the size of the font", IDC_RESIZEFONT,
+ "Change font size only when maximised", IDC_RESIZEEITHER,
+ "Forbid resizing completely", IDC_RESIZENONE, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Control the scrollback in the window",
+ IDC_BOX_WINDOW2);
+ staticedit(&cp, "Lines of &scrollback",
+ IDC_SAVESTATIC, IDC_SAVEEDIT, 50);
+ checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR);
+ checkbox(&cp, "D&isplay scrollbar in full screen mode", IDC_SCROLLBARFULLSCREEN);
+ checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY);
+ checkbox(&cp, "Reset scrollback on dis&play activity",
+ IDC_SCROLLDISP);
+ endbox(&cp);
+ }
+
+ if (panel == appearancepanelstart) {
+ /* The Appearance panel. Accelerators used: [acgoh] luvb n ti p s */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Configure the appearance of PuTTY's window",
+ IDC_TITLE_APPEARANCE);
+ beginbox(&cp, "Adjust the use of the cursor", IDC_BOX_APPEARANCE1);
+ radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3,
+ "B&lock", IDC_CURBLOCK,
+ "&Underline", IDC_CURUNDER,
+ "&Vertical line", IDC_CURVERT, NULL);
+ checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR);
+ endbox(&cp);
+ beginbox(&cp, "Set the font used in the terminal window",
+ IDC_BOX_APPEARANCE2);
+ staticbtn(&cp, "", IDC_FONTSTATIC, "Cha&nge...", IDC_CHOOSEFONT);
+ endbox(&cp);
+ beginbox(&cp, "Adjust the use of the window title",
+ IDC_BOX_APPEARANCE3);
+ multiedit(&cp,
+ "Window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, NULL);
+ checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME);
+ endbox(&cp);
+ beginbox(&cp, "Adjust the use of the mouse pointer",
+ IDC_BOX_APPEARANCE4);
+ checkbox(&cp, "Hide mouse &pointer when typing in window",
+ IDC_HIDEMOUSE);
+ endbox(&cp);
+ beginbox(&cp, "Adjust the window border", IDC_BOX_APPEARANCE5);
+ checkbox(&cp, "&Sunken-edge border (slightly thicker)",
+ IDC_SUNKENEDGE);
+ staticedit(&cp, "Gap between text and window edge",
+ IDC_WINBSTATIC, IDC_WINBEDIT, 20);
+ endbox(&cp);
+ }
+
+ if (panel == behaviourpanelstart) {
+ /* The Behaviour panel. Accelerators used: [acgoh] w4yltf */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Configure the behaviour of PuTTY's window",
+ IDC_TITLE_WINDOW);
+ beginbox(&cp, NULL, IDC_BOX_BEHAVIOUR1);
+ checkbox(&cp, "&Warn before closing window", IDC_CLOSEWARN);
+ checkbox(&cp, "Window closes on ALT-F&4", IDC_ALTF4);
+ checkbox(&cp, "S&ystem menu appears on ALT-Space", IDC_ALTSPACE);
+ checkbox(&cp, "System menu appears on A< alone", IDC_ALTONLY);
+ checkbox(&cp, "Ensure window is always on &top", IDC_ALWAYSONTOP);
+ checkbox(&cp, "&Full screen on Alt-Enter", IDC_FULLSCREENONALTENTER);
+ endbox(&cp);
+ }
+
+ if (panel == translationpanelstart) {
+ /* The Translation panel. Accelerators used: [acgoh] rxbepus */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling character set translation",
+ IDC_TITLE_TRANSLATION);
+ beginbox(&cp, "Character set translation on received data",
+ IDC_BOX_TRANSLATION1);
+ combobox(&cp, "&Received data assumed to be in which character set:",
+ IDC_CODEPAGESTATIC, IDC_CODEPAGE);
+ endbox(&cp);
+ beginbox(&cp, "Enable character set translation on input data",
+ IDC_BOX_TRANSLATION2);
+ checkbox(&cp, "Cap&s Lock acts as Cyrillic switch",
+ IDC_CAPSLOCKCYR);
+ endbox(&cp);
+ beginbox(&cp, "Adjust how PuTTY displays line drawing characters",
+ IDC_BOX_TRANSLATION3);
+ radiobig(&cp,
+ "Handling of line drawing characters:", IDC_VTSTATIC,
+ "Font has &XWindows encoding", IDC_VTXWINDOWS,
+ "Use font in &both ANSI and OEM modes", IDC_VTOEMANSI,
+ "Use font in O&EM mode only", IDC_VTOEMONLY,
+ "&Poor man's line drawing (" "+" ", " "-" " and " "|" ")",
+ IDC_VTPOORMAN, "&Unicode mode", IDC_VTUNICODE, NULL);
+ endbox(&cp);
+ }
+
+ if (panel == selectionpanelstart) {
+ /* The Selection panel. Accelerators used: [acgoh] df wxp est nr */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling copy and paste",
+ IDC_TITLE_SELECTION);
+ beginbox(&cp, "Translation of pasted characters",
+ IDC_BOX_SELECTION1);
+ checkbox(&cp,
+ "&Don't translate line drawing chars into +, - and |",
+ IDC_RAWCNP);
+ checkbox(&cp,
+ "Paste to clipboard in RT&F as well as plain text",
+ IDC_RTFPASTE);
+ endbox(&cp);
+ beginbox(&cp, "Control which mouse button does which thing",
+ IDC_BOX_SELECTION2);
+ radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC,
+ "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS,
+ "&xterm (Right extends, Middle pastes)", IDC_MBXTERM,
+ NULL);
+ checkbox(&cp,
+ "Shift overrides a&pplication's use of mouse",
+ IDC_MOUSEOVERRIDE);
+ radioline(&cp,
+ "Default selection mode (Alt+drag does the other one):",
+ IDC_SELTYPESTATIC, 2,
+ "&Normal", IDC_SELTYPELEX,
+ "&Rectangular block", IDC_SELTYPERECT, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Control the select-one-word-at-a-time mode",
+ IDC_BOX_SELECTION3);
+ charclass(&cp, "Charact&er classes:", IDC_CCSTATIC, IDC_CCLIST,
+ "&Set", IDC_CCSET, IDC_CCEDIT,
+ "&to class", IDC_CCSTATIC2);
+ endbox(&cp);
+ }
+
+ if (panel == colourspanelstart) {
+ /* The Colours panel. Accelerators used: [acgoh] blum */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling use of colours",
+ IDC_TITLE_COLOURS);
+ beginbox(&cp, "General options for colour usage",
+ IDC_BOX_COLOURS1);
+ checkbox(&cp, "&Bolded text is a different colour",
+ IDC_BOLDCOLOUR);
+ checkbox(&cp, "Attempt to use &logical palettes", IDC_PALETTE);
+ endbox(&cp);
+ beginbox(&cp, "Adjust the precise colours PuTTY displays",
+ IDC_BOX_COLOURS2);
+ colouredit(&cp, "Select a colo&ur and then click to modify it:",
+ IDC_COLOURSTATIC, IDC_COLOURLIST,
+ "&Modify...", IDC_CHANGE,
+ "Red:", IDC_RSTATIC, IDC_RVALUE,
+ "Green:", IDC_GSTATIC, IDC_GVALUE,
+ "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL);
+ endbox(&cp);
+ }
+
+ if (panel == connectionpanelstart) {
+ /* The Connection panel. Accelerators used: [acgoh] tukn */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ bartitle(&cp, "Options controlling the connection",
+ IDC_TITLE_CONNECTION);
+ if (dlgtype == 0) {
+ beginbox(&cp, "Data to send to the server",
+ IDC_BOX_CONNECTION1);
+ staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC,
+ IDC_TTEDIT, 50);
+ staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC,
+ IDC_LOGEDIT, 50);
+ endbox(&cp);
+ } else {
+ beginbox(&cp, "Adjust telnet session.", IDC_BOX_CONNECTION1);
+ checkbox(&cp, "Keyboard sends telnet Backspace and Interrupt",
+ IDC_TELNETKEY);
+ checkbox(&cp, "Return key sends telnet New Line instead of ^M",
+ IDC_TELNETRET);
+ endbox(&cp);
+ }
+ beginbox(&cp, "Sending of null packets to keep session active",
+ IDC_BOX_CONNECTION2);
+ staticedit(&cp, "Seconds between &keepalives (0 to turn off)",
+ IDC_PINGSTATIC, IDC_PINGEDIT, 20);
+ endbox(&cp);
+ if (dlgtype == 0) {
+ beginbox(&cp, "Low-level TCP connection options",
+ IDC_BOX_CONNECTION3);
+ checkbox(&cp, "Disable &Nagle's algorithm (TCP_NODELAY option)",
+ IDC_NODELAY);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == proxypanelstart) {
+ /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmvxd */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling proxy usage",
+ IDC_TITLE_PROXY);
+ beginbox(&cp, "Proxy basics", IDC_BOX_PROXY1);
+ radioline(&cp, "Proxy type:", IDC_PROXYTYPESTATIC, 4,
+ "&None", IDC_PROXYTYPENONE,
+ "H&TTP", IDC_PROXYTYPEHTTP,
+ "&SOCKS", IDC_PROXYTYPESOCKS,
+ "Te&lnet", IDC_PROXYTYPETELNET, NULL);
+ multiedit(&cp,
+ "Prox&y Host", IDC_PROXYHOSTSTATIC, IDC_PROXYHOSTEDIT, 80,
+ "&Port", IDC_PROXYPORTSTATIC, IDC_PROXYPORTEDIT, 20, NULL);
+ multiedit(&cp,
+ "&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC,
+ IDC_PROXYEXCLUDEEDIT, 100, NULL);
+ checkbox(&cp, "Consider pro&xying local host connections",
+ IDC_PROXYLOCALHOST);
+ radioline(&cp, "Do &DNS name lookup at proxy end:",
+ IDC_PROXYDNSSTATIC, 3,
+ "No", IDC_PROXYDNSNO,
+ "Auto", IDC_PROXYDNSAUTO,
+ "Yes", IDC_PROXYDNSYES, NULL);
+ staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC,
+ IDC_PROXYUSEREDIT, 60);
+ staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
+ IDC_PROXYPASSEDIT, 60);
+ endbox(&cp);
+ beginbox(&cp, "Misc. proxy settings", IDC_BOX_PROXY2);
+ multiedit(&cp,
+ "Telnet co&mmand", IDC_PROXYTELNETCMDSTATIC,
+ IDC_PROXYTELNETCMDEDIT, 100, NULL);
+ radioline(&cp, "SOCKS &Version", IDC_PROXYSOCKSVERSTATIC,
+ 2, "Version 5", IDC_PROXYSOCKSVER5, "Version 4",
+ IDC_PROXYSOCKSVER4, NULL);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == telnetpanelstart) {
+ /* The Telnet panel. Accelerators used: [acgoh] svldr bftk */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling Telnet connections",
+ IDC_TITLE_TELNET);
+ beginbox(&cp, "Data to send to the server", IDC_BOX_TELNET1);
+ staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC,
+ IDC_TSEDIT, 50);
+ envsetter(&cp, "Environment variables:", IDC_ENVSTATIC,
+ "&Variable", IDC_VARSTATIC, IDC_VAREDIT, "Va&lue",
+ IDC_VALSTATIC, IDC_VALEDIT, IDC_ENVLIST, "A&dd",
+ IDC_ENVADD, "&Remove", IDC_ENVREMOVE);
+ endbox(&cp);
+ beginbox(&cp, "Telnet protocol adjustments", IDC_BOX_TELNET2);
+ radioline(&cp, "Handling of OLD_ENVIRON ambiguity:",
+ IDC_EMSTATIC, 2, "&BSD (commonplace)", IDC_EMBSD,
+ "R&FC 1408 (unusual)", IDC_EMRFC, NULL);
+ radioline(&cp, "&Telnet negotiation mode:", IDC_ACTSTATIC, 2,
+ "Passive", IDC_TPASSIVE, "Active",
+ IDC_TACTIVE, NULL);
+ checkbox(&cp, "&Keyboard sends telnet Backspace and Interrupt",
+ IDC_TELNETKEY);
+ checkbox(&cp, "Return key sends telnet New Line instead of ^M",
+ IDC_TELNETRET);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == rloginpanelstart) {
+ /* The Rlogin panel. Accelerators used: [acgoh] sl */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling Rlogin connections",
+ IDC_TITLE_RLOGIN);
+ beginbox(&cp, "Data to send to the server", IDC_BOX_RLOGIN1);
+ staticedit(&cp, "Terminal-&speed string", IDC_R_TSSTATIC,
+ IDC_R_TSEDIT, 50);
+ staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC,
+ IDC_RLLUSEREDIT, 50);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == sshpanelstart) {
+ /* The SSH panel. Accelerators used: [acgoh] r pe12ni sd */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling SSH connections",
+ IDC_TITLE_SSH);
+ beginbox(&cp, "Data to send to the server", IDC_BOX_SSH1);
+ multiedit(&cp,
+ "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100,
+ NULL);
+ endbox(&cp);
+ beginbox(&cp, "Protocol options", IDC_BOX_SSH2);
+ checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY);
+ checkbox(&cp, "Enable compr&ession", IDC_COMPRESS);
+ radioline(&cp, "Preferred SSH protocol version:",
+ IDC_SSHPROTSTATIC, 4,
+ "1 on&ly", IDC_SSHPROT1ONLY,
+ "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2,
+ "2 o&nly", IDC_SSHPROT2ONLY, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Encryption options", IDC_BOX_SSH3);
+ prefslist(&cipherlist, &cp, "Encryption cipher &selection policy:",
+ IDC_CIPHERSTATIC2, IDC_CIPHERLIST, IDC_CIPHERUP,
+ IDC_CIPHERDN);
+ checkbox(&cp, "Enable non-standard use of single-&DES in SSH 2",
+ IDC_SSH2DES);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == sshauthpanelstart) {
+ /* The SSH authentication panel. Accelerators used: [acgoh] m fkiuw */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling SSH authentication",
+ IDC_TITLE_SSHAUTH);
+ beginbox(&cp, "Authentication methods",
+ IDC_BOX_SSHAUTH1);
+ checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication (SSH1)",
+ IDC_AUTHTIS);
+ checkbox(&cp, "Attempt \"keyboard-&interactive\" authentication"
+ " (SSH2)", IDC_AUTHKI);
+ endbox(&cp);
+ beginbox(&cp, "Authentication parameters",
+ IDC_BOX_SSHAUTH2);
+ checkbox(&cp, "Allow agent &forwarding", IDC_AGENTFWD);
+ checkbox(&cp, "Allow attempted changes of &username in SSH2",
+ IDC_CHANGEUSER);
+ editbutton(&cp, "Private &key file for authentication:",
+ IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...",
+ IDC_PKBUTTON);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == sshbugspanelstart) {
+ /* The SSH bugs panel. Accelerators used: [acgoh] isrmep */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Workarounds for SSH server bugs",
+ IDC_TITLE_SSHBUGS);
+ beginbox(&cp, "Detection of known bugs in SSH servers",
+ IDC_BOX_SSHBUGS1);
+ staticddl(&cp, "Chokes on SSH1 &ignore messages",
+ IDC_BUGS_IGNORE1, IDC_BUGD_IGNORE1, 20);
+ staticddl(&cp, "Refuses all SSH1 pa&ssword camouflage",
+ IDC_BUGS_PLAINPW1, IDC_BUGD_PLAINPW1, 20);
+ staticddl(&cp, "Chokes on SSH1 &RSA authentication",
+ IDC_BUGS_RSA1, IDC_BUGD_RSA1, 20);
+ staticddl(&cp, "Miscomputes SSH2 H&MAC keys",
+ IDC_BUGS_HMAC2, IDC_BUGD_HMAC2, 20);
+ staticddl(&cp, "Miscomputes SSH2 &encryption keys",
+ IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20);
+ staticddl(&cp, "Requires &padding on SSH2 RSA signatures",
+ IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20);
+ staticddl(&cp, "Chokes on &Diffie-Hellman group exchange",
+ IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX2, 20);
+ endbox(&cp);
+ }
+ }
+
+ if (panel == tunnelspanelstart) {
+ /* The Tunnels panel. Accelerators used: [acgoh] deilmrstxp */
+ struct ctlpos cp;
+ ctlposinit(&cp, hwnd, 80, 3, 13);
+ if (dlgtype == 0) {
+ bartitle(&cp, "Options controlling SSH tunnelling",
+ IDC_TITLE_TUNNELS);
+ beginbox(&cp, "X11 forwarding", IDC_BOX_TUNNELS1);
+ checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD);
+ staticedit(&cp, "&X display location", IDC_X11_DISPSTATIC,
+ IDC_X11_DISPLAY, 50);
+ radioline(&cp, "Remote X11 a&uthentication protocol",
+ IDC_X11AUTHSTATIC, 2,
+ "MIT-Magic-Cookie-1", IDC_X11MIT,
+ "XDM-Authorization-1", IDC_X11XDM, NULL);
+ endbox(&cp);
+ beginbox(&cp, "Port forwarding", IDC_BOX_TUNNELS2);
+ checkbox(&cp, "Local ports accept connections from o&ther hosts",
+ IDC_LPORT_ALL);
+ checkbox(&cp, "Remote &ports do the same (SSH v2 only)",
+ IDC_RPORT_ALL);
+ staticbtn(&cp, "Forwarded ports:", IDC_PFWDSTATIC,
+ "&Remove", IDC_PFWDREMOVE);
+ fwdsetter(&cp, IDC_PFWDLIST,
+ "Add new forwarded port:", IDC_PFWDSTATIC2,
+ "&Source port", IDC_SPORTSTATIC, IDC_SPORTEDIT,
+ "Dest&ination", IDC_DPORTSTATIC, IDC_DPORTEDIT,
+ "A&dd", IDC_PFWDADD,
+ "&Local", IDC_PFWDLOCAL,
+ "Re&mote", IDC_PFWDREMOTE);
+ endbox(&cp);
+
+ }
+ }
+}
+
+/*
+ * Helper function to load the session selected in SESSLIST
+ * if any, as this is done in more than one place in
+ * GenericMainDlgProc(). 0 => failure.
+ */
+static int load_selected_session(HWND hwnd)
+{
+ int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
+ LB_GETCURSEL, 0, 0);
+ int isdef;
+ if (n == LB_ERR) {
+ MessageBeep(0);
+ return 0;
+ }
+ isdef = !strcmp(sesslist.sessions[n], "Default Settings");
+ load_settings(sesslist.sessions[n], !isdef, &cfg);
+ init_dlg_ctrls(hwnd, TRUE);
+ if (!isdef)
+ SetDlgItemText(hwnd, IDC_SESSEDIT, sesslist.sessions[n]);
+ else
+ SetDlgItemText(hwnd, IDC_SESSEDIT, "");
+ /* Restore the selection, which will have been clobbered by
+ * SESSEDIT handling. */
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, n, 0);
+ return 1;
+}
+
+/*
+ * This function is the configuration box.
+ */
+static int GenericMainDlgProc(HWND hwnd, UINT msg,
+ WPARAM wParam, LPARAM lParam, int dlgtype)
+{
+ HWND hw, treeview;
+ struct treeview_faff tvfaff;
+ HTREEITEM hsession;
+ OPENFILENAME of;
+ char filename[sizeof(cfg.keyfile)];
+ CHOOSEFONT cf;
+ LOGFONT lf;
+ char fontstatic[256];
+ char portname[32];
+ struct servent *service;
+ int i;
+ static UINT draglistmsg = WM_NULL;
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ readytogo = 0;
+ SetWindowLong(hwnd, GWL_USERDATA, 0);
+ if (help_path)
+ SetWindowLong(hwnd, GWL_EXSTYLE,
+ GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_CONTEXTHELP);
+ else {
+ HWND item = GetDlgItem(hwnd, IDC_HELPBTN);
+ if (item)
+ DestroyWindow(item);
+ }
+ requested_help = FALSE;
+ SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,
+ (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)));
+ /*
+ * Centre the window.
+ */
+ { /* centre the window */
+ RECT rs, rd;
+
+ hw = GetDesktopWindow();
+ if (GetWindowRect(hw, &rs) && GetWindowRect(hwnd, &rd))
+ MoveWindow(hwnd,
+ (rs.right + rs.left + rd.left - rd.right) / 2,
+ (rs.bottom + rs.top + rd.top - rd.bottom) / 2,
+ rd.right - rd.left, rd.bottom - rd.top, TRUE);
+ }
+
+ /*
+ * Create the tree view.
+ */
+ {
+ RECT r;
+ WPARAM font;
+ HWND tvstatic;
+
+ r.left = 3;
+ r.right = r.left + 75;
+ r.top = 3;
+ r.bottom = r.top + 10;
+ MapDialogRect(hwnd, &r);
+ tvstatic = CreateWindowEx(0, "STATIC", "Cate&gory:",
+ WS_CHILD | WS_VISIBLE,
+ r.left, r.top,
+ r.right - r.left, r.bottom - r.top,
+ hwnd, (HMENU) IDCX_TVSTATIC, hinst,
+ NULL);
+ font = SendMessage(hwnd, WM_GETFONT, 0, 0);
+ SendMessage(tvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
+
+ r.left = 3;
+ r.right = r.left + 75;
+ r.top = 13;
+ r.bottom = r.top + 219;
+ MapDialogRect(hwnd, &r);
+ treeview = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "",
+ WS_CHILD | WS_VISIBLE |
+ WS_TABSTOP | TVS_HASLINES |
+ TVS_DISABLEDRAGDROP | TVS_HASBUTTONS
+ | TVS_LINESATROOT |
+ TVS_SHOWSELALWAYS, r.left, r.top,
+ r.right - r.left, r.bottom - r.top,
+ hwnd, (HMENU) IDCX_TREEVIEW, hinst,
+ NULL);
+ font = SendMessage(hwnd, WM_GETFONT, 0, 0);
+ SendMessage(treeview, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
+ tvfaff.treeview = treeview;
+ memset(tvfaff.lastat, 0, sizeof(tvfaff.lastat));
+ }
+
+ /*
+ * Set up the tree view contents.
+ */
+ hsession = treeview_insert(&tvfaff, 0, "Session");
+ treeview_insert(&tvfaff, 1, "Logging");
+ treeview_insert(&tvfaff, 0, "Terminal");
+ treeview_insert(&tvfaff, 1, "Keyboard");
+ treeview_insert(&tvfaff, 1, "Bell");
+ treeview_insert(&tvfaff, 1, "Features");
+ treeview_insert(&tvfaff, 0, "Window");
+ treeview_insert(&tvfaff, 1, "Appearance");
+ treeview_insert(&tvfaff, 1, "Behaviour");
+ treeview_insert(&tvfaff, 1, "Translation");
+ treeview_insert(&tvfaff, 1, "Selection");
+ treeview_insert(&tvfaff, 1, "Colours");
+ treeview_insert(&tvfaff, 0, "Connection");
+ if (dlgtype == 0) {
+ treeview_insert(&tvfaff, 1, "Proxy");
+ treeview_insert(&tvfaff, 1, "Telnet");
+ treeview_insert(&tvfaff, 1, "Rlogin");
+ if (backends[3].backend != NULL) {
+ treeview_insert(&tvfaff, 1, "SSH");
+ /* XXX long name is ugly */
+ /* XXX make it closed by default? */
+ treeview_insert(&tvfaff, 2, "Auth");
+ treeview_insert(&tvfaff, 2, "Tunnels");
+ treeview_insert(&tvfaff, 2, "Bugs");
+ }
+ }
+
+ /*
+ * Put the treeview selection on to the Session panel. This
+ * should also cause creation of the relevant controls.
+ */
+ TreeView_SelectItem(treeview, hsession);
+
+ /*
+ * Set focus into the first available control.
+ */
+ {
+ HWND ctl;
+ ctl = GetDlgItem(hwnd, IDC_HOST);
+ if (!ctl)
+ ctl = GetDlgItem(hwnd, IDC_CLOSEEXIT);
+ SetFocus(ctl);
+ }
+
+ SetWindowLong(hwnd, GWL_USERDATA, 1);
+ sesslist_has_focus = 0;
+ return 0;
+ case WM_LBUTTONUP:
+ /*
+ * Button release should trigger WM_OK if there was a
+ * previous double click on the session list.
+ */
+ ReleaseCapture();
+ if (readytogo)
+ SendMessage(hwnd, WM_COMMAND, IDOK, 0);
+ break;
+ case WM_NOTIFY:
+ if (LOWORD(wParam) == IDCX_TREEVIEW &&
+ ((LPNMHDR) lParam)->code == TVN_SELCHANGED) {
+ HTREEITEM i =
+ TreeView_GetSelection(((LPNMHDR) lParam)->hwndFrom);
+ TVITEM item;
+ int j;
+ char buffer[64];
+
+ SendMessage (hwnd, WM_SETREDRAW, FALSE, 0);
+
+ item.hItem = i;
+ item.pszText = buffer;
+ item.cchTextMax = sizeof(buffer);
+ item.mask = TVIF_TEXT;
+ TreeView_GetItem(((LPNMHDR) lParam)->hwndFrom, &item);
+ for (j = controlstartvalue; j < controlendvalue; j++) {
+ HWND item = GetDlgItem(hwnd, j);
+ if (item)
+ DestroyWindow(item);
+ }
+ if (!strcmp(buffer, "Session"))
+ create_controls(hwnd, dlgtype, sessionpanelstart);
+ if (!strcmp(buffer, "Logging"))
+ create_controls(hwnd, dlgtype, loggingpanelstart);
+ if (!strcmp(buffer, "Keyboard"))
+ create_controls(hwnd, dlgtype, keyboardpanelstart);
+ if (!strcmp(buffer, "Terminal"))
+ create_controls(hwnd, dlgtype, terminalpanelstart);
+ if (!strcmp(buffer, "Bell"))
+ create_controls(hwnd, dlgtype, bellpanelstart);
+ if (!strcmp(buffer, "Features"))
+ create_controls(hwnd, dlgtype, featurespanelstart);
+ if (!strcmp(buffer, "Window"))
+ create_controls(hwnd, dlgtype, windowpanelstart);
+ if (!strcmp(buffer, "Appearance"))
+ create_controls(hwnd, dlgtype, appearancepanelstart);
+ if (!strcmp(buffer, "Behaviour"))
+ create_controls(hwnd, dlgtype, behaviourpanelstart);
+ if (!strcmp(buffer, "Tunnels"))
+ create_controls(hwnd, dlgtype, tunnelspanelstart);
+ if (!strcmp(buffer, "Connection"))
+ create_controls(hwnd, dlgtype, connectionpanelstart);
+ if (!strcmp(buffer, "Proxy"))
+ create_controls(hwnd, dlgtype, proxypanelstart);
+ if (!strcmp(buffer, "Telnet"))
+ create_controls(hwnd, dlgtype, telnetpanelstart);
+ if (!strcmp(buffer, "Rlogin"))
+ create_controls(hwnd, dlgtype, rloginpanelstart);
+ if (!strcmp(buffer, "SSH"))
+ create_controls(hwnd, dlgtype, sshpanelstart);
+ if (!strcmp(buffer, "Auth"))
+ create_controls(hwnd, dlgtype, sshauthpanelstart);
+ if (!strcmp(buffer, "Bugs"))
+ create_controls(hwnd, dlgtype, sshbugspanelstart);
+ if (!strcmp(buffer, "Selection"))
+ create_controls(hwnd, dlgtype, selectionpanelstart);
+ if (!strcmp(buffer, "Colours"))
+ create_controls(hwnd, dlgtype, colourspanelstart);
+ if (!strcmp(buffer, "Translation"))
+ create_controls(hwnd, dlgtype, translationpanelstart);
+
+ init_dlg_ctrls(hwnd, FALSE);
+
+ SendMessage (hwnd, WM_SETREDRAW, TRUE, 0);
+ InvalidateRect (hwnd, NULL, TRUE);
+
+ SetFocus(((LPNMHDR) lParam)->hwndFrom); /* ensure focus stays */
+ return 0;
+ }
+ break;
+ case WM_COMMAND:
+ /*
+ * Only process WM_COMMAND once the dialog is fully formed.
+ */
+ if (GetWindowLong(hwnd, GWL_USERDATA) == 1)
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ /* Behaviour of the "Open" button is different if the
+ * session list has focus, *unless* the user just
+ * double-clicked... */
+ if (sesslist_has_focus && !readytogo) {
+ if (!load_selected_session(hwnd)) {
+ MessageBeep(0);
+ return 0;
+ }
+ }
+ /* If at this point we have a valid session, go! */
+ if (*cfg.host) {
+ if (requested_help) {
+ WinHelp(hwnd, help_path, HELP_QUIT, 0);
+ requested_help = FALSE;
+ }
+ EndDialog(hwnd, 1);
+ } else
+ MessageBeep(0);
+ return 0;
+ case IDC_HELPBTN:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ if (help_path) {
+ WinHelp(hwnd, help_path,
+ help_has_contents ? HELP_FINDER : HELP_CONTENTS,
+ 0);
+ requested_help = TRUE;
+ }
+ }
+ break;
+ case IDCANCEL:
+ if (requested_help) {
+ WinHelp(hwnd, help_path, HELP_QUIT, 0);
+ requested_help = FALSE;
+ }
+ EndDialog(hwnd, 0);
+ return 0;
+ case IDC_PROTTELNET:
+ case IDC_PROTRLOGIN:
+ case IDC_PROTSSH:
+ case IDC_PROTRAW:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ int i = IsDlgButtonChecked(hwnd, IDC_PROTSSH);
+ int j = IsDlgButtonChecked(hwnd, IDC_PROTTELNET);
+ int k = IsDlgButtonChecked(hwnd, IDC_PROTRLOGIN);
+ cfg.protocol =
+ i ? PROT_SSH : j ? PROT_TELNET : k ? PROT_RLOGIN :
+ PROT_RAW;
+ /*
+ * When switching using the arrow keys, we
+ * appear to get two of these messages, both
+ * mentioning the target button in
+ * LOWORD(wParam), but one of them called while
+ * the previous button is still checked. This
+ * causes an unnecessary reset of the port
+ * number field, which we fix by ensuring here
+ * that the button selected is indeed the one
+ * checked.
+ */
+ if (IsDlgButtonChecked(hwnd, LOWORD(wParam)) &&
+ ((cfg.protocol == PROT_SSH && cfg.port != 22)
+ || (cfg.protocol == PROT_TELNET && cfg.port != 23)
+ || (cfg.protocol == PROT_RLOGIN
+ && cfg.port != 513))) {
+ cfg.port = i ? 22 : j ? 23 : 513;
+ SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE);
+ }
+ }
+ break;
+ case IDC_HOST:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_HOST, cfg.host,
+ sizeof(cfg.host) - 1);
+ break;
+ case IDC_PORT:
+ if (HIWORD(wParam) == EN_CHANGE) {
+ GetDlgItemText(hwnd, IDC_PORT, portname, 31);
+ if (isdigit(portname[0]))
+ MyGetDlgItemInt(hwnd, IDC_PORT, &cfg.port);
+ else {
+ service = getservbyname(portname, NULL);
+ if (service)
+ cfg.port = ntohs(service->s_port);
+ else
+ cfg.port = 0;
+ }
+ }
+ break;
+ case IDC_SESSEDIT:
+ if (HIWORD(wParam) == EN_CHANGE) {
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
+ (WPARAM) - 1, 0);
+ GetDlgItemText(hwnd, IDC_SESSEDIT,
+ savedsession, sizeof(savedsession) - 1);
+ savedsession[sizeof(savedsession) - 1] = '\0';
+ }
+ break;
+ case IDC_SESSSAVE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ /*
+ * Save a session
+ */
+ char str[2048];
+ GetDlgItemText(hwnd, IDC_SESSEDIT, str,
+ sizeof(str) - 1);
+ if (!*str) {
+ int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
+ LB_GETCURSEL, 0, 0);
+ if (n == LB_ERR) {
+ MessageBeep(0);
+ break;
+ }
+ strcpy(str, sesslist.sessions[n]);
+ }
+ save_settings(str, !!strcmp(str, "Default Settings"),
+ &cfg);
+ get_sesslist(&sesslist, FALSE);
+ get_sesslist(&sesslist, TRUE);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
+ FALSE, 0);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
+ 0, 0);
+ for (i = 0; i < sesslist.nsessions; i++)
+ SendDlgItemMessage(hwnd, IDC_SESSLIST,
+ LB_ADDSTRING, 0,
+ (LPARAM) (sesslist.sessions[i]));
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
+ (WPARAM) - 1, 0);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
+ TRUE, 0);
+ InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL,
+ TRUE);
+ }
+ break;
+ case IDC_SESSLIST:
+ case IDC_SESSLOAD:
+ if (LOWORD(wParam) == IDC_SESSLIST) {
+ if (HIWORD(wParam) == LBN_SETFOCUS)
+ sesslist_has_focus = 1;
+ else if (HIWORD(wParam) == LBN_KILLFOCUS)
+ sesslist_has_focus = 0;
+ }
+ if (LOWORD(wParam) == IDC_SESSLOAD &&
+ HIWORD(wParam) != BN_CLICKED &&
+ HIWORD(wParam) != BN_DOUBLECLICKED) break;
+ if (LOWORD(wParam) == IDC_SESSLIST &&
+ HIWORD(wParam) != LBN_DBLCLK) break;
+ /* Load the session selected in SESSLIST. */
+ if (load_selected_session(hwnd) &&
+ LOWORD(wParam) == IDC_SESSLIST) {
+ /*
+ * A double-click on a saved session should
+ * actually start the session, not just load it.
+ * Unless it's Default Settings or some other
+ * host-less set of saved settings.
+ */
+ if (*cfg.host) {
+ readytogo = TRUE;
+ SetCapture(hwnd);
+ }
+ }
+ break;
+ case IDC_SESSDEL:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ int n = SendDlgItemMessage(hwnd, IDC_SESSLIST,
+ LB_GETCURSEL, 0, 0);
+ if (n == LB_ERR || n == 0) {
+ MessageBeep(0);
+ break;
+ }
+ del_settings(sesslist.sessions[n]);
+ get_sesslist(&sesslist, FALSE);
+ get_sesslist(&sesslist, TRUE);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
+ FALSE, 0);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT,
+ 0, 0);
+ for (i = 0; i < sesslist.nsessions; i++)
+ SendDlgItemMessage(hwnd, IDC_SESSLIST,
+ LB_ADDSTRING, 0,
+ (LPARAM) (sesslist.sessions[i]));
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL,
+ (WPARAM) - 1, 0);
+ SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW,
+ TRUE, 0);
+ InvalidateRect(GetDlgItem(hwnd, IDC_SESSLIST), NULL,
+ TRUE);
+ }
+ case IDC_PINGEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_PINGEDIT,
+ &cfg.ping_interval);
+ break;
+ case IDC_NODELAY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.tcp_nodelay =
+ IsDlgButtonChecked(hwnd, IDC_NODELAY);
+ break;
+ case IDC_DEL008:
+ case IDC_DEL127:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.bksp_is_delete =
+ IsDlgButtonChecked(hwnd, IDC_DEL127);
+ break;
+ case IDC_HOMETILDE:
+ case IDC_HOMERXVT:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.rxvt_homeend =
+ IsDlgButtonChecked(hwnd, IDC_HOMERXVT);
+ break;
+ case IDC_FUNCTILDE:
+ case IDC_FUNCLINUX:
+ case IDC_FUNCXTERM:
+ case IDC_FUNCVT400:
+ case IDC_FUNCVT100P:
+ case IDC_FUNCSCO:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ switch (LOWORD(wParam)) {
+ case IDC_FUNCTILDE:
+ cfg.funky_type = 0;
+ break;
+ case IDC_FUNCLINUX:
+ cfg.funky_type = 1;
+ break;
+ case IDC_FUNCXTERM:
+ cfg.funky_type = 2;
+ break;
+ case IDC_FUNCVT400:
+ cfg.funky_type = 3;
+ break;
+ case IDC_FUNCVT100P:
+ cfg.funky_type = 4;
+ break;
+ case IDC_FUNCSCO:
+ cfg.funky_type = 5;
+ break;
+ }
+ break;
+ case IDC_KPNORMAL:
+ case IDC_KPAPPLIC:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ cfg.app_keypad =
+ IsDlgButtonChecked(hwnd, IDC_KPAPPLIC);
+ cfg.nethack_keypad = FALSE;
+ }
+ break;
+ case IDC_KPNH:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ cfg.app_keypad = FALSE;
+ cfg.nethack_keypad = TRUE;
+ }
+ break;
+ case IDC_CURNORMAL:
+ case IDC_CURAPPLIC:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.app_cursor =
+ IsDlgButtonChecked(hwnd, IDC_CURAPPLIC);
+ break;
+ case IDC_NOAPPLICC:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_applic_c =
+ IsDlgButtonChecked(hwnd, IDC_NOAPPLICC);
+ break;
+ case IDC_NOAPPLICK:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_applic_k =
+ IsDlgButtonChecked(hwnd, IDC_NOAPPLICK);
+ break;
+ case IDC_NOMOUSEREP:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_mouse_rep =
+ IsDlgButtonChecked(hwnd, IDC_NOMOUSEREP);
+ break;
+ case IDC_NORESIZE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_remote_resize =
+ IsDlgButtonChecked(hwnd, IDC_NORESIZE);
+ break;
+ case IDC_NOALTSCREEN:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_alt_screen =
+ IsDlgButtonChecked(hwnd, IDC_NOALTSCREEN);
+ break;
+ case IDC_NOWINTITLE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_remote_wintitle =
+ IsDlgButtonChecked(hwnd, IDC_NOWINTITLE);
+ break;
+ case IDC_NODBACKSPACE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_dbackspace =
+ IsDlgButtonChecked(hwnd, IDC_NODBACKSPACE);
+ break;
+ case IDC_NOCHARSET:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.no_remote_charset =
+ IsDlgButtonChecked(hwnd, IDC_NOCHARSET);
+ break;
+ case IDC_ALTF4:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.alt_f4 = IsDlgButtonChecked(hwnd, IDC_ALTF4);
+ break;
+ case IDC_ALTSPACE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.alt_space =
+ IsDlgButtonChecked(hwnd, IDC_ALTSPACE);
+ break;
+ case IDC_ALTONLY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.alt_only =
+ IsDlgButtonChecked(hwnd, IDC_ALTONLY);
+ break;
+ case IDC_ECHOBACKEND:
+ case IDC_ECHOYES:
+ case IDC_ECHONO:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ if (LOWORD(wParam) == IDC_ECHOBACKEND)
+ cfg.localecho = LD_BACKEND;
+ if (LOWORD(wParam) == IDC_ECHOYES)
+ cfg.localecho = LD_YES;
+ if (LOWORD(wParam) == IDC_ECHONO)
+ cfg.localecho = LD_NO;
+ }
+ break;
+ case IDC_EDITBACKEND:
+ case IDC_EDITYES:
+ case IDC_EDITNO:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ if (LOWORD(wParam) == IDC_EDITBACKEND)
+ cfg.localedit = LD_BACKEND;
+ if (LOWORD(wParam) == IDC_EDITYES)
+ cfg.localedit = LD_YES;
+ if (LOWORD(wParam) == IDC_EDITNO)
+ cfg.localedit = LD_NO;
+ }
+ break;
+ case IDC_ANSWEREDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_ANSWEREDIT, cfg.answerback,
+ sizeof(cfg.answerback) - 1);
+ break;
+ case IDC_ALWAYSONTOP:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.alwaysontop =
+ IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP);
+ break;
+ case IDC_FULLSCREENONALTENTER:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.fullscreenonaltenter =
+ IsDlgButtonChecked(hwnd, IDC_FULLSCREENONALTENTER);
+ break;
+ case IDC_SCROLLKEY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.scroll_on_key =
+ IsDlgButtonChecked(hwnd, IDC_SCROLLKEY);
+ break;
+ case IDC_SCROLLDISP:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.scroll_on_disp =
+ IsDlgButtonChecked(hwnd, IDC_SCROLLDISP);
+ break;
+ case IDC_COMPOSEKEY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.compose_key =
+ IsDlgButtonChecked(hwnd, IDC_COMPOSEKEY);
+ break;
+ case IDC_CTRLALTKEYS:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.ctrlaltkeys =
+ IsDlgButtonChecked(hwnd, IDC_CTRLALTKEYS);
+ break;
+ case IDC_TELNETKEY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.telnet_keyboard =
+ IsDlgButtonChecked(hwnd, IDC_TELNETKEY);
+ break;
+ case IDC_TELNETRET:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.telnet_newline =
+ IsDlgButtonChecked(hwnd, IDC_TELNETRET);
+ break;
+ case IDC_WRAPMODE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.wrap_mode =
+ IsDlgButtonChecked(hwnd, IDC_WRAPMODE);
+ break;
+ case IDC_DECOM:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.dec_om = IsDlgButtonChecked(hwnd, IDC_DECOM);
+ break;
+ case IDC_LFHASCR:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.lfhascr =
+ IsDlgButtonChecked(hwnd, IDC_LFHASCR);
+ break;
+ case IDC_ROWSEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_ROWSEDIT, &cfg.height);
+ break;
+ case IDC_COLSEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_COLSEDIT, &cfg.width);
+ break;
+ case IDC_SAVEEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_SAVEEDIT, &cfg.savelines);
+ break;
+ case IDC_CHOOSEFONT:
+ {
+ HDC hdc = GetDC(0);
+ lf.lfHeight = -MulDiv(cfg.fontheight,
+ GetDeviceCaps(hdc, LOGPIXELSY),
+ 72);
+ ReleaseDC(0, hdc);
+ }
+ lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
+ lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;
+ lf.lfWeight = (cfg.fontisbold ? FW_BOLD : 0);
+ lf.lfCharSet = cfg.fontcharset;
+ lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lf.lfQuality = DEFAULT_QUALITY;
+ lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
+ strncpy(lf.lfFaceName, cfg.font,
+ sizeof(lf.lfFaceName) - 1);
+ lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0';
+
+ cf.lStructSize = sizeof(cf);
+ cf.hwndOwner = hwnd;
+ cf.lpLogFont = &lf;
+ cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST |
+ CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
+
+ if (ChooseFont(&cf)) {
+ strncpy(cfg.font, lf.lfFaceName, sizeof(cfg.font) - 1);
+ cfg.font[sizeof(cfg.font) - 1] = '\0';
+ cfg.fontisbold = (lf.lfWeight == FW_BOLD);
+ cfg.fontcharset = lf.lfCharSet;
+ cfg.fontheight = cf.iPointSize / 10;
+ fmtfont(fontstatic);
+ SetDlgItemText(hwnd, IDC_FONTSTATIC, fontstatic);
+ }
+ break;
+ case IDC_BELL_DISABLED:
+ case IDC_BELL_DEFAULT:
+ case IDC_BELL_WAVEFILE:
+ case IDC_BELL_VISUAL:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ if (LOWORD(wParam) == IDC_BELL_DISABLED)
+ cfg.beep = BELL_DISABLED;
+ if (LOWORD(wParam) == IDC_BELL_DEFAULT)
+ cfg.beep = BELL_DEFAULT;
+ if (LOWORD(wParam) == IDC_BELL_WAVEFILE)
+ cfg.beep = BELL_WAVEFILE;
+ if (LOWORD(wParam) == IDC_BELL_VISUAL)
+ cfg.beep = BELL_VISUAL;
+ }
+ break;
+ case IDC_B_IND_DISABLED:
+ case IDC_B_IND_FLASH:
+ case IDC_B_IND_STEADY:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ if (LOWORD(wParam) == IDC_B_IND_DISABLED)
+ cfg.beep_ind = B_IND_DISABLED;
+ if (LOWORD(wParam) == IDC_B_IND_FLASH)
+ cfg.beep_ind = B_IND_FLASH;
+ if (LOWORD(wParam) == IDC_B_IND_STEADY)
+ cfg.beep_ind = B_IND_STEADY;
+ }
+ break;
+ case IDC_BELL_WAVEBROWSE:
+ memset(&of, 0, sizeof(of));
+#ifdef OPENFILENAME_SIZE_VERSION_400
+ of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+#else
+ of.lStructSize = sizeof(of);
+#endif
+ of.hwndOwner = hwnd;
+ of.lpstrFilter = "Wave Files\0*.WAV\0AllFiles\0*\0\0\0";
+ of.lpstrCustomFilter = NULL;
+ of.nFilterIndex = 1;
+ of.lpstrFile = filename;
+ strcpy(filename, cfg.bell_wavefile);
+ of.nMaxFile = sizeof(filename);
+ of.lpstrFileTitle = NULL;
+ of.lpstrInitialDir = NULL;
+ of.lpstrTitle = "Select Bell Sound File";
+ of.Flags = 0;
+ if (GetOpenFileName(&of)) {
+ strcpy(cfg.bell_wavefile, filename);
+ SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,
+ cfg.bell_wavefile);
+ }
+ break;
+ case IDC_BELL_WAVEEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,
+ cfg.bell_wavefile,
+ sizeof(cfg.bell_wavefile) - 1);
+ break;
+ case IDC_BELLOVL:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.bellovl =
+ IsDlgButtonChecked(hwnd, IDC_BELLOVL);
+ break;
+ case IDC_BELLOVLN:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_BELLOVLN, &cfg.bellovl_n);
+ break;
+ case IDC_BELLOVLT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemFlt(hwnd, IDC_BELLOVLT, &cfg.bellovl_t,
+ 1000);
+ break;
+ case IDC_BELLOVLS:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemFlt(hwnd, IDC_BELLOVLS, &cfg.bellovl_s,
+ 1000);
+ break;
+ case IDC_BLINKTEXT:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.blinktext =
+ IsDlgButtonChecked(hwnd, IDC_BLINKTEXT);
+ break;
+ case IDC_BCE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.bce = IsDlgButtonChecked(hwnd, IDC_BCE);
+ break;
+ case IDC_WINNAME:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.win_name_always =
+ IsDlgButtonChecked(hwnd, IDC_WINNAME);
+ break;
+ case IDC_HIDEMOUSE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.hide_mouseptr =
+ IsDlgButtonChecked(hwnd, IDC_HIDEMOUSE);
+ break;
+ case IDC_SUNKENEDGE:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.sunken_edge =
+ IsDlgButtonChecked(hwnd, IDC_SUNKENEDGE);
+ break;
+ case IDC_WINBEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ MyGetDlgItemInt(hwnd, IDC_WINBEDIT,
+ &cfg.window_border);
+ if (cfg.window_border > 32)
+ cfg.window_border = 32;
+ break;
+ case IDC_CURBLOCK:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.cursor_type = 0;
+ break;
+ case IDC_CURUNDER:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.cursor_type = 1;
+ break;
+ case IDC_CURVERT:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.cursor_type = 2;
+ break;
+ case IDC_BLINKCUR:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.blink_cur =
+ IsDlgButtonChecked(hwnd, IDC_BLINKCUR);
+ break;
+ case IDC_SCROLLBAR:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.scrollbar =
+ IsDlgButtonChecked(hwnd, IDC_SCROLLBAR);
+ break;
+ case IDC_SCROLLBARFULLSCREEN:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.scrollbar_in_fullscreen =
+ IsDlgButtonChecked(hwnd, IDC_SCROLLBARFULLSCREEN);
+ break;
+ case IDC_RESIZETERM:
+ case IDC_RESIZEFONT:
+ case IDC_RESIZENONE:
+ case IDC_RESIZEEITHER:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ cfg.resize_action =
+ IsDlgButtonChecked(hwnd,
+ IDC_RESIZETERM) ? RESIZE_TERM :
+ IsDlgButtonChecked(hwnd,
+ IDC_RESIZEFONT) ? RESIZE_FONT :
+ IsDlgButtonChecked(hwnd,
+ IDC_RESIZEEITHER) ? RESIZE_EITHER :
+ RESIZE_DISABLED;
+ }
+ break;
+ case IDC_WINEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_WINEDIT, cfg.wintitle,
+ sizeof(cfg.wintitle) - 1);
+ break;
+ case IDC_COEALWAYS:
+ case IDC_COENEVER:
+ case IDC_COENORMAL:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ cfg.close_on_exit =
+ IsDlgButtonChecked(hwnd,
+ IDC_COEALWAYS) ? COE_ALWAYS :
+ IsDlgButtonChecked(hwnd,
+ IDC_COENEVER) ? COE_NEVER :
+ COE_NORMAL;
+ }
+ break;
+ case IDC_CLOSEWARN:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED)
+ cfg.warn_on_close =
+ IsDlgButtonChecked(hwnd, IDC_CLOSEWARN);
+ break;
+ case IDC_TTEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype,
+ sizeof(cfg.termtype) - 1);
+ break;
+
+ /* proxy config */
+ case IDC_PROXYHOSTEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host,
+ sizeof(cfg.proxy_host) - 1);
+ break;
+ case IDC_PROXYPORTEDIT:
+ if (HIWORD(wParam) == EN_CHANGE) {
+ GetDlgItemText(hwnd, IDC_PROXYPORTEDIT, portname, 31);
+ if (isdigit(portname[0]))
+ MyGetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, &cfg.proxy_port);
+ else {
+ service = getservbyname(portname, NULL);
+ if (service)
+ cfg.proxy_port = ntohs(service->s_port);
+ else
+ cfg.proxy_port = 0;
+ }
+ }
+ break;
+ case IDC_PROXYEXCLUDEEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT,
+ cfg.proxy_exclude_list,
+ sizeof(cfg.proxy_exclude_list) - 1);
+ break;
+ case IDC_PROXYUSEREDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_PROXYUSEREDIT,
+ cfg.proxy_username,
+ sizeof(cfg.proxy_username) - 1);
+ break;
+ case IDC_PROXYPASSEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_PROXYPASSEDIT,
+ cfg.proxy_password,
+ sizeof(cfg.proxy_password) - 1);
+ break;
+ case IDC_PROXYTELNETCMDEDIT:
+ if (HIWORD(wParam) == EN_CHANGE)
+ GetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT,
+ cfg.proxy_telnet_command,
+ sizeof(cfg.proxy_telnet_command) - 1);
+ break;
+ case IDC_PROXYSOCKSVER5:
+ case IDC_PROXYSOCKSVER4:
+ if (HIWORD(wParam) == BN_CLICKED ||
+ HIWORD(wParam) == BN_DOUBLECLICKED) {
+ cfg.proxy_socks_version =
+ IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5;