static int GenericMainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, int dlgtype)
static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
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;}