case IDC_SUNKENEDGE: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) cfg.sunken_edge = IsDlgButtonChecked (hwnd, IDC_SUNKENEDGE); break;
static int GenericMainDlgProc (HWND hwnd, UINT msg,			       WPARAM wParam, LPARAM lParam,			       int dlgtype) {    HWND hw, treeview;    struct treeview_faff tvfaff;    HTREEITEM hsession;    OPENFILENAME of;    char filename[sizeof(cfg.keyfile)];    CHOOSEFONT cf;    LOGFONT lf;    char fontstatic[256];    char portname[32];    struct servent * service;    int i;    switch (msg) {      case WM_INITDIALOG:	readytogo = 0;	SetWindowLong(hwnd, GWL_USERDATA, 0);	/*	 * 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 + 206;            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, 0, "Window");        treeview_insert(&tvfaff, 1, "Appearance");        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, "Telnet");            treeview_insert(&tvfaff, 1, "Rlogin");            if (backends[3].backend != NULL) {                treeview_insert(&tvfaff, 1, "SSH");                treeview_insert(&tvfaff, 2, "Tunnels");            }        }        /*         * 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);	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];            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, "Window"))		create_controls(hwnd, dlgtype, windowpanelstart);	    if (!strcmp(buffer, "Appearance"))		create_controls(hwnd, dlgtype, appearancepanelstart);	    if (!strcmp(buffer, "Tunnels"))		create_controls(hwnd, dlgtype, tunnelspanelstart);	    if (!strcmp(buffer, "Connection"))		create_controls(hwnd, dlgtype, connectionpanelstart);	    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, "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);	    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:	    if (*cfg.host)		EndDialog (hwnd, 1);	    else		MessageBeep (0);	    return 0;	  case IDCANCEL:	    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 ;		if ((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, sessions[n]);		}		save_settings (str, !!strcmp(str, "Default Settings"), &cfg);		get_sesslist (FALSE);		get_sesslist (TRUE);		SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_RESETCONTENT,				    0, 0);		for (i = 0; i < nsessions; i++)		    SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING,					0, (LPARAM) (sessions[i]));		SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL,				    (WPARAM) -1, 0);	    }	    break;	  case IDC_SESSLIST:	  case IDC_SESSLOAD:	    if (LOWORD(wParam) == IDC_SESSLOAD &&		HIWORD(wParam) != BN_CLICKED &&		HIWORD(wParam) != BN_DOUBLECLICKED)		break;	    if (LOWORD(wParam) == IDC_SESSLIST &&		HIWORD(wParam) != LBN_DBLCLK)		break;	    {		int n = SendDlgItemMessage (hwnd, IDC_SESSLIST,					    LB_GETCURSEL, 0, 0);                int isdef;		if (n == LB_ERR) {		    MessageBeep(0);		    break;		}                isdef = !strcmp(sessions[n], "Default Settings");		load_settings (sessions[n], !isdef, &cfg);		init_dlg_ctrls(hwnd);                if (!isdef)                    SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]);		else                    SetDlgItemText(hwnd, IDC_SESSEDIT, "");	    }	    if (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(sessions[n]);		get_sesslist (FALSE);		get_sesslist (TRUE);		SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_RESETCONTENT,				    0, 0);		for (i = 0; i < nsessions; i++)		    SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_ADDSTRING,					0, (LPARAM) (sessions[i]));		SendDlgItemMessage (hwnd, IDC_SESSLIST, LB_SETCURSEL,				    (WPARAM) -1, 0);	    }          case IDC_PINGEDIT:            if (HIWORD(wParam) == EN_CHANGE)                MyGetDlgItemInt (hwnd, IDC_PINGEDIT, &cfg.ping_interval);            break;	  case IDC_DEL008:	  case IDC_DEL127:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.bksp_is_delete = IsDlgButtonChecked (hwnd, IDC_DEL127);	    break;	  case IDC_HOMETILDE:	  case IDC_HOMERXVT:	    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_ALTF4:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.alt_f4 = IsDlgButtonChecked (hwnd, IDC_ALTF4);	    break;	  case IDC_ALTSPACE:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.alt_space = IsDlgButtonChecked (hwnd, IDC_ALTSPACE);	    break;	  case IDC_ALTONLY:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.alt_only = IsDlgButtonChecked (hwnd, IDC_ALTONLY);	    break;	  case IDC_ECHOBACKEND:	  case IDC_ECHOYES:	  case IDC_ECHONO:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (LOWORD(wParam)==IDC_ECHOBACKEND) cfg.localecho=LD_BACKEND;		if (LOWORD(wParam)==IDC_ECHOYES) cfg.localecho=LD_YES;		if (LOWORD(wParam)==IDC_ECHONO) cfg.localecho=LD_NO;            }	    break;	  case IDC_EDITBACKEND:	  case IDC_EDITYES:	  case IDC_EDITNO:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (LOWORD(wParam)==IDC_EDITBACKEND) cfg.localedit=LD_BACKEND;		if (LOWORD(wParam)==IDC_EDITYES) cfg.localedit=LD_YES;		if (LOWORD(wParam)==IDC_EDITNO) cfg.localedit=LD_NO;            }	    break;	  case IDC_ANSWEREDIT:	    if (HIWORD(wParam) == EN_CHANGE)		GetDlgItemText (hwnd, IDC_ANSWEREDIT, cfg.answerback,				sizeof(cfg.answerback)-1);	    break;          case IDC_ALWAYSONTOP:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)                cfg.alwaysontop = IsDlgButtonChecked (hwnd, IDC_ALWAYSONTOP);	    break;	  case IDC_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_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:	    lf.lfHeight = cfg.fontheight;	    lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;	    lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;	    lf.lfWeight = (cfg.fontisbold ? FW_BOLD : 0);	    lf.lfCharSet = cfg.fontcharset;	    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;	    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;	    lf.lfQuality = DEFAULT_QUALITY;	    lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;	    strncpy (lf.lfFaceName, cfg.font, sizeof(lf.lfFaceName)-1);	    lf.lfFaceName[sizeof(lf.lfFaceName)-1] = '\0';	    cf.lStructSize = sizeof(cf);	    cf.hwndOwner = hwnd;	    cf.lpLogFont = &lf;	    cf.Flags = CF_FIXEDPITCHONLY | CF_FORCEFONTEXIST |		CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;	    if (ChooseFont (&cf)) {		strncpy (cfg.font, lf.lfFaceName, sizeof(cfg.font)-1);		cfg.font[sizeof(cfg.font)-1] = '\0';		cfg.fontisbold = (lf.lfWeight == FW_BOLD);		cfg.fontcharset = lf.lfCharSet;		cfg.fontheight = cf.iPointSize / 10;		fmtfont (fontstatic);		SetDlgItemText (hwnd, IDC_FONTSTATIC, fontstatic);	    }	    break;	  case IDC_BELL_DISABLED:	  case IDC_BELL_DEFAULT:	  case IDC_BELL_WAVEFILE:	  case IDC_BELL_VISUAL:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (LOWORD(wParam)==IDC_BELL_DISABLED) cfg.beep = BELL_DISABLED;		if (LOWORD(wParam)==IDC_BELL_DEFAULT) cfg.beep = BELL_DEFAULT;		if (LOWORD(wParam)==IDC_BELL_WAVEFILE) cfg.beep = BELL_WAVEFILE;		if (LOWORD(wParam)==IDC_BELL_VISUAL) cfg.beep = BELL_VISUAL;            }	    break;	  case IDC_BELL_WAVEBROWSE:            memset(&of, 0, sizeof(of));#ifdef OPENFILENAME_SIZE_VERSION_400            of.lStructSize = OPENFILENAME_SIZE_VERSION_400;#else            of.lStructSize = sizeof(of);#endif            of.hwndOwner = hwnd;            of.lpstrFilter = "Wave Files\0*.WAV\0AllFiles\0*\0\0\0";            of.lpstrCustomFilter = NULL;            of.nFilterIndex = 1;            of.lpstrFile = filename; strcpy(filename, cfg.bell_wavefile);            of.nMaxFile = sizeof(filename);            of.lpstrFileTitle = NULL;            of.lpstrInitialDir = NULL;            of.lpstrTitle = "Select Bell Sound File";            of.Flags = 0;            if (GetOpenFileName(&of)) {                strcpy(cfg.bell_wavefile, filename);                SetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile);            }	    break;	  case IDC_BELL_WAVEEDIT:	    if (HIWORD(wParam) == EN_CHANGE)		GetDlgItemText (hwnd, IDC_BELL_WAVEEDIT, cfg.bell_wavefile,				sizeof(cfg.bell_wavefile)-1);	    break;	  case IDC_BELLOVL:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.bellovl = IsDlgButtonChecked (hwnd, IDC_BELLOVL);	    break;          case IDC_BELLOVLN:            if (HIWORD(wParam) == EN_CHANGE)                MyGetDlgItemInt (hwnd, IDC_BELLOVLN, &cfg.bellovl_n);            break;          case IDC_BELLOVLT:            if (HIWORD(wParam) == EN_CHANGE)                MyGetDlgItemFlt (hwnd, IDC_BELLOVLT, &cfg.bellovl_t, 1000);            break;          case IDC_BELLOVLS:            if (HIWORD(wParam) == EN_CHANGE)                MyGetDlgItemFlt (hwnd, IDC_BELLOVLS, &cfg.bellovl_s, 1000);            break;	  case IDC_BLINKTEXT:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.blinktext = IsDlgButtonChecked (hwnd, IDC_BLINKTEXT);	    break;	  case IDC_BCE:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.bce = IsDlgButtonChecked (hwnd, IDC_BCE);	    break;	  case IDC_WINNAME:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.win_name_always = IsDlgButtonChecked (hwnd, IDC_WINNAME);	    break;	  case IDC_HIDEMOUSE:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.hide_mouseptr = IsDlgButtonChecked (hwnd, IDC_HIDEMOUSE);	    break;	  case IDC_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_LOCKSIZE:	     if (HIWORD(wParam) == BN_CLICKED ||		 HIWORD(wParam) == BN_DOUBLECLICKED)                cfg.locksize = IsDlgButtonChecked (hwnd, IDC_LOCKSIZE);            break;	  case IDC_WINEDIT:	    if (HIWORD(wParam) == EN_CHANGE)		GetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle,				sizeof(cfg.wintitle)-1);	    break;          case IDC_COEALWAYS:          case IDC_COENEVER:          case IDC_COENORMAL:            if (HIWORD(wParam) == BN_CLICKED ||                HIWORD(wParam) == BN_DOUBLECLICKED) {                cfg.close_on_exit = IsDlgButtonChecked (hwnd, IDC_COEALWAYS) ? COE_ALWAYS :                                    IsDlgButtonChecked (hwnd, IDC_COENEVER) ? COE_NEVER :                                    COE_NORMAL;            }            break;	  case IDC_CLOSEWARN:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.warn_on_close = IsDlgButtonChecked (hwnd, IDC_CLOSEWARN);	    break;	  case IDC_TTEDIT:	    if (HIWORD(wParam) == EN_CHANGE)	    GetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype,			    sizeof(cfg.termtype)-1);	    break;	  case IDC_LGFEDIT:	    if (HIWORD(wParam) == EN_CHANGE)	    GetDlgItemText (hwnd, IDC_LGFEDIT, cfg.logfilename,			    sizeof(cfg.logfilename)-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);            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, filename);                SetDlgItemText (hwnd, IDC_LGFEDIT, cfg.logfilename);            }	    break;	  case IDC_LSTATOFF:	  case IDC_LSTATASCII:	  case IDC_LSTATRAW:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (IsDlgButtonChecked (hwnd, IDC_LSTATOFF)) cfg.logtype = 0;		if (IsDlgButtonChecked (hwnd, IDC_LSTATASCII)) cfg.logtype = 1;		if (IsDlgButtonChecked (hwnd, IDC_LSTATRAW)) cfg.logtype = 2;	    }	    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_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_BUGGYMAC:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.buggymac = IsDlgButtonChecked (hwnd, IDC_BUGGYMAC);	    break;	  case IDC_AGENTFWD:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.agentfwd = IsDlgButtonChecked (hwnd, IDC_AGENTFWD);	    break;	  case IDC_CIPHER3DES:	  case IDC_CIPHERBLOWF:	  case IDC_CIPHERDES:	  case IDC_CIPHERAES:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (IsDlgButtonChecked (hwnd, IDC_CIPHER3DES))		    cfg.cipher = CIPHER_3DES;		else if (IsDlgButtonChecked (hwnd, IDC_CIPHERBLOWF))		    cfg.cipher = CIPHER_BLOWFISH;		else if (IsDlgButtonChecked (hwnd, IDC_CIPHERDES))		    cfg.cipher = CIPHER_DES;		else if (IsDlgButtonChecked (hwnd, IDC_CIPHERAES))		    cfg.cipher = CIPHER_AES;	    }	    break;	  case IDC_SSHPROT1:	  case IDC_SSHPROT2:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		if (IsDlgButtonChecked (hwnd, IDC_SSHPROT1))		    cfg.sshprot = 1;		else if (IsDlgButtonChecked (hwnd, IDC_SSHPROT2))		    cfg.sshprot = 2;	    }	    break;	  case IDC_AUTHTIS:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED)		cfg.try_tis_auth = IsDlgButtonChecked (hwnd, IDC_AUTHTIS);	    break;	  case IDC_PKEDIT:	    if (HIWORD(wParam) == EN_CHANGE)		GetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile,				sizeof(cfg.keyfile)-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 = "All Files\0*\0\0\0";            of.lpstrCustomFilter = NULL;            of.nFilterIndex = 1;            of.lpstrFile = filename; strcpy(filename, cfg.keyfile);            of.nMaxFile = sizeof(filename);            of.lpstrFileTitle = NULL;            of.lpstrInitialDir = NULL;            of.lpstrTitle = "Select Public Key File";            of.Flags = 0;            if (GetOpenFileName(&of)) {                strcpy(cfg.keyfile, filename);                SetDlgItemText (hwnd, IDC_PKEDIT, cfg.keyfile);            }	    break;	  case IDC_RAWCNP:	    cfg.rawcnp = IsDlgButtonChecked (hwnd, IDC_RAWCNP);	  case IDC_MBWINDOWS:	  case IDC_MBXTERM:	    cfg.mouse_is_xterm = IsDlgButtonChecked (hwnd, IDC_MBXTERM);	    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<256; 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);		n = SendDlgItemMessage (hwnd, IDC_COLOURLIST, LB_GETCOUNT, 0, 0);		if (n != 12+10*cfg.bold_colour) {		    for (i=n; i-- >0 ;)			SendDlgItemMessage (hwnd, IDC_COLOURLIST,						LB_DELETESTRING, i, 0);	            for (i=0; i<22; i++)	                if (cfg.bold_colour || permcolour[i])		            SendDlgItemMessage (hwnd, IDC_COLOURLIST, 				                LB_ADDSTRING, 0,				                (LPARAM) colours[i]);		}	    }	    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_NOXLAT:	  case IDC_KOI8WIN1251:	  case IDC_88592WIN1250:	  case IDC_88592CP852:	    cfg.xlat_enablekoiwin =		IsDlgButtonChecked (hwnd, IDC_KOI8WIN1251);	    cfg.xlat_88592w1250 =		IsDlgButtonChecked (hwnd, IDC_88592WIN1250);	    cfg.xlat_88592cp852 =		IsDlgButtonChecked (hwnd, IDC_88592CP852);	    break;	  case IDC_CAPSLOCKCYR:	    if (HIWORD(wParam) == BN_CLICKED ||		HIWORD(wParam) == BN_DOUBLECLICKED) {		cfg.xlat_capslockcyr =		    IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR);	    }	    break;	  case IDC_VTXWINDOWS:	  case IDC_VTOEMANSI:	  case IDC_VTOEMONLY:	  case IDC_VTPOORMAN:	    cfg.vtmode =		(IsDlgButtonChecked (hwnd, IDC_VTXWINDOWS) ? VT_XWINDOWS :		 IsDlgButtonChecked (hwnd, IDC_VTOEMANSI) ? VT_OEMANSI :		 IsDlgButtonChecked (hwnd, IDC_VTOEMONLY) ? VT_OEMONLY :		 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_X11_DISPLAY:            if (HIWORD(wParam) == EN_CHANGE)                GetDlgItemText (hwnd, IDC_X11_DISPLAY, cfg.x11_display,                                sizeof(cfg.x11_display)-1);            break;	}	return 0;      case WM_CLOSE:	EndDialog (hwnd, 0);	return 0;	/* Grrr Explorer will maximize Dialogs! */      case WM_SIZE:	if (wParam == SIZE_MAXIMIZED)	   force_normal(hwnd);	return 0;    }    return 0;}