X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/f0df44da3e916a78cc09ba5a98c490f0b6b2af68..8df7a775f6f8b0f81f84eafe28cd0bb8d4c6d1f4:/windlg.c diff --git a/windlg.c b/windlg.c index f660fb00..d338781f 100644 --- a/windlg.c +++ b/windlg.c @@ -1,303 +1,25 @@ #include #include #include -#ifndef AUTO_WINSOCK -#ifdef WINSOCK_TWO -#include -#else -#include -#endif -#endif #include #include #include "ssh.h" #include "putty.h" +#include "winstuff.h" #include "win_res.h" #include "storage.h" -#define NPANELS 9 -#define MAIN_NPANELS 9 -#define RECONF_NPANELS 6 - static char **events = NULL; static int nevents = 0, negsize = 0; static HWND logbox = NULL, abtbox = NULL; -static void gpps(void *handle, char *name, char *def, char *val, int len) { - if (!read_setting_s(handle, name, val, len)) { - strncpy(val, def, len); - val[len-1] = '\0'; - } -} - -static void gppi(void *handle, char *name, int def, int *i) { - *i = read_setting_i(handle, name, def); -} - -static HINSTANCE hinst; - static int readytogo; -static void save_settings (char *section, int do_host) { - int i; - char *p; - void *sesskey; - - sesskey = open_settings_w(section); - if (!sesskey) - return; - - write_setting_i (sesskey, "Present", 1); - if (do_host) { - write_setting_s (sesskey, "HostName", cfg.host); - write_setting_i (sesskey, "PortNumber", cfg.port); - p = "raw"; - for (i = 0; backends[i].name != NULL; i++) - if (backends[i].protocol == cfg.protocol) { - p = backends[i].name; - break; - } - write_setting_s (sesskey, "Protocol", p); - } - write_setting_i (sesskey, "CloseOnExit", !!cfg.close_on_exit); - write_setting_i (sesskey, "WarnOnClose", !!cfg.warn_on_close); - write_setting_s (sesskey, "TerminalType", cfg.termtype); - write_setting_s (sesskey, "TerminalSpeed", cfg.termspeed); - { - char buf[2*sizeof(cfg.environmt)], *p, *q; - p = buf; - q = cfg.environmt; - while (*q) { - while (*q) { - int c = *q++; - if (c == '=' || c == ',' || c == '\\') - *p++ = '\\'; - if (c == '\t') - c = '='; - *p++ = c; - } - *p++ = ','; - q++; - } - *p = '\0'; - write_setting_s (sesskey, "Environment", buf); - } - write_setting_s (sesskey, "UserName", cfg.username); - write_setting_i (sesskey, "NoPTY", cfg.nopty); - write_setting_i (sesskey, "AgentFwd", cfg.agentfwd); - write_setting_s (sesskey, "RemoteCmd", cfg.remote_cmd); - write_setting_s (sesskey, "Cipher", cfg.cipher == CIPHER_BLOWFISH ? "blowfish" : - cfg.cipher == CIPHER_DES ? "des" : "3des"); - write_setting_i (sesskey, "AuthTIS", cfg.try_tis_auth); - write_setting_i (sesskey, "SshProt", cfg.sshprot); - write_setting_s (sesskey, "PublicKeyFile", cfg.keyfile); - write_setting_s (sesskey, "RemoteCommand", cfg.remote_cmd); - write_setting_i (sesskey, "RFCEnviron", cfg.rfc_environ); - write_setting_i (sesskey, "BackspaceIsDelete", cfg.bksp_is_delete); - write_setting_i (sesskey, "RXVTHomeEnd", cfg.rxvt_homeend); - write_setting_i (sesskey, "LinuxFunctionKeys", cfg.funky_type); - write_setting_i (sesskey, "ApplicationCursorKeys", cfg.app_cursor); - write_setting_i (sesskey, "ApplicationKeypad", cfg.app_keypad); - write_setting_i (sesskey, "NetHackKeypad", cfg.nethack_keypad); - write_setting_i (sesskey, "AltF4", cfg.alt_f4); - write_setting_i (sesskey, "AltSpace", cfg.alt_space); - write_setting_i (sesskey, "LdiscTerm", cfg.ldisc_term); - write_setting_i (sesskey, "BlinkCur", cfg.blink_cur); - write_setting_i (sesskey, "Beep", cfg.beep); - write_setting_i (sesskey, "ScrollbackLines", cfg.savelines); - write_setting_i (sesskey, "DECOriginMode", cfg.dec_om); - write_setting_i (sesskey, "AutoWrapMode", cfg.wrap_mode); - write_setting_i (sesskey, "LFImpliesCR", cfg.lfhascr); - write_setting_i (sesskey, "WinNameAlways", cfg.win_name_always); - write_setting_s (sesskey, "WinTitle", cfg.wintitle); - write_setting_i (sesskey, "TermWidth", cfg.width); - write_setting_i (sesskey, "TermHeight", cfg.height); - write_setting_s (sesskey, "Font", cfg.font); - write_setting_i (sesskey, "FontIsBold", cfg.fontisbold); - write_setting_i (sesskey, "FontCharSet", cfg.fontcharset); - write_setting_i (sesskey, "FontHeight", cfg.fontheight); - write_setting_i (sesskey, "FontVTMode", cfg.vtmode); - write_setting_i (sesskey, "TryPalette", cfg.try_palette); - write_setting_i (sesskey, "BoldAsColour", cfg.bold_colour); - for (i=0; i<22; i++) { - char buf[20], buf2[30]; - sprintf(buf, "Colour%d", i); - sprintf(buf2, "%d,%d,%d", cfg.colours[i][0], - cfg.colours[i][1], cfg.colours[i][2]); - write_setting_s (sesskey, buf, buf2); - } - write_setting_i (sesskey, "MouseIsXterm", cfg.mouse_is_xterm); - for (i=0; i<256; i+=32) { - char buf[20], buf2[256]; - int j; - sprintf(buf, "Wordness%d", i); - *buf2 = '\0'; - for (j=i; jhwnd = hwnd; - cp->units = GetWindowLong(hwnd, GWL_USERDATA); - cp->font = GetWindowLong(hwnd, DWL_USER); - cp->ypos = GAPBETWEEN; - GetClientRect(hwnd, &r); - cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN; -} +static const char *const colours[] = { + "Default Foreground", "Default Bold Foreground", + "Default Background", "Default Bold Background", + "Cursor Text", "Cursor Colour", + "ANSI Black", "ANSI Black Bold", + "ANSI Red", "ANSI Red Bold", + "ANSI Green", "ANSI Green Bold", + "ANSI Yellow", "ANSI Yellow Bold", + "ANSI Blue", "ANSI Blue Bold", + "ANSI Magenta", "ANSI Magenta Bold", + "ANSI Cyan", "ANSI Cyan Bold", + "ANSI White", "ANSI White Bold" +}; +static const int permcolour[] = { + TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, + TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, + TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE +}; -/* Used on kosher dialogs. */ -static void ctlposinit2(struct ctlpos *cp, HWND hwnd) { - RECT r; - cp->hwnd = hwnd; - r.left = r.top = 0; - r.right = 4; - r.bottom = 8; - MapDialogRect(hwnd, &r); - cp->units = (r.bottom << 16) | r.right; - cp->font = SendMessage(hwnd, WM_GETFONT, 0, 0); - cp->ypos = GAPBETWEEN; - GetClientRect(hwnd, &r); - cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN; +static void fmtfont (char *buf) { + sprintf (buf, "Font: %s, ", cfg.font); + if (cfg.fontisbold) + strcat(buf, "bold, "); + if (cfg.fontheight == 0) + strcat (buf, "default height"); + else + sprintf (buf+strlen(buf), "%d-%s", + (cfg.fontheight < 0 ? -cfg.fontheight : cfg.fontheight), + (cfg.fontheight < 0 ? "pixel" : "point")); } -static void doctl(struct ctlpos *cp, RECT r, - char *wclass, int wstyle, int exstyle, - char *wtext, int wid) { - HWND ctl; - /* - * Note nonstandard use of RECT. This is deliberate: by - * transforming the width and height directly we arrange to - * have all supposedly same-sized controls really same-sized. - */ - - /* MapDialogRect, or its near equivalent. */ - r.left = (r.left * (cp->units & 0xFFFF)) / 4; - r.right = (r.right * (cp->units & 0xFFFF)) / 4; - r.top = (r.top * ((cp->units>>16) & 0xFFFF)) / 8; - r.bottom = (r.bottom * ((cp->units>>16) & 0xFFFF)) / 8; +static void init_dlg_ctrls(HWND hwnd) { + int i; + char fontstatic[256]; - ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle, - r.left, r.top, r.right, r.bottom, - cp->hwnd, (HMENU)wid, hinst, NULL); - SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0)); -} + SetDlgItemText (hwnd, IDC_HOST, cfg.host); + SetDlgItemText (hwnd, IDC_SESSEDIT, savedsession); + SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE); + CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH, + cfg.protocol==PROT_SSH ? IDC_PROTSSH : + cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW ); + SetDlgItemInt (hwnd, IDC_PINGEDIT, cfg.ping_interval, FALSE); + + CheckRadioButton (hwnd, IDC_DEL008, IDC_DEL127, + cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); + CheckRadioButton (hwnd, IDC_HOMETILDE, IDC_HOMERXVT, + cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE); + CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCVT400, + cfg.funky_type == 0 ? IDC_FUNCTILDE : + cfg.funky_type == 1 ? IDC_FUNCLINUX : + cfg.funky_type == 2 ? IDC_FUNCXTERM : + cfg.funky_type == 3 ? IDC_FUNCVT400 : + IDC_FUNCTILDE ); + CheckRadioButton (hwnd, IDC_CURNORMAL, IDC_CURAPPLIC, + cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL); + CheckRadioButton (hwnd, IDC_KPNORMAL, IDC_KPNH, + cfg.nethack_keypad ? IDC_KPNH : + cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL); + CheckDlgButton (hwnd, IDC_ALTF4, cfg.alt_f4); + CheckDlgButton (hwnd, IDC_ALTSPACE, cfg.alt_space); + CheckDlgButton (hwnd, IDC_ALTONLY, cfg.alt_only); + CheckDlgButton (hwnd, IDC_COMPOSEKEY, cfg.compose_key); + CheckDlgButton (hwnd, IDC_LDISCTERM, cfg.ldisc_term); + CheckDlgButton (hwnd, IDC_SCROLLKEY, cfg.scroll_on_key); + CheckDlgButton (hwnd, IDC_SCROLLDISP, cfg.scroll_on_disp); + + CheckDlgButton (hwnd, IDC_WRAPMODE, cfg.wrap_mode); + CheckDlgButton (hwnd, IDC_DECOM, cfg.dec_om); + CheckDlgButton (hwnd, IDC_LFHASCR, cfg.lfhascr); + SetDlgItemInt (hwnd, IDC_ROWSEDIT, cfg.height, FALSE); + SetDlgItemInt (hwnd, IDC_COLSEDIT, cfg.width, FALSE); + SetDlgItemInt (hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE); + fmtfont (fontstatic); + SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic); + CheckDlgButton (hwnd, IDC_BEEP, cfg.beep); + CheckDlgButton (hwnd, IDC_BCE, cfg.bce); + CheckDlgButton (hwnd, IDC_BLINKTEXT, cfg.blinktext); + + SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle); + CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always); + CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur); + CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar); + CheckDlgButton (hwnd, IDC_LOCKSIZE, cfg.locksize); + CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); + CheckDlgButton (hwnd, IDC_CLOSEWARN, cfg.warn_on_close); + + SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); + SetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed); + SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); + { + char *p = cfg.environmt; + while (*p) { + SendDlgItemMessage (hwnd, IDC_ENVLIST, LB_ADDSTRING, 0, + (LPARAM) p); + p += strlen(p)+1; + } + } + CheckRadioButton (hwnd, IDC_EMBSD, IDC_EMRFC, + cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD); + + SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); + SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); + CheckDlgButton (hwnd, IDC_NOPTY, cfg.nopty); + CheckDlgButton (hwnd, IDC_BUGGYMAC, cfg.buggymac); + CheckDlgButton (hwnd, IDC_AGENTFWD, cfg.agentfwd); + CheckRadioButton (hwnd, IDC_CIPHER3DES, IDC_CIPHERDES, + cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF : + cfg.cipher == CIPHER_DES ? IDC_CIPHERDES : + IDC_CIPHER3DES); + CheckRadioButton (hwnd, IDC_SSHPROT1, IDC_SSHPROT2, + cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); + CheckDlgButton (hwnd, IDC_AUTHTIS, cfg.try_tis_auth); + SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); + SetDlgItemText (hwnd, IDC_CMDEDIT, cfg.remote_cmd); + + CheckRadioButton (hwnd, IDC_MBWINDOWS, IDC_MBXTERM, + cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS); + { + static int tabs[4] = {25, 61, 96, 128}; + SendDlgItemMessage (hwnd, IDC_CCLIST, LB_SETTABSTOPS, 4, + (LPARAM) tabs); + } + for (i=0; i<256; i++) { + char str[100]; + sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, + (i>=0x21 && i != 0x7F) ? i : ' ', + cfg.wordness[i]); + SendDlgItemMessage (hwnd, IDC_CCLIST, LB_ADDSTRING, 0, + (LPARAM) str); + } -/* - * Some edit boxes. Each one has a static above it. The percentages - * of the horizontal space are provided. - */ -static void multiedit(struct ctlpos *cp, ...) { - RECT r; - va_list ap; - int percent, xpos; - - percent = xpos = 0; - va_start(ap, cp); - while (1) { - char *text; - int staticid, editid, pcwidth; - text = va_arg(ap, char *); - if (!text) - break; - staticid = va_arg(ap, int); - editid = va_arg(ap, int); - pcwidth = va_arg(ap, int); - - r.left = xpos + GAPBETWEEN; - percent += pcwidth; - xpos = (cp->width + GAPBETWEEN) * percent / 100; - r.right = xpos - r.left; - - r.top = cp->ypos; r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, - text, staticid); - r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = EDITHEIGHT; - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, - "", editid); + CheckDlgButton (hwnd, IDC_BOLDCOLOUR, cfg.bold_colour); + CheckDlgButton (hwnd, IDC_PALETTE, cfg.try_palette); + { + int i; + for (i=0; i<22; i++) + if (cfg.bold_colour || permcolour[i]) + SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_ADDSTRING, 0, + (LPARAM) colours[i]); } - va_end(ap); - cp->ypos += 8+GAPWITHIN+12+GAPBETWEEN; + SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_SETCURSEL, 0, 0); + SetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE); + SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE); + SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE); + + CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592CP852, + cfg.xlat_88592w1250 ? IDC_88592WIN1250 : + cfg.xlat_88592cp852 ? IDC_88592CP852 : + cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 : + IDC_NOXLAT); + CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr); + CheckRadioButton (hwnd, IDC_VTXWINDOWS, IDC_VTPOORMAN, + cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS : + cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI : + cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY : + IDC_VTPOORMAN); } -/* - * A set of radio buttons on the same line, with a static above - * them. `nacross' dictates how many parts the line is divided into - * (you might want this not to equal the number of buttons if you - * needed to line up some 2s and some 3s to look good in the same - * panel). - */ -static void radioline(struct ctlpos *cp, - char *text, int id, int nacross, ...) { - RECT r; - va_list ap; - int group; +static void hide(HWND hwnd, int hide, int minid, int maxid) { int i; - - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); - va_start(ap, nacross); - group = WS_GROUP; - i = 0; - while (1) { - char *btext; - int bid; - btext = va_arg(ap, char *); - if (!btext) - break; - bid = va_arg(ap, int); - r.left = GAPBETWEEN + i * (cp->width+GAPBETWEEN)/nacross; - r.right = (i+1) * (cp->width+GAPBETWEEN)/nacross - r.left; - r.top = cp->ypos; r.bottom = RADIOHEIGHT; - doctl(cp, r, "BUTTON", - BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, - 0, - btext, bid); - group = 0; - i++; + for (i = minid; i < maxid; i++) { + HWND ctl = GetDlgItem(hwnd, i); + if (ctl) { + ShowWindow(ctl, hide ? SW_HIDE : SW_SHOW); + } } - va_end(ap); - cp->ypos += r.bottom + GAPBETWEEN; } -/* - * A set of radio buttons on multiple lines, with a static above - * them. - */ -static void radiobig(struct ctlpos *cp, char *text, int id, ...) { - RECT r; - va_list ap; - int group; - - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); - va_start(ap, id); - group = WS_GROUP; - while (1) { - char *btext; - int bid; - btext = va_arg(ap, char *); - if (!btext) - break; - bid = va_arg(ap, int); - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "BUTTON", - BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group, - 0, - btext, bid); - group = 0; - } - va_end(ap); - cp->ypos += GAPBETWEEN - GAPWITHIN; -} +struct treeview_faff { + HWND treeview; + HTREEITEM lastat[4]; +}; -/* - * A single standalone checkbox. - */ -static void checkbox(struct ctlpos *cp, char *text, int id) { - RECT r; - - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = CHECKBOXHEIGHT; - cp->ypos += r.bottom + GAPBETWEEN; - doctl(cp, r, "BUTTON", - BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0, - text, id); +static HTREEITEM treeview_insert(struct treeview_faff *faff, + int level, char *text) { + TVINSERTSTRUCT ins; + int i; + HTREEITEM newitem; + ins.hParent = (level > 0 ? faff->lastat[level-1] : TVI_ROOT); + ins.hInsertAfter = faff->lastat[level]; +#if _WIN32_IE >= 0x0400 && defined NONAMELESSUNION +#define INSITEM DUMMYUNIONNAME.item +#else +#define INSITEM item +#endif + ins.INSITEM.mask = TVIF_TEXT; + ins.INSITEM.pszText = text; + newitem = TreeView_InsertItem(faff->treeview, &ins); + if (level > 0) + TreeView_Expand(faff->treeview, faff->lastat[level-1], TVE_EXPAND); + faff->lastat[level] = newitem; + for (i = level+1; i < 4; i++) faff->lastat[i] = NULL; + return newitem; } /* - * A button on the right hand side, with a static to its left. + * This _huge_ function is the configuration box. */ -static void staticbtn(struct ctlpos *cp, char *stext, int sid, - char *btext, int bid) { - const int height = (PUSHBTNHEIGHT > STATICHEIGHT ? - PUSHBTNHEIGHT : STATICHEIGHT); - RECT r; - int lwid, rwid, rpos; - - rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; - lwid = rpos - 2*GAPBETWEEN; - rwid = cp->width + GAPBETWEEN - rpos; - - r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; - r.right = lwid; r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; - r.right = rwid; r.bottom = PUSHBTNHEIGHT; - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, - btext, bid); - - cp->ypos += height + GAPBETWEEN; -} +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]; + int i; -/* - * An edit control on the right hand side, with a static to its left. - */ -static void staticedit(struct ctlpos *cp, char *stext, int sid, int eid) { - const int height = (EDITHEIGHT > STATICHEIGHT ? - EDITHEIGHT : STATICHEIGHT); - RECT r; - int lwid, rwid, rpos; - - rpos = GAPBETWEEN + (cp->width + GAPBETWEEN) / 2; - lwid = rpos - 2*GAPBETWEEN; - rwid = cp->width + GAPBETWEEN - rpos; - - r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2; - r.right = lwid; r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - r.left = rpos; r.top = cp->ypos + (height-EDITHEIGHT)/2; - r.right = rwid; r.bottom = EDITHEIGHT; - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, - "", eid); - - cp->ypos += height + GAPBETWEEN; -} + switch (msg) { + case WM_INITDIALOG: + readytogo = 0; + SetWindowLong(hwnd, GWL_USERDATA, 0); + /* + * Centre the window. + */ + { /* centre the window */ + RECT rs, rd; -/* - * A tab-control substitute when a real tab control is unavailable. - */ -static void ersatztab(struct ctlpos *cp, char *stext, int sid, - int lid, int s2id) { - const int height = (COMBOHEIGHT > STATICHEIGHT ? - COMBOHEIGHT : STATICHEIGHT); - RECT r; - int bigwid, lwid, rwid, rpos; - static const int BIGGAP = 15; - static const int MEDGAP = 3; - - bigwid = cp->width + 2*GAPBETWEEN - 2*BIGGAP; - cp->ypos += MEDGAP; - rpos = BIGGAP + (bigwid + BIGGAP) / 2; - lwid = rpos - 2*BIGGAP; - rwid = bigwid + BIGGAP - rpos; - - r.left = BIGGAP; r.top = cp->ypos + (height-STATICHEIGHT)/2; - r.right = lwid; r.bottom = STATICHEIGHT; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - r.left = rpos; r.top = cp->ypos + (height-COMBOHEIGHT)/2; - r.right = rwid; r.bottom = COMBOHEIGHT*10; - doctl(cp, r, "COMBOBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | - CBS_DROPDOWNLIST | CBS_HASSTRINGS, - WS_EX_CLIENTEDGE, - "", lid); - - cp->ypos += height + MEDGAP + GAPBETWEEN; - - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = 2; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ, - 0, "", s2id); -} + 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); + } -/* - * A static line, followed by an edit control on the left hand side - * and a button on the right. - */ -static void editbutton(struct ctlpos *cp, char *stext, int sid, - int eid, char *btext, int bid) { - const int height = (EDITHEIGHT > PUSHBTNHEIGHT ? - EDITHEIGHT : PUSHBTNHEIGHT); - RECT r; - int lwid, rwid, rpos; - - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; - lwid = rpos - 2*GAPBETWEEN; - rwid = cp->width + GAPBETWEEN - rpos; - - r.left = GAPBETWEEN; r.top = cp->ypos + (height-EDITHEIGHT)/2; - r.right = lwid; r.bottom = EDITHEIGHT; - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, - "", eid); - - r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2; - r.right = rwid; r.bottom = PUSHBTNHEIGHT; - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, - btext, bid); - - cp->ypos += height + GAPBETWEEN; -} + /* + * Create the tree view. + */ + { + RECT r; + WPARAM font; + HWND tvstatic; -/* - * Special control which was hard to describe generically: the - * session-saver assembly. A static; below that an edit box; below - * that a list box. To the right of the list box, a column of - * buttons. - */ -static void sesssaver(struct ctlpos *cp, char *text, - int staticid, int editid, int listid, ...) { - RECT r; - va_list ap; - int lwid, rwid, rpos; - int y; - const int LISTDEFHEIGHT = 66; - - rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4; - lwid = rpos - 2*GAPBETWEEN; - rwid = cp->width + GAPBETWEEN - rpos; - - /* The static control. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = lwid; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid); - - /* The edit control. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = lwid; r.bottom = EDITHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, - "", editid); + 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 + 196; + 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)); + } - /* - * The buttons (we should hold off on the list box until we - * know how big the buttons are). - */ - va_start(ap, listid); - y = cp->ypos; - while (1) { - char *btext = va_arg(ap, char *); - int bid; - if (!btext) break; - bid = va_arg(ap, int); - r.left = rpos; r.top = y; - r.right = rwid; r.bottom = PUSHBTNHEIGHT; - y += r.bottom + GAPWITHIN; - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, - btext, bid); - } + /* + * Create the various panelfuls of controls. + */ - /* Compute list box height. LISTDEFHEIGHT, or height of buttons. */ - y -= cp->ypos; - y -= GAPWITHIN; - if (y < LISTDEFHEIGHT) y = LISTDEFHEIGHT; - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = lwid; r.bottom = y; - cp->ypos += y + GAPBETWEEN; - doctl(cp, r, "LISTBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | - LBS_STANDARD | LBS_HASSTRINGS, - WS_EX_CLIENTEDGE, - "", listid); -} + /* The Session panel. Accelerators used: [acgo] nprthelsdx */ + { + struct ctlpos cp; + ctlposinit(&cp, hwnd, 80, 3, 13); + bartitle(&cp, "Basic options for your PuTTY session", + IDC_TITLE_SESSION); + if (dlgtype == 0) { + beginbox(&cp, "Specify your connection by host name", + IDC_BOX_SESSION1, IDC_BOXT_SESSION1); + multiedit(&cp, + "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75, + "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL); + if (backends[2].backend == NULL) { + /* this is PuTTYtel, so only two protocols available */ + radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3, + "&Raw", IDC_PROTRAW, + "&Telnet", IDC_PROTTELNET, NULL); + } else { + radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3, + "&Raw", IDC_PROTRAW, + "&Telnet", IDC_PROTTELNET, +#ifdef FWHACK + "SS&H/hack", +#else + "SS&H", +#endif + IDC_PROTSSH, NULL); + } + endbox(&cp); + beginbox(&cp, "Load, save or delete a stored session", + IDC_BOX_SESSION2, IDC_BOXT_SESSION2); + sesssaver(&cp, "Sav&ed Sessions", + IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, + "&Load", IDC_SESSLOAD, + "&Save", IDC_SESSSAVE, + "&Delete", IDC_SESSDEL, NULL); + endbox(&cp); + } + beginbox(&cp, NULL, IDC_BOX_SESSION3, 0); + checkbox(&cp, "Close Window on E&xit", IDC_CLOSEEXIT); + endbox(&cp); -/* - * Another special control: the environment-variable setter. A - * static line first; then a pair of edit boxes with associated - * statics, and two buttons; then a list box. - */ -static void envsetter(struct ctlpos *cp, char *stext, int sid, - char *e1stext, int e1sid, int e1id, - char *e2stext, int e2sid, int e2id, - int listid, - char *b1text, int b1id, char *b2text, int b2id) { - RECT r; - const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? - STATICHEIGHT : - EDITHEIGHT > PUSHBTNHEIGHT ? - EDITHEIGHT : PUSHBTNHEIGHT); - const static int percents[] = { 20, 35, 10, 25 }; - int i, j, xpos, percent; - const int LISTHEIGHT = 42; - - /* The static control. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - /* The statics+edits+buttons. */ - for (j = 0; j < 2; j++) { - percent = 10; - for (i = 0; i < 4; i++) { - xpos = (cp->width + GAPBETWEEN) * percent / 100; - r.left = xpos + GAPBETWEEN; - percent += percents[i]; - xpos = (cp->width + GAPBETWEEN) * percent / 100; - r.right = xpos - r.left; - r.top = cp->ypos; - r.bottom = (i==0 ? STATICHEIGHT : - i==1 ? EDITHEIGHT : - PUSHBTNHEIGHT); - r.top += (height-r.bottom)/2; - if (i==0) { - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, - j==0 ? e1stext : e2stext, j==0 ? e1sid : e2sid); - } else if (i==1) { - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, - "", j==0 ? e1id : e2id); - } else if (i==3) { - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, - j==0 ? b1text : b2text, j==0 ? b1id : b2id); - } - } - cp->ypos += height + GAPWITHIN; - } + hsession = treeview_insert(&tvfaff, 0, "Session"); + } - /* The list box. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = LISTHEIGHT; - cp->ypos += r.bottom + GAPBETWEEN; - doctl(cp, r, "LISTBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | - LBS_USETABSTOPS, - WS_EX_CLIENTEDGE, - "", listid); -} + /* The Terminal panel. Accelerators used: [acgo] rmkh&dlbenu */ + { + struct ctlpos cp; + ctlposinit(&cp, hwnd, 80, 3, 13); + bartitle(&cp, "Options controlling the terminal emulation", + IDC_TITLE_TERMINAL); + beginbox(&cp, "Set the size of the terminal window", + IDC_BOX_TERMINAL1, IDC_BOXT_TERMINAL1); + multiedit(&cp, + "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 50, + "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 50, + NULL); + checkbox(&cp, "Loc&k window size against resizing", IDC_LOCKSIZE); + endbox(&cp); + beginbox(&cp, "Set the font used in the terminal window", + IDC_BOX_TERMINAL2, IDC_BOXT_TERMINAL2); + staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); + endbox(&cp); + beginbox(&cp, "Set various terminal options", + IDC_BOX_TERMINAL3, IDC_BOXT_TERMINAL3); + checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); + checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); + checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); + checkbox(&cp, "&Beep enabled", IDC_BEEP); + checkbox(&cp, "Use background colour to &erase screen", IDC_BCE); + checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); + checkbox(&cp, "&Use local terminal line discipline", IDC_LDISCTERM); + endbox(&cp); + + treeview_insert(&tvfaff, 0, "Terminal"); + } -/* - * Yet another special control: the character-class setter. A - * static, then a list, then a line containing a - * button-and-static-and-edit. - */ -static void charclass(struct ctlpos *cp, char *stext, int sid, int listid, - char *btext, int bid, int eid, char *s2text, int s2id) { - RECT r; - const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ? - STATICHEIGHT : - EDITHEIGHT > PUSHBTNHEIGHT ? - EDITHEIGHT : PUSHBTNHEIGHT); - const static int percents[] = { 30, 40, 30 }; - int i, xpos, percent; - const int LISTHEIGHT = 66; - - /* The static control. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - /* The list box. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = LISTHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "LISTBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | - LBS_USETABSTOPS, - WS_EX_CLIENTEDGE, - "", listid); - - /* The button+static+edit. */ - percent = xpos = 0; - for (i = 0; i < 3; i++) { - r.left = xpos + GAPBETWEEN; - percent += percents[i]; - xpos = (cp->width + GAPBETWEEN) * percent / 100; - r.right = xpos - r.left; - r.top = cp->ypos; - r.bottom = (i==0 ? PUSHBTNHEIGHT : - i==1 ? STATICHEIGHT : - EDITHEIGHT); - r.top += (height-r.bottom)/2; - if (i==0) { - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, btext, bid); - } else if (i==1) { - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_CENTER, - 0, s2text, s2id); - } else if (i==2) { - doctl(cp, r, "EDIT", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, - WS_EX_CLIENTEDGE, "", eid); - } - } - cp->ypos += height + GAPBETWEEN; -} + /* The Keyboard panel. Accelerators used: [acgo] h?srvlxvnpmiet */ + { + 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, IDC_BOXT_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, 4, + "ESC[n&~", IDC_FUNCTILDE, + "&Linux", IDC_FUNCLINUX, + "&Xterm R6", IDC_FUNCXTERM, + "&VT400", IDC_FUNCVT400, NULL); + endbox(&cp); + beginbox(&cp, "Change the initial state of:", + IDC_BOX_KEYBOARD2, IDC_BOXT_KEYBOARD2); + radioline(&cp, "Initial state of cursor keys:", IDC_CURSTATIC, 2, + "&Normal", IDC_CURNORMAL, + "A&pplication", IDC_CURAPPLIC, NULL); + radioline(&cp, "Initial state of numeric keypad:", IDC_KPSTATIC, 3, + "Nor&mal", IDC_KPNORMAL, + "Appl&ication", IDC_KPAPPLIC, + "N&etHack", IDC_KPNH, NULL); + endbox(&cp); + beginbox(&cp, "Enable extra keyboard features:", + IDC_BOX_KEYBOARD3, IDC_BOXT_KEYBOARD3); + checkbox(&cp, "Application and AltGr ac&t as Compose key", + IDC_COMPOSEKEY); + endbox(&cp); + + treeview_insert(&tvfaff, 1, "Keyboard"); + } -/* - * A special control (horrors!). The colour editor. A static line; - * then on the left, a list box, and on the right, a sequence of - * two-part statics followed by a button. - */ -static void colouredit(struct ctlpos *cp, char *stext, int sid, int listid, - char *btext, int bid, ...) { - RECT r; - int y; - va_list ap; - int lwid, rwid, rpos; - const int LISTHEIGHT = 66; - - /* The static control. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = cp->width; r.bottom = STATICHEIGHT; - cp->ypos += r.bottom + GAPWITHIN; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid); - - rpos = GAPBETWEEN + 2 * (cp->width + GAPBETWEEN) / 3; - lwid = rpos - 2*GAPBETWEEN; - rwid = cp->width + GAPBETWEEN - rpos; - - /* The list box. */ - r.left = GAPBETWEEN; r.top = cp->ypos; - r.right = lwid; r.bottom = LISTHEIGHT; - doctl(cp, r, "LISTBOX", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS | - LBS_USETABSTOPS, - WS_EX_CLIENTEDGE, - "", listid); - - /* The statics. */ - y = cp->ypos; - va_start(ap, bid); - while (1) { - char *ltext; - int lid, rid; - ltext = va_arg(ap, char *); - if (!ltext) break; - lid = va_arg(ap, int); - rid = va_arg(ap, int); - r.top = y; r.bottom = STATICHEIGHT; - y += r.bottom + GAPWITHIN; - r.left = rpos; r.right = rwid/2; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, ltext, lid); - r.left = rpos + r.right; r.right = rwid - r.right; - doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_RIGHT, 0, "", rid); - } - va_end(ap); + /* The Window panel. Accelerators used: [acgo] tibsdkw4ylp */ + { + struct ctlpos cp; + ctlposinit(&cp, hwnd, 80, 3, 13); + bartitle(&cp, "Options controlling PuTTY's window", + IDC_TITLE_WINDOW); + beginbox(&cp, "Adjust the use of the window title", + IDC_BOX_WINDOW1, IDC_BOXT_WINDOW1); + if (dlgtype == 0) + multiedit(&cp, + "Initial 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 cursor", + IDC_BOX_WINDOW2, IDC_BOXT_WINDOW2); + checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR); + endbox(&cp); + beginbox(&cp, "Control the scrollback in the window", + IDC_BOX_WINDOW3, IDC_BOXT_WINDOW3); + staticedit(&cp, "Lines of &scrollback", + IDC_SAVESTATIC, IDC_SAVEEDIT, 50); + checkbox(&cp, "&Display scrollbar", IDC_SCROLLBAR); + checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); + checkbox(&cp, "Reset scrollback on dis&play activity", + IDC_SCROLLDISP); + endbox(&cp); + beginbox(&cp, NULL, IDC_BOX_WINDOW4, 0); + 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); + endbox(&cp); + + treeview_insert(&tvfaff, 0, "Window"); + } - /* The button. */ - r.top = y + 2*GAPWITHIN; r.bottom = PUSHBTNHEIGHT; - r.left = rpos; r.right = rwid; - doctl(cp, r, "BUTTON", - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON, - 0, btext, bid); + /* The Translation panel. Accelerators used: [acgo] xbepnkis */ + { + struct ctlpos cp; + ctlposinit(&cp, hwnd, 80, 3, 13); + bartitle(&cp, "Options controlling character set translation", + IDC_TITLE_TRANSLATION); + beginbox(&cp, "Adjust how PuTTY displays line drawing characters", + IDC_BOX_TRANSLATION1, IDC_BOXT_TRANSLATION1); + 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, NULL); + endbox(&cp); + beginbox(&cp, "Enable character set translation on received data", + IDC_BOX_TRANSLATION2, IDC_BOXT_TRANSLATION2); + radiobig(&cp, + "Character set translation:", IDC_XLATSTATIC, + "&None", IDC_NOXLAT, + "&KOI8 / Win-1251", IDC_KOI8WIN1251, + "&ISO-8859-2 / Win-1250", IDC_88592WIN1250, + "&ISO-8859-2 / CP852", IDC_88592CP852, NULL); + endbox(&cp); + beginbox(&cp, "Enable character set translation on input data", + IDC_BOX_TRANSLATION3, IDC_BOXT_TRANSLATION3); + checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", + IDC_CAPSLOCKCYR); + endbox(&cp); + + treeview_insert(&tvfaff, 1, "Translation"); + } - cp->ypos += LISTHEIGHT + GAPBETWEEN; -} + /* The Selection panel. Accelerators used: [acgo] wxst */ + { + struct ctlpos cp; + ctlposinit(&cp, hwnd, 80, 3, 13); + bartitle(&cp, "Options controlling copy and paste", + IDC_TITLE_SELECTION); + beginbox(&cp, "Control which mouse button does which thing", + IDC_BOX_SELECTION1, IDC_BOXT_SELECTION1); + radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC, + "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS, + "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, + NULL); + endbox(&cp); + beginbox(&cp, "Control the select-one-word-at-a-time mode", + IDC_BOX_SELECTION2, IDC_BOXT_SELECTION2); + charclass(&cp, "Character classes:", IDC_CCSTATIC, IDC_CCLIST, + "&Set", IDC_CCSET, IDC_CCEDIT, + "&to class", IDC_CCSTATIC2); + endbox(&cp); + + treeview_insert(&tvfaff, 1, "Selection"); + } -static int GeneralPanelProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - switch (msg) { - case WM_SETFONT: + /* The Colours panel. Accelerators used: [acgo] 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, IDC_BOXT_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, IDC_BOXT_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); + + treeview_insert(&tvfaff, 1, "Colours"); + } + + /* The Connection panel. Accelerators used: [acgo] tuk */ { - HFONT hfont = (HFONT)wParam; - HFONT oldfont; - HDC hdc; - TEXTMETRIC tm; - LONG units; - - hdc = GetDC(hwnd); - oldfont = SelectObject(hdc, hfont); - GetTextMetrics(hdc, &tm); - units = (tm.tmHeight << 16) | tm.tmAveCharWidth; - SelectObject(hdc, oldfont); - DeleteDC(hdc); - SetWindowLong(hwnd, GWL_USERDATA, units); - SetWindowLong(hwnd, DWL_USER, wParam); + 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, IDC_BOXT_CONNECTION1); + staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT, 50); + staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT, 50); + endbox(&cp); + } + beginbox(&cp, "Sending of null packets to keep session active", + IDC_BOX_CONNECTION2, IDC_BOXT_CONNECTION2); + staticedit(&cp, "Minutes between &keepalives (0 to turn off)", + IDC_PINGSTATIC, IDC_PINGEDIT, 25); + endbox(&cp); + + treeview_insert(&tvfaff, 0, "Connection"); } - return 0; - case WM_INITDIALOG: - SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - return 1; - case WM_CLOSE: - DestroyWindow (hwnd); - return 1; - } - return 0; -} -static char savedsession[2048]; + /* The Telnet panel. Accelerators used: [acgo] svldrbf */ + { + 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, IDC_BOXT_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, IDC_BOXT_TELNET2); + radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC_EMSTATIC, 2, + "&BSD (commonplace)", IDC_EMBSD, + "R&FC 1408 (unusual)", IDC_EMRFC, NULL); + endbox(&cp); + + treeview_insert(&tvfaff, 1, "Telnet"); + } + } -static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - int i; - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_HOSTSTATIC, - IDC_HOST, - IDC_PORTSTATIC, - IDC_PORT, - IDC_PROTSTATIC, - IDC_PROTRAW, - IDC_PROTTELNET, - IDC_PROTSSH, - IDC_SESSSTATIC, - IDC_SESSEDIT, - IDC_SESSLIST, - IDC_SESSLOAD, - IDC_SESSSAVE, - IDC_SESSDEL, - IDC_CLOSEEXIT, - IDC_CLOSEWARN - }; + /* The SSH panel. Accelerators used: [acgo] rmakwp123bd */ + if (backends[2].backend != NULL) { + 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, IDC_BOXT_SSH1); + multiedit(&cp, + "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100, + NULL); + endbox(&cp); + beginbox(&cp, "Authentication options", + IDC_BOX_SSH2, IDC_BOXT_SSH2); + checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", + IDC_AUTHTIS); + checkbox(&cp, "Allow &agent forwarding", IDC_AGENTFWD); + editbutton(&cp, "Private &key file for authentication:", + IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); + endbox(&cp); + beginbox(&cp, "Protocol options", + IDC_BOX_SSH3, IDC_BOXT_SSH3); + checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY); + radioline(&cp, "Preferred SSH protocol version:", + IDC_SSHPROTSTATIC, 2, + "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL); + radioline(&cp, "Preferred encryption algorithm:", IDC_CIPHERSTATIC, 3, + "&3DES", IDC_CIPHER3DES, + "&Blowfish", IDC_CIPHERBLOWF, + "&DES", IDC_CIPHERDES, NULL); + checkbox(&cp, "Imitate SSH 2 MAC bug in commercial <= v2.3.x", + IDC_BUGGYMAC); + endbox(&cp); + + treeview_insert(&tvfaff, 1, "SSH"); + } + } - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] dehlnprstwx */ - ctlposinit(&cp, hwnd); - multiedit(&cp, - "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75, - "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL); - radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3, - "&Raw", IDC_PROTRAW, - "&Telnet", IDC_PROTTELNET, -#ifdef FWHACK - "SS&H/hack", -#else - "SS&H", -#endif - IDC_PROTSSH, NULL); - sesssaver(&cp, "Stor&ed Sessions", - IDC_SESSSTATIC, IDC_SESSEDIT, IDC_SESSLIST, - "&Load", IDC_SESSLOAD, - "&Save", IDC_SESSSAVE, - "&Delete", IDC_SESSDEL, NULL); - checkbox(&cp, "Close Window on E&xit", IDC_CLOSEEXIT); - checkbox(&cp, "&Warn on Close", IDC_CLOSEWARN); - - SetDlgItemText (hwnd, IDC_HOST, cfg.host); - SetDlgItemText (hwnd, IDC_SESSEDIT, savedsession); - SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE); - for (i = 0; i < nsessions; i++) - SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING, - 0, (LPARAM) (sessions[i])); - CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH, - cfg.protocol==PROT_SSH ? IDC_PROTSSH : - cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW ); - CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); - CheckDlgButton (hwnd, IDC_CLOSEWARN, cfg.warn_on_close); - break; + init_dlg_ctrls(hwnd); + for (i = 0; i < nsessions; i++) + SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING, + 0, (LPARAM) (sessions[i])); + + /* + * Hide all the controls to start with. + */ + hide(hwnd, TRUE, controlstartvalue, controlendvalue); + + /* + * Put the treeview selection on to the Session panel. This + * should also cause unhiding 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); + return 0; case WM_LBUTTONUP: /* * Button release should trigger WM_OK if there was a @@ -1127,10 +996,59 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, */ ReleaseCapture(); if (readytogo) - SendMessage (GetParent(hwnd), WM_COMMAND, IDOK, 0); + 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; + char buffer[64]; + item.hItem = i; + item.pszText = buffer; + item.cchTextMax = sizeof(buffer); + item.mask = TVIF_TEXT; + TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &item); + hide(hwnd, TRUE, controlstartvalue, controlendvalue); + if (!strcmp(buffer, "Session")) + hide(hwnd, FALSE, sessionpanelstart, sessionpanelend); + if (!strcmp(buffer, "Keyboard")) + hide(hwnd, FALSE, keyboardpanelstart, keyboardpanelend); + if (!strcmp(buffer, "Terminal")) + hide(hwnd, FALSE, terminalpanelstart, terminalpanelend); + if (!strcmp(buffer, "Window")) + hide(hwnd, FALSE, windowpanelstart, windowpanelend); + if (!strcmp(buffer, "Connection")) + hide(hwnd, FALSE, connectionpanelstart, connectionpanelend); + if (!strcmp(buffer, "Telnet")) + hide(hwnd, FALSE, telnetpanelstart, telnetpanelend); + if (!strcmp(buffer, "SSH")) + hide(hwnd, FALSE, sshpanelstart, sshpanelend); + if (!strcmp(buffer, "Selection")) + hide(hwnd, FALSE, selectionpanelstart, selectionpanelend); + if (!strcmp(buffer, "Colours")) + hide(hwnd, FALSE, colourspanelstart, colourspanelend); + if (!strcmp(buffer, "Translation")) + hide(hwnd, FALSE, translationpanelstart, translationpanelend); + + SetFocus (((LPNMHDR)lParam)->hwndFrom); /* ensure focus stays */ + return 0; + } + break; case WM_COMMAND: - switch (LOWORD(wParam)) { + /* + * Only process WM_COMMAND once the dialog is fully formed. + */ + if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) { + case IDOK: + if (*cfg.host) + EndDialog (hwnd, 1); + else + MessageBeep (0); + return 0; + case IDCANCEL: + EndDialog (hwnd, 0); + return 0; case IDC_PROTTELNET: case IDC_PROTSSH: case IDC_PROTRAW: @@ -1155,16 +1073,6 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, if (HIWORD(wParam) == EN_CHANGE) MyGetDlgItemInt (hwnd, IDC_PORT, &cfg.port); break; - case IDC_CLOSEEXIT: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC_CLOSEEXIT); - break; - case IDC_CLOSEWARN: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.warn_on_close = IsDlgButtonChecked (hwnd, IDC_CLOSEWARN); - break; case IDC_SESSEDIT: if (HIWORD(wParam) == EN_CHANGE) { SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, @@ -1191,7 +1099,7 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, } strcpy (str, sessions[n]); } - save_settings (str, !!strcmp(str, "Default Settings")); + save_settings (str, !!strcmp(str, "Default Settings"), &cfg); get_sesslist (FALSE); get_sesslist (TRUE); SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_RESETCONTENT, @@ -1215,21 +1123,16 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, { int n = SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_GETCURSEL, 0, 0); + int isdef; if (n == LB_ERR) { MessageBeep(0); break; } - load_settings (sessions[n], - !!strcmp(sessions[n], "Default Settings")); - SetDlgItemText (hwnd, IDC_HOST, cfg.host); - SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE); - CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH, - (cfg.protocol==PROT_SSH ? IDC_PROTSSH : - cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW)); - CheckDlgButton (hwnd, IDC_CLOSEEXIT, cfg.close_on_exit); - CheckDlgButton (hwnd, IDC_CLOSEWARN, cfg.warn_on_close); - SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, - (WPARAM) -1, 0); + isdef = !strcmp(sessions[n], "Default Settings"); + load_settings (sessions[n], !isdef, &cfg); + init_dlg_ctrls(hwnd); + if (!isdef) + SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]); } if (LOWORD(wParam) == IDC_SESSLIST) { /* @@ -1264,207 +1167,94 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) -1, 0); } - } - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_DELSTATIC, - IDC_DEL008, - IDC_DEL127, - IDC_HOMESTATIC, - IDC_HOMETILDE, - IDC_HOMERXVT, - IDC_FUNCSTATIC, - IDC_FUNCTILDE, - IDC_FUNCLINUX, - IDC_FUNCXTERM, - IDC_KPSTATIC, - IDC_KPNORMAL, - IDC_KPAPPLIC, - IDC_KPNH, - IDC_CURSTATIC, - IDC_CURNORMAL, - IDC_CURAPPLIC, - IDC_ALTF4, - IDC_ALTSPACE, - IDC_LDISCTERM, - IDC_SCROLLKEY - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] 4?ehiklmnprsuvxy */ - ctlposinit(&cp, hwnd); - radioline(&cp, "Action of Backspace:", IDC_DELSTATIC, 2, - "Control-&H", IDC_DEL008, - "Control-&? (127)", IDC_DEL127, NULL); - radioline(&cp, "Action of Home and End:", IDC_HOMESTATIC, 2, - "&Standard", IDC_HOMETILDE, - "&rxvt", IDC_HOMERXVT, NULL); - radioline(&cp, "Function key and keypad layout:", IDC_FUNCSTATIC, 3, - "&VT400", IDC_FUNCTILDE, - "&Linux", IDC_FUNCLINUX, - "&Xterm R6", IDC_FUNCXTERM, NULL); - radioline(&cp, "Initial state of cursor keys:", IDC_CURSTATIC, 2, - "&Normal", IDC_CURNORMAL, - "A&pplication", IDC_CURAPPLIC, NULL); - radioline(&cp, "Initial state of numeric keypad:", IDC_KPSTATIC, 3, - "Nor&mal", IDC_KPNORMAL, - "Appl&ication", IDC_KPAPPLIC, - "N&etHack", IDC_KPNH, NULL); - checkbox(&cp, "ALT-F&4 is special (closes window)", IDC_ALTF4); - checkbox(&cp, "ALT-Space is special (S&ystem menu)", IDC_ALTSPACE); - checkbox(&cp, "&Use local terminal line discipline", IDC_LDISCTERM); - checkbox(&cp, "Reset scrollback on &keypress", IDC_SCROLLKEY); - - CheckRadioButton (hwnd, IDC_DEL008, IDC_DEL127, - cfg.bksp_is_delete ? IDC_DEL127 : IDC_DEL008); - CheckRadioButton (hwnd, IDC_HOMETILDE, IDC_HOMERXVT, - cfg.rxvt_homeend ? IDC_HOMERXVT : IDC_HOMETILDE); - CheckRadioButton (hwnd, IDC_FUNCTILDE, IDC_FUNCXTERM, - cfg.funky_type ? - (cfg.funky_type==2 ? IDC_FUNCXTERM - : IDC_FUNCLINUX ) - : IDC_FUNCTILDE); - CheckRadioButton (hwnd, IDC_CURNORMAL, IDC_CURAPPLIC, - cfg.app_cursor ? IDC_CURAPPLIC : IDC_CURNORMAL); - CheckRadioButton (hwnd, IDC_KPNORMAL, IDC_KPNH, - cfg.nethack_keypad ? IDC_KPNH : - cfg.app_keypad ? IDC_KPAPPLIC : IDC_KPNORMAL); - CheckDlgButton (hwnd, IDC_ALTF4, cfg.alt_f4); - CheckDlgButton (hwnd, IDC_ALTSPACE, cfg.alt_space); - CheckDlgButton (hwnd, IDC_LDISCTERM, cfg.ldisc_term); - CheckDlgButton (hwnd, IDC_SCROLLKEY, cfg.scroll_on_key); - break; - case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - switch (LOWORD(wParam)) { - case IDC_DEL008: - case IDC_DEL127: + case IDC_PINGEDIT: + if (HIWORD(wParam) == EN_CHANGE) + MyGetDlgItemInt (hwnd, IDC_PINGEDIT, &cfg.ping_interval); + 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: + 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_FUNCXTERM: + break; + case IDC_FUNCXTERM: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) cfg.funky_type = 2; - break; - case IDC_FUNCTILDE: - case IDC_FUNCLINUX: + break; + case IDC_FUNCVT400: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.funky_type = 3; + break; + case IDC_FUNCTILDE: + case IDC_FUNCLINUX: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) cfg.funky_type = IsDlgButtonChecked (hwnd, IDC_FUNCLINUX); - break; - case IDC_KPNORMAL: - case IDC_KPAPPLIC: + 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: + } + 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: - cfg.app_cursor = IsDlgButtonChecked (hwnd, IDC_CURAPPLIC); - 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_LDISCTERM: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.ldisc_term = IsDlgButtonChecked (hwnd, IDC_LDISCTERM); - break; - case IDC_SCROLLKEY: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.scroll_on_key = IsDlgButtonChecked (hwnd, IDC_SCROLLKEY); - break; } - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static void fmtfont (char *buf) { - sprintf (buf, "Font: %s, ", cfg.font); - if (cfg.fontisbold) - strcat(buf, "bold, "); - if (cfg.fontheight == 0) - strcat (buf, "default height"); - else - sprintf (buf+strlen(buf), "%d-%s", - (cfg.fontheight < 0 ? -cfg.fontheight : cfg.fontheight), - (cfg.fontheight < 0 ? "pixel" : "point")); -} - -static int CALLBACK TerminalProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - CHOOSEFONT cf; - LOGFONT lf; - char fontstatic[256]; - enum { controlstartvalue = 1000, - IDC_WRAPMODE, - IDC_DECOM, - IDC_DIMSTATIC, - IDC_ROWSSTATIC, - IDC_ROWSEDIT, - IDC_COLSSTATIC, - IDC_COLSEDIT, - IDC_SAVESTATIC, - IDC_SAVEEDIT, - IDC_FONTSTATIC, - IDC_CHOOSEFONT, - IDC_LFHASCR, - IDC_BEEP, - IDC_BCE, - IDC_BLINKTEXT - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] dghlmnprsw */ - ctlposinit(&cp, hwnd); - multiedit(&cp, - "&Rows", IDC_ROWSSTATIC, IDC_ROWSEDIT, 33, - "Colu&mns", IDC_COLSSTATIC, IDC_COLSEDIT, 33, - "&Scrollback", IDC_SAVESTATIC, IDC_SAVEEDIT, 33, - NULL); - staticbtn(&cp, "", IDC_FONTSTATIC, "C&hange...", IDC_CHOOSEFONT); - checkbox(&cp, "Auto &wrap mode initially on", IDC_WRAPMODE); - checkbox(&cp, "&DEC Origin Mode initially on", IDC_DECOM); - checkbox(&cp, "Implicit CR in every &LF", IDC_LFHASCR); - checkbox(&cp, "Bee&p enabled", IDC_BEEP); - checkbox(&cp, "Use Back&ground colour erase", IDC_BCE); - checkbox(&cp, "Enable bli&nking text", IDC_BLINKTEXT); - - CheckDlgButton (hwnd, IDC_WRAPMODE, cfg.wrap_mode); - CheckDlgButton (hwnd, IDC_DECOM, cfg.dec_om); - CheckDlgButton (hwnd, IDC_LFHASCR, cfg.lfhascr); - SetDlgItemInt (hwnd, IDC_ROWSEDIT, cfg.height, FALSE); - SetDlgItemInt (hwnd, IDC_COLSEDIT, cfg.width, FALSE); - SetDlgItemInt (hwnd, IDC_SAVEEDIT, cfg.savelines, FALSE); - fmtfont (fontstatic); - SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic); - CheckDlgButton (hwnd, IDC_BEEP, cfg.beep); - CheckDlgButton (hwnd, IDC_BCE, cfg.bce); - CheckDlgButton (hwnd, IDC_BLINKTEXT, cfg.blinktext); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { + 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_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_LDISCTERM: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.ldisc_term = IsDlgButtonChecked (hwnd, IDC_LDISCTERM); + 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_WRAPMODE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) @@ -1521,59 +1311,21 @@ static int CALLBACK TerminalProc (HWND hwnd, UINT msg, SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic); } break; - case IDC_BEEP: - if (HIWORD(wParam) == BN_CLICKED || - HIWORD(wParam) == BN_DOUBLECLICKED) - cfg.beep = IsDlgButtonChecked (hwnd, IDC_BEEP); - 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; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK WindowProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_WINNAME, - IDC_BLINKCUR, - IDC_SCROLLBAR, - IDC_LOCKSIZE, - IDC_WINTITLE, - IDC_WINEDIT - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] bikty */ - ctlposinit(&cp, hwnd); - multiedit(&cp, - "Initial window &title:", IDC_WINTITLE, IDC_WINEDIT, 100, - NULL); - checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME); - checkbox(&cp, "&Blinking cursor", IDC_BLINKCUR); - checkbox(&cp, "Displa&y scrollbar", IDC_SCROLLBAR); - checkbox(&cp, "Loc&k Window size", IDC_LOCKSIZE); - - SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle); - CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always); - CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur); - CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar); - CheckDlgButton (hwnd, IDC_LOCKSIZE, cfg.locksize); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { + case IDC_BEEP: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.beep = IsDlgButtonChecked (hwnd, IDC_BEEP); + 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) @@ -1599,68 +1351,16 @@ static int CALLBACK WindowProc (HWND hwnd, UINT msg, GetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle, sizeof(cfg.wintitle)-1); break; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK TelnetProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - int i; - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_TTSTATIC, - IDC_TTEDIT, - IDC_TSSTATIC, - IDC_TSEDIT, - IDC_LOGSTATIC, - IDC_LOGEDIT, - IDC_ENVSTATIC, - IDC_VARSTATIC, - IDC_VAREDIT, - IDC_VALSTATIC, - IDC_VALEDIT, - IDC_ENVLIST, - IDC_ENVADD, - IDC_ENVREMOVE, - IDC_EMSTATIC, - IDC_EMBSD, - IDC_EMRFC - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] bdflrstuv */ - ctlposinit(&cp, hwnd); - staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT); - staticedit(&cp, "Terminal-&speed string", IDC_TSSTATIC, IDC_TSEDIT); - staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT); - 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); - radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC_EMSTATIC, 2, - "&BSD (commonplace)", IDC_EMBSD, - "R&FC 1408 (unusual)", IDC_EMRFC, NULL); - - SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); - SetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed); - SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); - { - char *p = cfg.environmt; - while (*p) { - SendDlgItemMessage (hwnd, IDC_ENVLIST, LB_ADDSTRING, 0, - (LPARAM) p); - p += strlen(p)+1; - } - } - CheckRadioButton (hwnd, IDC_EMBSD, IDC_EMRFC, - cfg.rfc_environ ? IDC_EMRFC : IDC_EMBSD); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { + case IDC_CLOSEEXIT: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC_CLOSEEXIT); + 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, @@ -1749,93 +1449,16 @@ static int CALLBACK TelnetProc (HWND hwnd, UINT msg, disaster:; } break; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK SshProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - OPENFILENAME of; - char filename[sizeof(cfg.keyfile)]; - enum { controlstartvalue = 1000, - IDC_TTSTATIC, - IDC_TTEDIT, - IDC_LOGSTATIC, - IDC_LOGEDIT, - IDC_NOPTY, - IDC_CIPHERSTATIC, - IDC_CIPHER3DES, - IDC_CIPHERBLOWF, - IDC_CIPHERDES, - IDC_AUTHTIS, - IDC_PKSTATIC, - IDC_PKEDIT, - IDC_PKBUTTON, - IDC_SSHPROTSTATIC, - IDC_SSHPROT1, - IDC_SSHPROT2, - IDC_AGENTFWD, - IDC_CMDSTATIC, - IDC_CMDEDIT - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] 123abdkmprtuw */ - ctlposinit(&cp, hwnd); - staticedit(&cp, "Terminal-&type string", IDC_TTSTATIC, IDC_TTEDIT); - staticedit(&cp, "Auto-login &username", IDC_LOGSTATIC, IDC_LOGEDIT); - multiedit(&cp, - "&Remote command:", IDC_CMDSTATIC, IDC_CMDEDIT, 100, - NULL); - checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY); - checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication", - IDC_AUTHTIS); - checkbox(&cp, "Allow &agent forwarding", IDC_AGENTFWD); - editbutton(&cp, "Private &key file for authentication:", - IDC_PKSTATIC, IDC_PKEDIT, "Bro&wse...", IDC_PKBUTTON); - radioline(&cp, "Preferred SSH protocol version:", - IDC_SSHPROTSTATIC, 2, - "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL); - radioline(&cp, "Preferred encryption algorithm:", IDC_CIPHERSTATIC, 3, - "&3DES", IDC_CIPHER3DES, - "&Blowfish", IDC_CIPHERBLOWF, - "&DES", IDC_CIPHERDES, NULL); - - SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype); - SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username); - CheckDlgButton (hwnd, IDC_NOPTY, cfg.nopty); - CheckDlgButton (hwnd, IDC_AGENTFWD, cfg.agentfwd); - CheckRadioButton (hwnd, IDC_CIPHER3DES, IDC_CIPHERDES, - cfg.cipher == CIPHER_BLOWFISH ? IDC_CIPHERBLOWF : - cfg.cipher == CIPHER_DES ? IDC_CIPHERDES : - IDC_CIPHER3DES); - CheckRadioButton (hwnd, IDC_SSHPROT1, IDC_SSHPROT2, - cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2); - CheckDlgButton (hwnd, IDC_AUTHTIS, cfg.try_tis_auth); - SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); - SetDlgItemText (hwnd, IDC_CMDEDIT, cfg.remote_cmd); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_TTEDIT: - if (HIWORD(wParam) == EN_CHANGE) - GetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype, - sizeof(cfg.termtype)-1); - break; - case IDC_LOGEDIT: - if (HIWORD(wParam) == EN_CHANGE) - GetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username, - sizeof(cfg.username)-1); - break; case IDC_NOPTY: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.nopty = IsDlgButtonChecked (hwnd, IDC_NOPTY); break; + case IDC_BUGGYMAC: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.buggymac = IsDlgButtonChecked (hwnd, IDC_BUGGYMAC); + break; case IDC_AGENTFWD: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) @@ -1880,9 +1503,6 @@ static int CALLBACK SshProc (HWND hwnd, UINT msg, sizeof(cfg.remote_cmd)-1); break; case IDC_PKBUTTON: - /* - * FIXME: this crashes. Find out why. - */ memset(&of, 0, sizeof(of)); #ifdef OPENFILENAME_SIZE_VERSION_400 of.lStructSize = OPENFILENAME_SIZE_VERSION_400; @@ -1904,57 +1524,6 @@ static int CALLBACK SshProc (HWND hwnd, UINT msg, SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile); } break; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK SelectionProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - int i; - enum { controlstartvalue = 1000, - IDC_MBSTATIC, - IDC_MBWINDOWS, - IDC_MBXTERM, - IDC_CCSTATIC, - IDC_CCLIST, - IDC_CCSET, - IDC_CCSTATIC2, - IDC_CCEDIT - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] stwx */ - ctlposinit(&cp, hwnd); - radiobig(&cp, "Action of mouse buttons:", IDC_MBSTATIC, - "&Windows (Right pastes, Middle extends)", IDC_MBWINDOWS, - "&xterm (Right extends, Middle pastes)", IDC_MBXTERM, - NULL); - charclass(&cp, "Character classes:", IDC_CCSTATIC, IDC_CCLIST, - "&Set", IDC_CCSET, IDC_CCEDIT, - "&to class", IDC_CCSTATIC2); - - CheckRadioButton (hwnd, IDC_MBWINDOWS, IDC_MBXTERM, - cfg.mouse_is_xterm ? IDC_MBXTERM : IDC_MBWINDOWS); - { - static int tabs[4] = {25, 61, 96, 128}; - SendDlgItemMessage (hwnd, IDC_CCLIST, LB_SETTABSTOPS, 4, - (LPARAM) tabs); - } - for (i=0; i<256; i++) { - char str[100]; - sprintf(str, "%d\t(0x%02X)\t%c\t%d", i, i, - (i>=0x21 && i != 0x7F) ? i : ' ', - cfg.wordness[i]); - SendDlgItemMessage (hwnd, IDC_CCLIST, LB_ADDSTRING, 0, - (LPARAM) str); - } - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { case IDC_MBWINDOWS: case IDC_MBXTERM: cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC_MBXTERM); @@ -1985,92 +1554,22 @@ static int CALLBACK SelectionProc (HWND hwnd, UINT msg, } } break; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK ColourProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - static const char *const colours[] = { - "Default Foreground", "Default Bold Foreground", - "Default Background", "Default Bold Background", - "Cursor Text", "Cursor Colour", - "ANSI Black", "ANSI Black Bold", - "ANSI Red", "ANSI Red Bold", - "ANSI Green", "ANSI Green Bold", - "ANSI Yellow", "ANSI Yellow Bold", - "ANSI Blue", "ANSI Blue Bold", - "ANSI Magenta", "ANSI Magenta Bold", - "ANSI Cyan", "ANSI Cyan Bold", - "ANSI White", "ANSI White Bold" - }; - static const int permanent[] = { - TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, - TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, - TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE - }; - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_BOLDCOLOUR, - IDC_PALETTE, - IDC_STATIC, - IDC_LIST, - IDC_RSTATIC, - IDC_GSTATIC, - IDC_BSTATIC, - IDC_RVALUE, - IDC_GVALUE, - IDC_BVALUE, - IDC_CHANGE - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] bmlu */ - ctlposinit(&cp, hwnd); - checkbox(&cp, "&Bolded text is a different colour", IDC_BOLDCOLOUR); - checkbox(&cp, "Attempt to use &logical palettes", IDC_PALETTE); - colouredit(&cp, "Select a colo&ur and click to modify it:", - IDC_STATIC, IDC_LIST, - "&Modify...", IDC_CHANGE, - "Red:", IDC_RSTATIC, IDC_RVALUE, - "Green:", IDC_GSTATIC, IDC_GVALUE, - "Blue:", IDC_BSTATIC, IDC_BVALUE, NULL); - - CheckDlgButton (hwnd, IDC_BOLDCOLOUR, cfg.bold_colour); - CheckDlgButton (hwnd, IDC_PALETTE, cfg.try_palette); - { - int i; - for (i=0; i<22; i++) - if (cfg.bold_colour || permanent[i]) - SendDlgItemMessage (hwnd, IDC_LIST, LB_ADDSTRING, 0, - (LPARAM) colours[i]); - } - SendDlgItemMessage (hwnd, IDC_LIST, LB_SETCURSEL, 0, 0); - SetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[0][0], FALSE); - SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[0][1], FALSE); - SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[0][2], FALSE); - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { case IDC_BOLDCOLOUR: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { int n, i; cfg.bold_colour = IsDlgButtonChecked (hwnd, IDC_BOLDCOLOUR); - n = SendDlgItemMessage (hwnd, IDC_LIST, LB_GETCOUNT, 0, 0); + n = SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0); if (cfg.bold_colour && n!=22) { for (i=0; i<22; i++) - if (!permanent[i]) - SendDlgItemMessage (hwnd, IDC_LIST, + if (!permcolour[i]) + SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_INSERTSTRING, i, (LPARAM) colours[i]); } else if (!cfg.bold_colour && n!=12) { for (i=22; i-- ;) - if (!permanent[i]) - SendDlgItemMessage (hwnd, IDC_LIST, + if (!permcolour[i]) + SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_DELETESTRING, i, 0); } } @@ -2080,13 +1579,14 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, HIWORD(wParam) == BN_DOUBLECLICKED) cfg.try_palette = IsDlgButtonChecked (hwnd, IDC_PALETTE); break; - case IDC_LIST: + case IDC_COLOURLIST: if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE) { - int i = SendDlgItemMessage (hwnd, IDC_LIST, LB_GETCURSEL, + int i = SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i*2 : i == 3 ? 5 : i*2-2); +debug(("ooh\n")); SetDlgItemInt (hwnd, IDC_RVALUE, cfg.colours[i][0], FALSE); SetDlgItemInt (hwnd, IDC_GVALUE, cfg.colours[i][1], FALSE); SetDlgItemInt (hwnd, IDC_BVALUE, cfg.colours[i][2], FALSE); @@ -2097,7 +1597,7 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, HIWORD(wParam) == BN_DOUBLECLICKED) { static CHOOSECOLOR cc; static DWORD custom[16] = {0}; /* zero initialisers */ - int i = SendDlgItemMessage (hwnd, IDC_LIST, LB_GETCURSEL, + int i = SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_GETCURSEL, 0, 0); if (!cfg.bold_colour) i = (i < 3 ? i*2 : i == 3 ? 5 : i*2-2); @@ -2124,65 +1624,16 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg, } } break; - } - break; - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static int CALLBACK TranslationProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) { - struct ctlpos cp; - enum { controlstartvalue = 1000, - IDC_XLATSTATIC, - IDC_NOXLAT, - IDC_KOI8WIN1251, - IDC_88592WIN1250, - IDC_CAPSLOCKCYR, - IDC_VTSTATIC, - IDC_VTXWINDOWS, - IDC_VTOEMANSI, - IDC_VTOEMONLY, - IDC_VTPOORMAN - }; - - switch (msg) { - case WM_INITDIALOG: - /* Accelerators used: [aco] beiknpsx */ - ctlposinit(&cp, hwnd); - radiobig(&cp, - "Handling of VT100 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, NULL); - radiobig(&cp, - "Character set translation:", IDC_XLATSTATIC, - "&None", IDC_NOXLAT, - "&KOI8 / Win-1251", IDC_KOI8WIN1251, - "&ISO-8859-2 / Win-1250", IDC_88592WIN1250, NULL); - checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC_CAPSLOCKCYR); - - CheckRadioButton (hwnd, IDC_NOXLAT, IDC_88592WIN1250, - cfg.xlat_88592w1250 ? IDC_88592WIN1250 : - cfg.xlat_enablekoiwin ? IDC_KOI8WIN1251 : - IDC_NOXLAT); - CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr); - CheckRadioButton (hwnd, IDC_VTXWINDOWS, IDC_VTPOORMAN, - cfg.vtmode == VT_XWINDOWS ? IDC_VTXWINDOWS : - cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI : - cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY : - IDC_VTPOORMAN); - case WM_COMMAND: - switch (LOWORD(wParam)) { case IDC_NOXLAT: case IDC_KOI8WIN1251: case IDC_88592WIN1250: + case IDC_88592CP852: cfg.xlat_enablekoiwin = IsDlgButtonChecked (hwnd, IDC_KOI8WIN1251); cfg.xlat_88592w1250 = IsDlgButtonChecked (hwnd, IDC_88592WIN1250); + cfg.xlat_88592cp852 = + IsDlgButtonChecked (hwnd, IDC_88592CP852); break; case IDC_CAPSLOCKCYR: if (HIWORD(wParam) == BN_CLICKED || @@ -2202,138 +1653,6 @@ static int CALLBACK TranslationProc (HWND hwnd, UINT msg, VT_POORMAN); break; } - } - return GeneralPanelProc (hwnd, msg, wParam, lParam); -} - -static DLGPROC panelproc[NPANELS] = { - ConnectionProc, KeyboardProc, TerminalProc, WindowProc, - TelnetProc, SshProc, SelectionProc, ColourProc, TranslationProc -}; - -static char *names[NPANELS] = { - "Connection", "Keyboard", "Terminal", "Window", "Telnet", - "SSH", "Selection", "Colours", "Translation" -}; - -static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8}; -static int reconfp[RECONF_NPANELS] = { 1, 2, 3, 6, 7, 8}; - -static HWND makesubdialog(HWND hwnd, int x, int y, int w, int h, int n) { - RECT r; - HWND ret; - WPARAM font; - r.left = x; r.top = y; - r.right = r.left + w; r.bottom = r.top + h; - MapDialogRect(hwnd, &r); - ret = CreateWindowEx(WS_EX_CONTROLPARENT, - WC_DIALOG, "", /* no title */ - WS_CHILD | WS_VISIBLE | DS_SETFONT, - r.left, r.top, - r.right-r.left, r.bottom-r.top, - hwnd, (HMENU)IDC_SUBDLG, - hinst, NULL); - SetWindowLong (ret, DWL_DLGPROC, (LONG)panelproc[n]); - font = SendMessage(hwnd, WM_GETFONT, 0, 0); - SendMessage (ret, WM_SETFONT, font, MAKELPARAM(0, 0)); - SendMessage (ret, WM_INITDIALOG, 0, 0); - return ret; -} - -static int GenericMainDlgProc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam, - int npanels, int *panelnums, HWND *page) { - HWND hw, tabctl; - - switch (msg) { - case WM_INITDIALOG: - { /* 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); - } - { - RECT r; - r.left = 3; r.right = r.left + 174; - r.top = 3; r.bottom = r.top + 193; - MapDialogRect(hwnd, &r); - tabctl = CreateWindowEx(0, WC_TABCONTROL, "", - WS_CHILD | WS_VISIBLE | - WS_TABSTOP | TCS_MULTILINE, - r.left, r.top, - r.right-r.left, r.bottom-r.top, - hwnd, (HMENU)IDC_TAB, hinst, NULL); - - if (!tabctl) { - struct ctlpos cp; - ctlposinit2(&cp, hwnd); - ersatztab(&cp, "Category:", IDC_TABSTATIC1, IDC_TABLIST, - IDC_TABSTATIC2); - } else { - WPARAM font = SendMessage(hwnd, WM_GETFONT, 0, 0); - SendMessage(tabctl, WM_SETFONT, font, MAKELPARAM(TRUE, 0)); - } - } - *page = NULL; - if (tabctl) { /* initialise the tab control */ - TC_ITEMHEADER tab; - int i; - - for (i=0; icode == TCN_SELCHANGE) { - int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); - if (*page) - DestroyWindow (*page); - *page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[i]); - SetFocus (((LPNMHDR)lParam)->hwndFrom); /* ensure focus stays */ - return 0; - } - break; - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDC_TABLIST: - if (HIWORD(wParam) == CBN_SELCHANGE) { - HWND tablist = GetDlgItem (hwnd, IDC_TABLIST); - int i = SendMessage (tablist, CB_GETCURSEL, 0, 0); - if (*page) - DestroyWindow (*page); - *page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[i]); - SetFocus(tablist); /* ensure focus stays */ - return 0; - } - break; - case IDOK: - if (*cfg.host) - EndDialog (hwnd, 1); - else - MessageBeep (0); - return 0; - case IDCANCEL: - EndDialog (hwnd, 0); - return 0; - } return 0; case WM_CLOSE: EndDialog (hwnd, 0); @@ -2354,76 +1673,34 @@ static int CALLBACK MainDlgProc (HWND hwnd, UINT msg, if (msg == WM_COMMAND && LOWORD(wParam) == IDOK) { } - if (msg == WM_COMMAND && LOWORD(wParam) == IDC_ABOUT) { + if (msg == WM_COMMAND && LOWORD(wParam) == IDCX_ABOUT) { EnableWindow(hwnd, 0); DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), GetParent(hwnd), AboutProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); } - return GenericMainDlgProc (hwnd, msg, wParam, lParam, - MAIN_NPANELS, mainp, &page); + return GenericMainDlgProc (hwnd, msg, wParam, lParam, 0); } static int CALLBACK ReconfDlgProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND page; - return GenericMainDlgProc (hwnd, msg, wParam, lParam, - RECONF_NPANELS, reconfp, &page); + return GenericMainDlgProc (hwnd, msg, wParam, lParam, 1); } -void get_sesslist(int allocate) { - static char otherbuf[2048]; - static char *buffer; - int buflen, bufsize, i; - char *p, *ret; - void *handle; - - if (allocate) { - - if ((handle = enum_settings_start()) == NULL) - return; - - buflen = bufsize = 0; - buffer = NULL; - do { - ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf)); - if (ret) { - int len = strlen(otherbuf)+1; - if (bufsize < buflen+len) { - bufsize = buflen + len + 2048; - buffer = srealloc(buffer, bufsize); - } - strcpy(buffer+buflen, otherbuf); - buflen += strlen(buffer+buflen)+1; - } - } while (ret); - enum_settings_finish(handle); - buffer = srealloc(buffer, buflen+1); - buffer[buflen] = '\0'; - - p = buffer; - nsessions = 1; /* "Default Settings" counts as one */ - while (*p) { - if (strcmp(p, "Default Settings")) - nsessions++; - while (*p) p++; - p++; - } - - sessions = smalloc(nsessions * sizeof(char *)); - sessions[0] = "Default Settings"; - p = buffer; - i = 1; - while (*p) { - if (strcmp(p, "Default Settings")) - sessions[i++] = p; - while (*p) p++; - p++; - } - } else { - sfree (buffer); - sfree (sessions); +void defuse_showwindow(void) { + /* + * Work around the fact that the app's first call to ShowWindow + * will ignore the default in favour of the shell-provided + * setting. + */ + { + HWND hwnd; + hwnd = CreateDialog (hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), + NULL, NullDlgProc); + ShowWindow(hwnd, SW_HIDE); + DestroyWindow(hwnd); } } @@ -2452,13 +1729,6 @@ int do_reconfig (HWND hwnd) { return ret; } -void do_defaults (char *session) { - if (session) - load_settings (session, TRUE); - else - load_settings ("Default Settings", FALSE); -} - void logevent (char *string) { if (nevents >= negsize) { negsize += 64;