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);
create_controls(hwnd, (char *)item.lParam);  dlg_refresh(NULL, &dp);
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.path)];    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 = AUTO;		    if (LOWORD(wParam) == IDC_ECHOYES)			cfg.localecho = FORCE_ON;		    if (LOWORD(wParam) == IDC_ECHONO)			cfg.localecho = FORCE_OFF;		}		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 = AUTO;		    if (LOWORD(wParam) == IDC_EDITYES)			cfg.localedit = FORCE_ON;		    if (LOWORD(wParam) == IDC_EDITNO)			cfg.localedit = FORCE_OFF;		}		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.font.height,					  GetDeviceCaps(hdc, LOGPIXELSY),					  72);		    ReleaseDC(0, hdc);		}		lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;		lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;		lf.lfWeight = (cfg.font.isbold ? FW_BOLD : 0);		lf.lfCharSet = cfg.font.charset;		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.name,			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.name, lf.lfFaceName,			    sizeof(cfg.font.name) - 1);		    cfg.font.name[sizeof(cfg.font.name) - 1] = '\0';		    cfg.font.isbold = (lf.lfWeight == FW_BOLD);		    cfg.font.charset = lf.lfCharSet;		    cfg.font.height = 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 (*.wav)\0*.WAV\0"		    "All Files (*.*)\0*\0\0\0";		of.lpstrCustomFilter = NULL;		of.nFilterIndex = 1;		of.lpstrFile = filename;		strcpy(filename, cfg.bell_wavefile.path);		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.path, filename);		    SetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,				   cfg.bell_wavefile.path);		}		break;	      case IDC_BELL_WAVEEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_BELL_WAVEEDIT,				   cfg.bell_wavefile.path,				   sizeof(cfg.bell_wavefile.path) - 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) ? FORCE_ON :			IsDlgButtonChecked(hwnd,					   IDC_COENEVER) ? FORCE_OFF :			AUTO;		}		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;		}		break;	      case IDC_PROXYLOCALHOST:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)		    cfg.even_proxy_localhost =		    IsDlgButtonChecked(hwnd, IDC_PROXYLOCALHOST);		break;	      case IDC_PROXYDNSNO:	      case IDC_PROXYDNSAUTO:	      case IDC_PROXYDNSYES:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    cfg.proxy_dns =			IsDlgButtonChecked(hwnd, IDC_PROXYDNSNO) ? FORCE_OFF :			IsDlgButtonChecked(hwnd, IDC_PROXYDNSYES) ? FORCE_ON :			AUTO;		}		break;	      case IDC_PROXYTYPENONE:	      case IDC_PROXYTYPEHTTP:	      case IDC_PROXYTYPESOCKS:	      case IDC_PROXYTYPETELNET:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    cfg.proxy_type =			IsDlgButtonChecked(hwnd, IDC_PROXYTYPEHTTP) ? PROXY_HTTP :			IsDlgButtonChecked(hwnd, IDC_PROXYTYPESOCKS) ? PROXY_SOCKS :			IsDlgButtonChecked(hwnd, IDC_PROXYTYPETELNET) ? PROXY_TELNET :			PROXY_NONE;		}		break;	      case IDC_LGFEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename.path,				   sizeof(cfg.logfilename.path) - 1);		break;	      case IDC_LGFBUTTON:		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 = "All Files (*.*)\0*\0\0\0";		of.lpstrCustomFilter = NULL;		of.nFilterIndex = 1;		of.lpstrFile = filename;		strcpy(filename, cfg.logfilename.path);		of.nMaxFile = sizeof(filename);		of.lpstrFileTitle = NULL;		of.lpstrInitialDir = NULL;		of.lpstrTitle = "Select session log file";		of.Flags = 0;		if (GetSaveFileName(&of)) {		    strcpy(cfg.logfilename.path, filename);		    SetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename.path);		}		break;	      case IDC_LSTATOFF:	      case IDC_LSTATASCII:	      case IDC_LSTATRAW:	      case IDC_LSTATPACKET:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    if (IsDlgButtonChecked(hwnd, IDC_LSTATOFF))			cfg.logtype = LGTYP_NONE;		    if (IsDlgButtonChecked(hwnd, IDC_LSTATASCII))			cfg.logtype = LGTYP_ASCII;		    if (IsDlgButtonChecked(hwnd, IDC_LSTATRAW))			cfg.logtype = LGTYP_DEBUG;		    if (IsDlgButtonChecked(hwnd, IDC_LSTATPACKET))			cfg.logtype = LGTYP_PACKETS;		}		break;	      case IDC_LSTATXASK:	      case IDC_LSTATXAPN:	      case IDC_LSTATXOVR:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    if (IsDlgButtonChecked(hwnd, IDC_LSTATXASK))			cfg.logxfovr = LGXF_ASK;		    if (IsDlgButtonChecked(hwnd, IDC_LSTATXAPN))			cfg.logxfovr = LGXF_APN;		    if (IsDlgButtonChecked(hwnd, IDC_LSTATXOVR))			cfg.logxfovr = LGXF_OVR;		}		break;	      case IDC_TSEDIT:	      case IDC_R_TSEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, LOWORD(wParam), cfg.termspeed,				   sizeof(cfg.termspeed) - 1);		break;	      case IDC_LOGEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_LOGEDIT, cfg.username,				   sizeof(cfg.username) - 1);		break;	      case IDC_RLLUSEREDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_RLLUSEREDIT,				   cfg.localusername,				   sizeof(cfg.localusername) - 1);		break;	      case IDC_EMBSD:	      case IDC_EMRFC:		cfg.rfc_environ = IsDlgButtonChecked(hwnd, IDC_EMRFC);		break;	      case IDC_TPASSIVE:	      case IDC_TACTIVE:		cfg.passive_telnet =		    IsDlgButtonChecked(hwnd, IDC_TPASSIVE);		break;	      case IDC_ENVADD:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    char str[sizeof(cfg.environmt)];		    char *p;		    GetDlgItemText(hwnd, IDC_VAREDIT, str,				   sizeof(str) - 1);		    if (!*str) {			MessageBeep(0);			break;		    }		    p = str + strlen(str);		    *p++ = '\t';		    GetDlgItemText(hwnd, IDC_VALEDIT, p,				   sizeof(str) - 1 - (p - str));		    if (!*p) {			MessageBeep(0);			break;		    }		    p = cfg.environmt;		    while (*p) {			while (*p)			    p++;			p++;		    }		    if ((p - cfg.environmt) + strlen(str) + 2 <			sizeof(cfg.environmt)) {			strcpy(p, str);			p[strlen(str) + 1] = '\0';			SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_ADDSTRING,					   0, (LPARAM) str);			SetDlgItemText(hwnd, IDC_VAREDIT, "");			SetDlgItemText(hwnd, IDC_VALEDIT, "");		    } else {			MessageBox(hwnd, "Environment too big",				   "PuTTY Error", MB_OK | MB_ICONERROR);		    }		}		break;	      case IDC_ENVREMOVE:		if (HIWORD(wParam) != BN_CLICKED &&		    HIWORD(wParam) != BN_DOUBLECLICKED) break;		i =		    SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_GETCURSEL, 0,				       0);		if (i == LB_ERR)		    MessageBeep(0);		else {		    char *p, *q;		    SendDlgItemMessage(hwnd, IDC_ENVLIST, LB_DELETESTRING,				       i, 0);		    p = cfg.environmt;		    while (i > 0) {			if (!*p)			    goto disaster;			while (*p)			    p++;			p++;			i--;		    }		    q = p;		    if (!*p)			goto disaster;		    while (*p)			p++;		    p++;		    while (*p) {			while (*p)			    *q++ = *p++;			*q++ = *p++;		    }		    *q = '\0';		  disaster:;		}		break;	      case IDC_NOPTY:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.nopty = IsDlgButtonChecked(hwnd, IDC_NOPTY);		break;	      case IDC_COMPRESS:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.compression =			IsDlgButtonChecked(hwnd, IDC_COMPRESS);		break;	      case IDC_SSH2DES:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.ssh2_des_cbc =			IsDlgButtonChecked(hwnd, IDC_SSH2DES);		break;	      case IDC_AGENTFWD:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.agentfwd =			IsDlgButtonChecked(hwnd, IDC_AGENTFWD);		break;	      case IDC_CHANGEUSER:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.change_username =			IsDlgButtonChecked(hwnd, IDC_CHANGEUSER);		break;	      case IDC_CIPHERLIST:	      case IDC_CIPHERUP:	      case IDC_CIPHERDN:		handle_prefslist(&cipherlist,				 cfg.ssh_cipherlist, CIPHER_MAX,				 0, hwnd, wParam, lParam);		break;	      case IDC_SSHPROT1ONLY:	      case IDC_SSHPROT1:	      case IDC_SSHPROT2:      	      case IDC_SSHPROT2ONLY:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1ONLY))			cfg.sshprot = 0;		    if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1))			cfg.sshprot = 1;		    else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2))			cfg.sshprot = 2;		    else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2ONLY))			cfg.sshprot = 3;		}		break;	      case IDC_AUTHTIS:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.try_tis_auth =			IsDlgButtonChecked(hwnd, IDC_AUTHTIS);		break;	      case IDC_AUTHKI:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.try_ki_auth =			IsDlgButtonChecked(hwnd, IDC_AUTHKI);		break;	      case IDC_PKEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile.path,				   sizeof(cfg.keyfile.path) - 1);		break;	      case IDC_CMDEDIT:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_CMDEDIT, cfg.remote_cmd,				   sizeof(cfg.remote_cmd) - 1);		break;	      case IDC_PKBUTTON:		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 = "PuTTY Private Key Files (*.ppk)\0*.ppk\0"		    "All Files (*.*)\0*\0\0\0";		of.lpstrCustomFilter = NULL;		of.nFilterIndex = 1;		of.lpstrFile = filename;		strcpy(filename, cfg.keyfile.path);		of.nMaxFile = sizeof(filename);		of.lpstrFileTitle = NULL;		of.lpstrInitialDir = NULL;		of.lpstrTitle = "Select Private Key File";		of.Flags = 0;		if (GetOpenFileName(&of)) {		    strcpy(cfg.keyfile.path, filename);		    SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile.path);		}		break;	      case IDC_RAWCNP:		cfg.rawcnp = IsDlgButtonChecked(hwnd, IDC_RAWCNP);		break;	      case IDC_RTFPASTE:		cfg.rtf_paste = IsDlgButtonChecked(hwnd, IDC_RTFPASTE);		break;	      case IDC_MBWINDOWS:	      case IDC_MBXTERM:		cfg.mouse_is_xterm = IsDlgButtonChecked(hwnd, IDC_MBXTERM);		break;	      case IDC_SELTYPELEX:	      case IDC_SELTYPERECT:		cfg.rect_select = IsDlgButtonChecked(hwnd, IDC_SELTYPERECT);		break;	      case IDC_MOUSEOVERRIDE:		cfg.mouse_override = IsDlgButtonChecked(hwnd, IDC_MOUSEOVERRIDE);		break;	      case IDC_CCSET:		{		    BOOL ok;		    int i;		    int n = GetDlgItemInt(hwnd, IDC_CCEDIT, &ok, FALSE);		    if (!ok)			MessageBeep(0);		    else {			for (i = 0; i < 128; i++)			    if (SendDlgItemMessage				(hwnd, IDC_CCLIST, LB_GETSEL, i, 0)) {				char str[100];				cfg.wordness[i] = n;				SendDlgItemMessage(hwnd, IDC_CCLIST,						   LB_DELETESTRING, i, 0);				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_INSERTSTRING, i,						   (LPARAM) str);			    }		    }		}		break;	      case IDC_BOLDCOLOUR:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    int n, i;		    cfg.bold_colour =			IsDlgButtonChecked(hwnd, IDC_BOLDCOLOUR);		}		break;	      case IDC_PALETTE:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)			cfg.try_palette =			IsDlgButtonChecked(hwnd, IDC_PALETTE);		break;	      case IDC_COLOURLIST:		if (HIWORD(wParam) == LBN_DBLCLK ||		    HIWORD(wParam) == LBN_SELCHANGE) {		    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);		    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);		}		break;	      case IDC_CHANGE:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    static CHOOSECOLOR cc;		    static DWORD custom[16] = { 0 };	/* zero initialisers */		    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);		    cc.lStructSize = sizeof(cc);		    cc.hwndOwner = hwnd;		    cc.hInstance = (HWND) hinst;		    cc.lpCustColors = custom;		    cc.rgbResult =			RGB(cfg.colours[i][0], cfg.colours[i][1],			    cfg.colours[i][2]);		    cc.Flags = CC_FULLOPEN | CC_RGBINIT;		    if (ChooseColor(&cc)) {			cfg.colours[i][0] =			    (unsigned char) (cc.rgbResult & 0xFF);			cfg.colours[i][1] =			    (unsigned char) (cc.rgbResult >> 8) & 0xFF;			cfg.colours[i][2] =			    (unsigned char) (cc.rgbResult >> 16) & 0xFF;			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);		    }		}		break;	      case IDC_CODEPAGE:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_CODEPAGE,						   CB_GETCURSEL, 0, 0);		    SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_GETLBTEXT,				       index, (LPARAM)cfg.line_codepage);		} else if (HIWORD(wParam) == CBN_EDITCHANGE) {		    GetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage,				   sizeof(cfg.line_codepage) - 1);		} else if (HIWORD(wParam) == CBN_KILLFOCUS) {		    strcpy(cfg.line_codepage,			   cp_name(decode_codepage(cfg.line_codepage)));		    SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage);		}		break;	      case IDC_PRINTER:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_PRINTER,						   CB_GETCURSEL, 0, 0);		    SendDlgItemMessage(hwnd, IDC_PRINTER, CB_GETLBTEXT,				       index, (LPARAM)cfg.printer);		} else if (HIWORD(wParam) == CBN_EDITCHANGE) {		    GetDlgItemText(hwnd, IDC_PRINTER, cfg.printer,				   sizeof(cfg.printer) - 1);		}		if (!strcmp(cfg.printer, PRINTER_DISABLED_STRING))		    *cfg.printer = '\0';		break;	      case IDC_CAPSLOCKCYR:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    cfg.xlat_capslockcyr =			IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR);		}		break;	      case IDC_VTXWINDOWS:	      case IDC_VTOEMANSI:	      case IDC_VTOEMONLY:	      case IDC_VTPOORMAN:	      case IDC_VTUNICODE:		cfg.vtmode =		    (IsDlgButtonChecked(hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS		     : IsDlgButtonChecked(hwnd,					  IDC_VTOEMANSI) ? VT_OEMANSI :		     IsDlgButtonChecked(hwnd,					IDC_VTOEMONLY) ? VT_OEMONLY :		     IsDlgButtonChecked(hwnd,					IDC_VTUNICODE) ? VT_UNICODE :		     VT_POORMAN);		break;	      case IDC_X11_FORWARD:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)		    cfg.x11_forward =		    IsDlgButtonChecked(hwnd, IDC_X11_FORWARD);		break;	      case IDC_LPORT_ALL:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)		    cfg.lport_acceptall =		    IsDlgButtonChecked(hwnd, IDC_LPORT_ALL);		break;	      case IDC_RPORT_ALL:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED)		    cfg.rport_acceptall =		    IsDlgButtonChecked(hwnd, IDC_RPORT_ALL);		break;	      case IDC_X11_DISPLAY:		if (HIWORD(wParam) == EN_CHANGE)		    GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display,				   sizeof(cfg.x11_display) - 1);		break;	      case IDC_X11MIT:	      case IDC_X11XDM:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    if (IsDlgButtonChecked(hwnd, IDC_X11MIT))			cfg.x11_auth = X11_MIT;		    else if (IsDlgButtonChecked(hwnd, IDC_X11XDM))			cfg.x11_auth = X11_XDM;		}		break;	      case IDC_PFWDADD:		if (HIWORD(wParam) == BN_CLICKED ||		    HIWORD(wParam) == BN_DOUBLECLICKED) {		    char str[sizeof(cfg.portfwd)];		    char *p;		    if (IsDlgButtonChecked(hwnd, IDC_PFWDLOCAL))			str[0] = 'L';		    else			str[0] = 'R';		    GetDlgItemText(hwnd, IDC_SPORTEDIT, str+1,				   sizeof(str) - 2);		    if (!str[1]) {			MessageBox(hwnd,				   "You need to specify a source port number",				   "PuTTY Error", MB_OK | MB_ICONERROR);			break;		    }		    p = str + strlen(str);		    *p++ = '\t';		    GetDlgItemText(hwnd, IDC_DPORTEDIT, p,				   sizeof(str) - 1 - (p - str));		    if (!*p || !strchr(p, ':')) {			MessageBox(hwnd,				   "You need to specify a destination address\n"				   "in the form \"host.name:port\"",				   "PuTTY Error", MB_OK | MB_ICONERROR);			break;		    }		    p = cfg.portfwd;		    while (*p) {			while (*p)			    p++;			p++;		    }		    if ((p - cfg.portfwd) + strlen(str) + 2 <			sizeof(cfg.portfwd)) {			strcpy(p, str);			p[strlen(str) + 1] = '\0';			SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_ADDSTRING,					   0, (LPARAM) str);			SetDlgItemText(hwnd, IDC_SPORTEDIT, "");			SetDlgItemText(hwnd, IDC_DPORTEDIT, "");		    } else {			MessageBox(hwnd, "Too many forwardings",				   "PuTTY Error", MB_OK | MB_ICONERROR);		    }		}		break;	      case IDC_PFWDREMOVE:		if (HIWORD(wParam) != BN_CLICKED &&		    HIWORD(wParam) != BN_DOUBLECLICKED) break;		i = SendDlgItemMessage(hwnd, IDC_PFWDLIST,				       LB_GETCURSEL, 0, 0);		if (i == LB_ERR)		    MessageBeep(0);		else {		    char *p, *q;		    SendDlgItemMessage(hwnd, IDC_PFWDLIST, LB_DELETESTRING,				       i, 0);		    p = cfg.portfwd;		    while (i > 0) {			if (!*p)			    goto disaster2;			while (*p)			    p++;			p++;			i--;		    }		    q = p;		    if (!*p)			goto disaster2;		    while (*p)			p++;		    p++;		    while (*p) {			while (*p)			    *q++ = *p++;			*q++ = *p++;		    }		    *q = '\0';		  disaster2:;		}		break;	      case IDC_BUGD_IGNORE1:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_IGNORE1,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_ignore1 = (index == 0 ? AUTO :					  index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_PLAINPW1:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_PLAINPW1,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_plainpw1 = (index == 0 ? AUTO :					   index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_RSA1:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSA1,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_rsa1 = (index == 0 ? AUTO :				       index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_HMAC2:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_HMAC2,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_hmac2 = (index == 0 ? AUTO :					index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_DERIVEKEY2:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_DERIVEKEY2,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_derivekey2 = (index == 0 ? AUTO :					     index == 1 ? FORCE_OFF:FORCE_ON);		}		break;	      case IDC_BUGD_RSAPAD2:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_rsapad2 = (index == 0 ? AUTO :					  index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_DHGEX2:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_dhgex2 = (index == 0 ? AUTO :					 index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	      case IDC_BUGD_PKSESSID2:		if (HIWORD(wParam) == CBN_SELCHANGE) {		    int index = SendDlgItemMessage(hwnd, IDC_BUGD_PKSESSID2,						   CB_GETCURSEL, 0, 0);		    cfg.sshbug_pksessid2 = (index == 0 ? AUTO :                                            index == 1 ? FORCE_OFF : FORCE_ON);		}		break;	    }	return 0;      case WM_HELP:        if (help_path) {            int id = ((LPHELPINFO)lParam)->iCtrlId;            char *cmd = help_context_cmd(id);            if (cmd) {                WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);                requested_help = TRUE;            } else {                MessageBeep(0);            }        }        break;      case WM_CLOSE:        if (requested_help) {            WinHelp(hwnd, help_path, HELP_QUIT, 0);            requested_help = FALSE;        }	EndDialog(hwnd, 0);	return 0;	/* Grrr Explorer will maximize Dialogs! */      case WM_SIZE:	if (wParam == SIZE_MAXIMIZED)	    force_normal(hwnd);	return 0;      default:	/*	 * Handle application-defined messages eg. DragListBox	 */	/* First find out what the number is (once). */	if (draglistmsg == WM_NULL)	    draglistmsg = RegisterWindowMessage (DRAGLISTMSGSTRING);	if (msg == draglistmsg) {	    /* Only process once dialog is fully formed. */	    if (GetWindowLong(hwnd, GWL_USERDATA) == 1) switch (LOWORD(wParam)) {	      case IDC_CIPHERLIST:		return handle_prefslist(&cipherlist,					cfg.ssh_cipherlist, CIPHER_MAX,					1, hwnd, wParam, lParam);	    }	}	return 0;    }    return 0;}