1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 06:38:37 -05:00

Revamp the auto-layout of PuTTY configuration box controls. They are

now auto-laid-out at runtime instead of compile time. Byebye
win_res.inp and mkres.c; byebye most of win_res.rc; hello a whole
new load of control-creation functions in windlg.c. Also, now that
we're creating the tab control at runtime, we can check to see if it
succeeded and use an alternative if so. This _should_ enable the
config box to work on Win32s, although at the time of checkin that's
untested.

[originally from svn r673]
This commit is contained in:
Simon Tatham 2000-10-05 17:19:04 +00:00
parent 76746a7d61
commit 5d359d9528
5 changed files with 824 additions and 1078 deletions

343
mkres.c
View File

@ -1,343 +0,0 @@
/*
*
* Commands ...
*
* INIT(...) : Set configs. (rowstep, totwidth, stdheight, stdwidth)
* SPOS(V,H) : Set current position.
*
* SCOL : Standard column, for a single column, increment position
* NEXT(V,H) : increment postion by standard + (V,H)
* COL(K,N) : X,Y position for col K of N (default 1of [same as last])
* SS : Standard size of last COL (using number of cols).
* ADJ(V,H) : Adjust next COL or SCOL by (V,H)
*
* CURX(H) : Current Xpos+H
* CURY(V) : Current Ypos+V
*
*/
#include <stdio.h>
FILE * ifd;
FILE * ofd;
char wordbuf[256];
#define T_INIT 100 /* Init the style of the values */
#define T_SPOS 101 /* Set the current position */
#define T_SCOL 102 /* Standard column COL(1,1), SS NEXT */
#define T_NEXT 103 /* Next line */
#define T_COL 104 /* Multi-column */
#define T_SS 105 /* Standard Size */
#define T_ADJ 106 /* Adjust next COL/SCOL */
#define T_GRID 107 /* */
#define T_GAP 108 /* */
#define T_CURX 120 /* Current X + offset */
#define T_CURY 121 /* Current Y + offset */
#define T_SAVEPOSN 122 /* Save current status */
#define T_RESTOREPOSN 123 /* Restore current status */
struct keys {
char * name;
int token;
} keywords[] = {
{"INIT", T_INIT, },
{"SPOS", T_SPOS, },
{"SCOL", T_SCOL, },
{"NEXT", T_NEXT, },
{"COL", T_COL, },
{"SS", T_SS, },
{"ADJ", T_ADJ, },
{"GRID", T_GRID, },
{"GAP", T_GAP, },
{"CURX", T_CURX, },
{"CURY", T_CURY, },
{"SAVEPOSN", T_SAVEPOSN, },
{"RESTOREPOSN", T_RESTOREPOSN, },
{0,0}
};
struct statbuf {
int token;
int curx;
int cury;
int cols;
int con_width;
int con_height;
int row_step;
int tot_width;
int gutter;
int vadjust;
int hadjust;
}
status, saved_status;
int ar_count, ar_val[10];
main(argc, argv)
int argc;
char ** argv;
{
int ch;
ifd = stdin; ofd = stdout;
while(!feof(ifd))
{
if (ferror(ifd))
{
fprintf(stderr, "Error reading input file\n");
exit(1);
}
if (readword() < 0) break;
if (check_keys() < 0)
{
fprintf(ofd, "%s", wordbuf);
continue;
}
/* To get here we have found one of our keywords, some words will
* be followed by an argument.
*/
ar_count = 0;
while((ch = getc(ifd)) != EOF && isspace(ch) && ch != '\n')
putc(ch, ofd);
if (ch == '(' )
{
for(;;)
{
ar_val[ar_count++] = get_number();
while((ch=getc(ifd)) != EOF && isspace(ch)) ;
if (ch != ',') break;
}
if (ch == EOF) break;
}
else
ungetc(ch, ifd);
/* Ok got args, now doit */
execute_command();
}
exit(0);
}
/* This is the lexer - not using lex(1) because this will have to
* compile under windows.
*/
int readword()
{
int ch;
char *wp;
try_again:; /* This is for "too big" words and strings. */
wp=wordbuf;
/* Find a word ... */
while((ch=getc(ifd)) != EOF && !isalpha(ch) && ch != '"')
putc(ch, ofd);
if (ch == '"')
{
putc(ch, ofd);
while((ch=getc(ifd)) != EOF && ch != '"')
putc(ch, ofd);
if (ch != EOF)
putc(ch, ofd);
goto try_again;
}
if (ch == EOF) return -1;
do
{
if (wp>=wordbuf+sizeof(wordbuf)-2)
{
*wp = 0;
fprintf(ofd, "%s", wordbuf);
while(ch!=EOF && isalpha(ch))
{
putc(ch, ofd);
ch=getc(ifd);
}
ungetc(ch, ifd);
goto try_again;
}
*wp++ = ch;
ch = getc(ifd);
}
while(ch != EOF && (isalnum(ch) || ch == '_'));
*wp = 0;
ungetc(ch, ifd);
return wp-wordbuf;
}
int
get_number()
{
int ch;
int sign = 0;
int value = 0;
while((ch=getc(ifd)) != EOF && isspace(ch)) ;
if( ch == '+' ) { sign=1; ch=getc(ifd); }
else if( ch == '-' ) { sign=-1; ch=getc(ifd); }
while(ch>='0' && ch<='9')
{
value = value * 10 + ch - '0';
ch = getc(ifd);
}
ungetc(ch, ifd);
if (sign < 0) value = -value;
return value;
}
check_keys()
{
struct keys *p;
for(p=keywords; p->name; p++)
{
if (strcmp(wordbuf, p->name) == 0 )
{
status.token = p->token;
return p->token;
}
}
return -1;
}
execute_command()
{
if (status.cols < 1) status.cols = 1;
switch(status.token)
{
case T_INIT:
if (ar_count > 0) status.row_step = ar_val[0];
if (ar_count > 1) status.tot_width = ar_val[1];
if (ar_count > 2) status.con_height = ar_val[2];
else status.con_height = status.row_step;
if (ar_count > 3) status.con_width = ar_val[3];
else status.con_width = status.tot_width;
status.gutter = ( status.tot_width - status.con_width ) /2;
break;
case T_SPOS:
status.cury = status.curx = 0;
if (ar_count > 0) status.cury = ar_val[0];
if (ar_count > 1) status.curx = ar_val[1];
break;
case T_SCOL:
fprintf(ofd, "%d, %d", status.curx + status.hadjust,
status.cury + status.vadjust);
status.hadjust = status.vadjust = 0;
fprintf(ofd, ", %d, %d", status.con_width, status.con_height);
status.cury += status.row_step;
if (ar_count > 0) status.cury += ar_val[0];
if (ar_count > 1) status.curx += ar_val[1];
break;
case T_NEXT:
status.cury += status.row_step;
if (ar_count > 0) status.cury += ar_val[0];
if (ar_count > 1) status.curx += ar_val[1];
break;
case T_COL:
{
int curcol;
int col_pos;
if (ar_count > 0) curcol = ar_val[0]; else curcol = 1;
if (ar_count > 1) status.cols = ar_val[1];
col_pos = (status.con_width+status.gutter) *(curcol-1) /status.cols;
fprintf(ofd, "%d, %d",
status.curx + status.hadjust + col_pos,
status.cury + status.vadjust);
status.hadjust = status.vadjust = 0;
}
break;
case T_SS:
{
int wm = 1, hm=1;
int width;
if (ar_count > 0) wm = ar_val[0];
if (ar_count > 1) hm = ar_val[1];
width = (status.con_width+status.gutter) / status.cols;
width *= wm;
width -= status.gutter;
fprintf(ofd, "%d, %d", width, hm*status.con_height);
}
break;
case T_ADJ:
if (ar_count > 0) status.vadjust = ar_val[0];
if (ar_count > 1) status.hadjust = ar_val[0];
break;
case T_GRID:
if (ar_count > 0) status.cols = ar_val[0];
else status.cols = 1;
if (ar_count > 1) status.con_height = ar_val[1];
if (ar_count > 2) status.row_step = ar_val[2];
break;
case T_GAP:
if (ar_count > 0) status.cury += ar_val[0];
else status.cury += 2;
break;
case T_CURX:
if (ar_count>0)
fprintf(ofd, "%d", status.curx+ar_val[0]);
else
fprintf(ofd, "%d", status.curx);
break;
case T_CURY:
if (ar_count>0)
fprintf(ofd, "%d", status.cury+ar_val[0]);
else
fprintf(ofd, "%d", status.cury);
break;
case T_SAVEPOSN:
saved_status = status;
break;
case T_RESTOREPOSN:
status = saved_status;
break;
}
}

View File

@ -28,7 +28,10 @@
#define IDA_LICENCE 1005 #define IDA_LICENCE 1005
#define IDC_TAB 1001 #define IDC_TAB 1001
#define IDC_ABOUT 1002 #define IDC_TABSTATIC1 1002
#define IDC_TABSTATIC2 1003
#define IDC_TABLIST 1004
#define IDC_ABOUT 1005
#define IDC0_HOSTSTATIC 1001 #define IDC0_HOSTSTATIC 1001
#define IDC0_HOST 1002 #define IDC0_HOST 1002

View File

@ -1,401 +0,0 @@
/* Some compilers, like Borland, don't have winresrc.h */
#ifndef NO_WINRESRC_H
#include <winresrc.h>
#endif
/* Some systems don't define this, so I do it myself if necessary */
#ifndef TCS_MULTILINE
#define TCS_MULTILINE 0x0200
#endif
#ifdef MINGW32_FIX
#define EDITTEXT EDITTEXT "",
#endif
#include "win_res.h"
IDI_MAINICON ICON "putty.ico"
/* Accelerators used: cl */
IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 136, 70
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About PuTTY"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&Close", IDOK, 82, 52, 48, 14
PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 52, 70, 14
CTEXT "PuTTY", IDA_TEXT1, 10, 6, 120, 8
CTEXT "", IDA_VERSION, 10, 16, 120, 16
CTEXT "\251 1997-2000 Simon Tatham. All rights reserved.",
IDA_TEXT2, 10, 34, 120, 16
END
/* Accelerators used: aco */
IDD_MAINBOX DIALOG DISCARDABLE 0, 0, 180, 216
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "PuTTY Configuration"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&Open", IDOK, 86, 199, 44, 14
PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14
PUSHBUTTON "&About", IDC_ABOUT, 3, 199, 44, 14, NOT WS_TABSTOP
CONTROL "", IDC_TAB,
#ifdef ASCIICTLS
"SysTabControl32",
#else
L"SysTabControl32",
#endif
TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193
END
/* Accelerators used: ac */
IDD_RECONF DIALOG DISCARDABLE 0, 0, 180, 216
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "PuTTY Reconfiguration"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&Apply", IDOK, 86, 199, 44, 14
PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14
CONTROL "", IDC_TAB,
#ifdef ASCIICTLS
"SysTabControl32",
#else
L"SysTabControl32",
#endif
TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193
END
/* Accelerators used: [aco] dehlnprstwx */
IDD_PANEL0 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(0,176,4,162) SPOS(3,3)
BEGIN
GRID(4,4,24)
LTEXT "Host &Name", IDC0_HOSTSTATIC, COL(1), SS(3,2)
EDITTEXT IDC0_HOST, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL
LTEXT "&Port", IDC0_PORTSTATIC, COL(4), SS(1,2)
EDITTEXT IDC0_PORT, ADJ(8) COL(4), SS(1,3)
NEXT
GRID(4,8,10)
#ifdef FWHACK
RTEXT "Protocol:", IDC0_PROTSTATIC, COL(1), SS
AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, COL(2), SS, WS_GROUP
AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, COL(3), SS
AUTORADIOBUTTON "SS&H/hack", IDC0_PROTSSH, COL(4), SS
#else
RTEXT "Protocol:", IDC0_PROTSTATIC, COL(1), SS
AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, COL(2), SS, WS_GROUP
AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, COL(3), SS
#ifndef NO_SSH
AUTORADIOBUTTON "SS&H", IDC0_PROTSSH, COL(4), SS
#endif
#endif
NEXT
GRID(1,8,8)
LTEXT "Stor&ed Sessions", IDC0_SESSSTATIC, SCOL
GRID(4,12,14)
EDITTEXT IDC0_SESSEDIT, COL(1), SS(3), ES_AUTOHSCROLL
NEXT
GRID(4,71,0)
LISTBOX IDC0_SESSLIST, COL(1), SS(3),
LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
GRID(4,14,17)
PUSHBUTTON "&Load", IDC0_SESSLOAD, COL(4), SS NEXT
PUSHBUTTON "&Save", IDC0_SESSSAVE, COL(4), SS NEXT
PUSHBUTTON "&Delete", IDC0_SESSDEL, COL(4), SS NEXT
GAP(20)
GRID(1,8,10)
AUTOCHECKBOX "Close Window on E&xit", IDC0_CLOSEEXIT, SCOL
AUTOCHECKBOX "&Warn on Close", IDC0_CLOSEWARN, SCOL
END
/* Accelerators used: [aco] 4?ehiklmnprsuvxy */
IDD_PANEL1 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3) GRID(3)
BEGIN
LTEXT "Action of Backspace:", IDC1_DELSTATIC, SCOL
AUTORADIOBUTTON "Control-&H", IDC1_DEL008, COL(1), SS, WS_GROUP
AUTORADIOBUTTON "Control-&? (127)", IDC1_DEL127, COL(2), SS(2)
NEXT(2)
LTEXT "Action of Home and End:", IDC1_HOMESTATIC, SCOL
AUTORADIOBUTTON "&Standard", IDC1_HOMETILDE, COL(1), SS, WS_GROUP
AUTORADIOBUTTON "&rxvt", IDC1_HOMERXVT, COL(2), SS
NEXT(2)
LTEXT "Function key and keypad layout:", IDC1_FUNCSTATIC, SCOL
AUTORADIOBUTTON "&VT400", IDC1_FUNCTILDE, COL(1), SS, WS_GROUP
AUTORADIOBUTTON "&Linux", IDC1_FUNCLINUX, COL(2), SS
AUTORADIOBUTTON "&Xterm R6", IDC1_FUNCXTERM, COL(3), SS
NEXT(2)
LTEXT "Initial state of cursor keys:", IDC1_CURSTATIC, SCOL
AUTORADIOBUTTON "&Normal", IDC1_CURNORMAL, COL(1), SS, WS_GROUP
AUTORADIOBUTTON "A&pplication", IDC1_CURAPPLIC, COL(2), SS
NEXT(2)
LTEXT "Initial state of numeric keypad:", IDC1_KPSTATIC, SCOL
AUTORADIOBUTTON "Nor&mal", IDC1_KPNORMAL, COL(1), SS, WS_GROUP
AUTORADIOBUTTON "Appl&ication", IDC1_KPAPPLIC, COL(2), SS
AUTORADIOBUTTON "N&etHack", IDC1_KPNH, COL(3), SS
NEXT(2)
AUTOCHECKBOX "ALT-F&4 is special (closes window)", IDC1_ALTF4, SCOL
AUTOCHECKBOX "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE, SCOL
AUTOCHECKBOX "&Use local terminal line discipline", IDC1_LDISCTERM, SCOL
AUTOCHECKBOX "Reset scrollback on &keypress", IDC1_SCROLLKEY, SCOL
END
/* Accelerators used: [aco] dghlmnprsw */
IDD_PANEL2 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(1,8,10)
LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, SCOL
GRID(4,4,15)
RTEXT "&Rows", IDC2_ROWSSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC2_ROWSEDIT, COL(2), SS(1,3)
RTEXT "Colu&mns", IDC2_COLSSTATIC, ADJ(2) COL(3), SS(1,2)
EDITTEXT IDC2_COLSEDIT, COL(4), SS(1,3)
NEXT
RTEXT "&Saved lines of scrollback", IDC2_SAVESTATIC, ADJ(2) COL(1), SS(3,2)
EDITTEXT IDC2_SAVEEDIT, COL(4), SS(1,3)
NEXT(2)
GRID(3,8,0)
RTEXT "Font:", IDC2_FONTSTATIC, ADJ(3) COL(1), SS(2)
GRID(3,14,17)
PUSHBUTTON "C&hange...", IDC2_CHOOSEFONT, COL(3), SS(1)
NEXT
GRID(1,8,10)
AUTOCHECKBOX "Auto &wrap mode initially on", IDC2_WRAPMODE, SCOL
AUTOCHECKBOX "&DEC Origin Mode initially on", IDC2_DECOM, SCOL
AUTOCHECKBOX "Implicit CR in every &LF", IDC2_LFHASCR, SCOL
AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, SCOL
AUTOCHECKBOX "Use Back&ground colour erase", IDC2_BCE, SCOL
AUTOCHECKBOX "Enable bli&nking text", IDC2_BLINKTEXT, SCOL
GAP(6)
GAP(6)
GAP(6)
END
/* Accelerators used: [aco] bikty */
IDD_PANELW DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(4,4,24)
LTEXT "Initial window &title:", IDCW_WINTITLE, COL(1), SS(3,2)
EDITTEXT IDCW_WINEDIT, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL
NEXT(2)
GRID(1,8,10)
AUTOCHECKBOX "Avoid ever using &icon title", IDCW_WINNAME, SCOL
AUTOCHECKBOX "&Blinking cursor", IDCW_BLINKCUR, SCOL
AUTOCHECKBOX "Displa&y scrollbar", IDCW_SCROLLBAR, SCOL
AUTOCHECKBOX "Loc&k Window size", IDCW_LOCKSIZE, SCOL
END
/* Accelerators used: [aco] bdflrstuv */
IDD_PANEL3 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(2,4,14)
LTEXT "Terminal-&type string", IDC3_TTSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_TTEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
NEXT
LTEXT "Terminal-&speed string", IDC3_TSSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_TSEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
NEXT
LTEXT "Auto-login &username", IDC3_LOGSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_LOGEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
NEXT
GAP(8)
GRID(1,8,10)
LTEXT "Environment variables:", IDC3_ENVSTATIC, SCOL
GRID(5,4,14)
LTEXT "&Variable", IDC3_VARSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_VAREDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
LTEXT "Va&lue", IDC3_VALSTATIC, ADJ(2) COL(3), SS(1,2)
EDITTEXT IDC3_VALEDIT, COL(4), SS(2,3), ES_AUTOHSCROLL
NEXT
GAP(4)
GRID(4,55,0)
LISTBOX IDC3_ENVLIST, COL(1), SS(3),
LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP
GRID(4,14,17)
PUSHBUTTON "A&dd", IDC3_ENVADD, COL(4), SS NEXT
PUSHBUTTON "&Remove", IDC3_ENVREMOVE, COL(4), SS NEXT
GAP(21)
GRID(4,8,10)
LTEXT "ENVIRON interpretation:", IDC3_EMSTATIC, COL(1), SS(2)
AUTORADIOBUTTON "&BSD", IDC3_EMBSD, COL(3), SS, WS_GROUP
AUTORADIOBUTTON "R&FC", IDC3_EMRFC, COL(4), SS
NEXT
END
/* Accelerators used: [aco] 123abdhkmprtu */
IDD_PANEL35 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(2,4,16)
LTEXT "Terminal-&type string", IDC3_TTSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_TTEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
NEXT
GRID(1,8,10)
AUTOCHECKBOX "Don't allocate a &pseudo-terminal", IDC3_NOPTY, SCOL
GRID(2,4,16)
LTEXT "Auto-login &username", IDC3_LOGSTATIC, ADJ(2) COL(1), SS(1,2)
EDITTEXT IDC3_LOGEDIT, COL(2), SS(1,3), ES_AUTOHSCROLL
NEXT
GRID(11,8,10)
LTEXT "Cipher:", IDC3_CIPHERSTATIC, COL(1), SS(2)
AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, COL(3), SS(3), WS_GROUP
AUTORADIOBUTTON "&Blowfish", IDC3_CIPHERBLOWF, COL(6), SS(3)
AUTORADIOBUTTON "&DES", IDC3_CIPHERDES, COL(9), SS(3)
NEXT
GRID(1,8,10)
AUTOCHECKBOX "Atte&mpt TIS or CryptoCard authentication", IDC3_AUTHTIS, SCOL
NEXT
GRID(6,8,10)
LTEXT "Prefer protocol version:", IDC3_SSHPROTSTATIC, COL(1), SS(4)
AUTORADIOBUTTON "&1", IDC3_SSHPROT1, COL(5), SS, WS_GROUP
AUTORADIOBUTTON "&2", IDC3_SSHPROT2, COL(6), SS
NEXT
GRID(4,4,24)
LTEXT "Public &key file:", IDC3_PKSTATIC, COL(1), SS(3,2)
EDITTEXT IDC3_PKEDIT, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL
NEXT(2)
LTEXT "&Remote command:", IDC3_CMDSTATIC, COL(1), SS(3,2)
EDITTEXT IDC3_CMDEDIT, ADJ(8) COL(1), SS(3,3), ES_AUTOHSCROLL
GRID(4,12,24)
PUSHBUTTON "C&hange...", IDC3_PKBUTTON, ADJ(8) COL(4), SS(1)
NEXT
GRID(1,8,10)
AUTOCHECKBOX "Allow &agent forwarding", IDC3_AGENTFWD, SCOL
END
/* Accelerators used: [aco] stwx */
IDD_PANEL4 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(1,8,10)
LTEXT "Action of mouse buttons:", IDC4_MBSTATIC, SCOL
AUTORADIOBUTTON "&Windows (Right pastes, Middle extends)",
IDC4_MBWINDOWS, SCOL, WS_GROUP
AUTORADIOBUTTON "&xterm (Right extends, Middle pastes)",
IDC4_MBXTERM, SCOL
GAP(4)
LTEXT "Character classes:", IDC4_CCSTATIC, SCOL
GRID(1,96,100)
LISTBOX IDC4_CCLIST, SCOL,
LBS_HASSTRINGS | WS_VSCROLL | LBS_USETABSTOPS | LBS_MULTIPLESEL | WS_TABSTOP
GRID(1,14,17)
PUSHBUTTON "&Set", IDC4_CCSET, 33, CURY, 34, 14
LTEXT "&to class", IDC4_CCSTATIC2, 73, CURY+3, 26, 8
EDITTEXT IDC4_CCEDIT, 105, CURY+1, 36, 12
NEXT
END
/* Accelerators used: [aco] bhlu */
IDD_PANEL5 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(1,8,10)
AUTOCHECKBOX "&Bolded text is a different colour", IDC5_BOLDCOLOUR, SCOL
GAP(6)
AUTOCHECKBOX "Attempt to use &logical palettes", IDC5_PALETTE, SCOL
GAP(6)
LTEXT "Colo&urs:", IDC5_STATIC, SCOL
LISTBOX IDC5_LIST, 3, CURY, 100, 110,
LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
LTEXT "Red:", IDC5_RSTATIC, 109, CURY, 27, 8
RTEXT "", IDC5_RVALUE, 138, CURY, 27, 8
LTEXT "Green:", IDC5_GSTATIC, 109, CURY+8, 27, 8
RTEXT "", IDC5_GVALUE, 138, CURY+8, 27, 8
LTEXT "Blue:", IDC5_BSTATIC, 109, CURY+16, 27, 8
RTEXT "", IDC5_BVALUE, 138, CURY+16, 27, 8
GAP(90)
PUSHBUTTON "C&hange...", IDC5_CHANGE, 109, CURY, 56, 14
GAP(17)
END
/* Accelerators used: [aco] beiknpsx */
IDD_PANEL6 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE
FONT 8, "MS Sans Serif"
INIT(10,176,8,162) SPOS(3,3)
BEGIN
GRID(1,8,10)
LTEXT "Handling of VT100 line drawing characters:",IDC2_VTSTATIC, SCOL
AUTORADIOBUTTON "Font has &XWindows encoding",
IDC2_VTXWINDOWS, SCOL, WS_GROUP
AUTORADIOBUTTON "Use font in &both ANSI and OEM modes",
IDC2_VTOEMANSI, SCOL
AUTORADIOBUTTON "Use font in O&EM mode only",
IDC2_VTOEMONLY, SCOL
AUTORADIOBUTTON "&Poor man's line drawing (""+"", ""-"" and ""|"")",
IDC2_VTPOORMAN, SCOL
GAP(6)
LTEXT "Character set translation:", IDC6_XLATSTATIC, SCOL
AUTORADIOBUTTON "&None", IDC6_NOXLAT, SCOL, WS_GROUP
AUTORADIOBUTTON "&KOI8 / Win-1251", IDC6_KOI8WIN1251, SCOL
AUTORADIOBUTTON "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, SCOL
GAP(6)
AUTOCHECKBOX "CAP&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, SCOL
GAP(6)
END
/* Accelerators used: c */
IDD_LOGBOX DIALOG DISCARDABLE 100, 20, 160, 119
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "PuTTY Event Log"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "&Close", IDOK, 58, 102, 44, 14
LISTBOX IDN_LIST, 3, 3, 154, 95, LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL
END
/* No accelerators used */
IDD_LICENCEBOX DIALOG DISCARDABLE 50, 50, 226, 223
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "PuTTY Licence"
FONT 8, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK", IDOK, 98, 203, 44, 14
LTEXT "Copyright \251 1997-2000 Simon Tatham", 1000, 10, 10, 206, 8
LTEXT "Permission is hereby granted, free of charge, to any person", 1002, 10, 26, 206, 8
LTEXT "obtaining a copy of this software and associated documentation", 1003, 10, 34, 206, 8
LTEXT "files (the ""Software""), to deal in the Software without restriction,", 1004, 10, 42, 206, 8
LTEXT "including without limitation the rights to use, copy, modify, merge,", 1005, 10, 50, 206, 8
LTEXT "publish, distribute, sublicense, and/or sell copies of the Software,", 1006, 10, 58, 206, 8
LTEXT "and to permit persons to whom the Software is furnished to do so,", 1007, 10, 66, 206, 8
LTEXT "subject to the following conditions:", 1008, 10, 74, 206, 8
LTEXT "The above copyright notice and this permission notice shall be", 1010, 10, 90, 206, 8
LTEXT "included in all copies or substantial portions of the Software.", 1011, 10, 98, 206, 8
LTEXT "THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT", 1013, 10, 114, 206, 8
LTEXT "WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,", 1014, 10, 122, 206, 8
LTEXT "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF", 1015, 10, 130, 206, 8
LTEXT "MERCHANTABILITY, FITNESS FOR A PARTICULAR", 1016, 10, 138, 206, 8
LTEXT "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL", 1017, 10, 146, 206, 8
LTEXT "SIMON TATHAM BE LIABLE FOR ANY CLAIM, DAMAGES OR", 1018, 10, 154, 206, 8
LTEXT "OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,", 1019, 10, 162, 206, 8
LTEXT "TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN", 1020, 10, 170, 206, 8
LTEXT "CONNECTION WITH THE SOFTWARE OR THE USE OR", 1021, 10, 178, 206, 8
LTEXT "OTHER DEALINGS IN THE SOFTWARE.", 1022, 10, 186, 206, 8
END

View File

@ -39,13 +39,6 @@ BEGIN
DEFPUSHBUTTON "&Open", IDOK, 86, 199, 44, 14 DEFPUSHBUTTON "&Open", IDOK, 86, 199, 44, 14
PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14
PUSHBUTTON "&About", IDC_ABOUT, 3, 199, 44, 14, NOT WS_TABSTOP PUSHBUTTON "&About", IDC_ABOUT, 3, 199, 44, 14, NOT WS_TABSTOP
CONTROL "", IDC_TAB,
#ifdef ASCIICTLS
"SysTabControl32",
#else
L"SysTabControl32",
#endif
TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193
END END
/* Accelerators used: ac */ /* Accelerators used: ac */
@ -56,304 +49,6 @@ FONT 8, "MS Sans Serif"
BEGIN BEGIN
DEFPUSHBUTTON "&Apply", IDOK, 86, 199, 44, 14 DEFPUSHBUTTON "&Apply", IDOK, 86, 199, 44, 14
PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14 PUSHBUTTON "&Cancel", IDCANCEL, 133, 199, 44, 14
CONTROL "", IDC_TAB,
#ifdef ASCIICTLS
"SysTabControl32",
#else
L"SysTabControl32",
#endif
TCS_MULTILINE | WS_TABSTOP, 3, 3, 174, 193
END
/* Accelerators used: [aco] dehlnprstwx */
IDD_PANEL0 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Host &Name", IDC0_HOSTSTATIC, 3, 3, 119, 8
EDITTEXT IDC0_HOST, 3, 11, 119, 12, ES_AUTOHSCROLL
LTEXT "&Port", IDC0_PORTSTATIC, 129, 3, 35, 8
EDITTEXT IDC0_PORT, 129, 11, 35, 12
#ifdef FWHACK
RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 27, 35, 8
AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, 45, 27, 35, 8, WS_GROUP
AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 87, 27, 35, 8
AUTORADIOBUTTON "SS&H/hack", IDC0_PROTSSH, 129, 27, 35, 8
#else
RTEXT "Protocol:", IDC0_PROTSTATIC, 3, 27, 35, 8
AUTORADIOBUTTON "&Raw", IDC0_PROTRAW, 45, 27, 35, 8, WS_GROUP
AUTORADIOBUTTON "&Telnet", IDC0_PROTTELNET, 87, 27, 35, 8
#ifndef NO_SSH
AUTORADIOBUTTON "SS&H", IDC0_PROTSSH, 129, 27, 35, 8
#endif
#endif
LTEXT "Stor&ed Sessions", IDC0_SESSSTATIC, 3, 37, 162, 8
EDITTEXT IDC0_SESSEDIT, 3, 45, 119, 12, ES_AUTOHSCROLL
LISTBOX IDC0_SESSLIST, 3, 59, 119, 71,
LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "&Load", IDC0_SESSLOAD, 129, 59, 35, 14
PUSHBUTTON "&Save", IDC0_SESSSAVE, 129, 76, 35, 14
PUSHBUTTON "&Delete", IDC0_SESSDEL, 129, 93, 35, 14
AUTOCHECKBOX "Close Window on E&xit", IDC0_CLOSEEXIT, 3, 130, 162, 8
AUTOCHECKBOX "&Warn on Close", IDC0_CLOSEWARN, 3, 140, 162, 8
END
/* Accelerators used: [aco] 4?ehiklmnprsuvxy */
IDD_PANEL1 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Action of Backspace:", IDC1_DELSTATIC, 3, 3, 162, 8
AUTORADIOBUTTON "Control-&H", IDC1_DEL008, 3, 13, 49, 8, WS_GROUP
AUTORADIOBUTTON "Control-&? (127)", IDC1_DEL127, 59, 13, 105, 8
LTEXT "Action of Home and End:", IDC1_HOMESTATIC, 3, 25, 162, 8
AUTORADIOBUTTON "&Standard", IDC1_HOMETILDE, 3, 35, 49, 8, WS_GROUP
AUTORADIOBUTTON "&rxvt", IDC1_HOMERXVT, 59, 35, 49, 8
LTEXT "Function key and keypad layout:", IDC1_FUNCSTATIC, 3, 47, 162, 8
AUTORADIOBUTTON "&VT400", IDC1_FUNCTILDE, 3, 57, 49, 8, WS_GROUP
AUTORADIOBUTTON "&Linux", IDC1_FUNCLINUX, 59, 57, 49, 8
AUTORADIOBUTTON "&Xterm R6", IDC1_FUNCXTERM, 115, 57, 49, 8
LTEXT "Initial state of cursor keys:", IDC1_CURSTATIC, 3, 69, 162, 8
AUTORADIOBUTTON "&Normal", IDC1_CURNORMAL, 3, 79, 49, 8, WS_GROUP
AUTORADIOBUTTON "A&pplication", IDC1_CURAPPLIC, 59, 79, 49, 8
LTEXT "Initial state of numeric keypad:", IDC1_KPSTATIC, 3, 91, 162, 8
AUTORADIOBUTTON "Nor&mal", IDC1_KPNORMAL, 3, 101, 49, 8, WS_GROUP
AUTORADIOBUTTON "Appl&ication", IDC1_KPAPPLIC, 59, 101, 49, 8
AUTORADIOBUTTON "N&etHack", IDC1_KPNH, 115, 101, 49, 8
AUTOCHECKBOX "ALT-F&4 is special (closes window)", IDC1_ALTF4, 3, 113, 162, 8
AUTOCHECKBOX "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE, 3, 123, 162, 8
AUTOCHECKBOX "&Use local terminal line discipline", IDC1_LDISCTERM, 3, 133, 162, 8
AUTOCHECKBOX "Reset scrollback on &keypress", IDC1_SCROLLKEY, 3, 143, 162, 8
END
/* Accelerators used: [aco] dghlmnprsw */
IDD_PANEL2 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Terminal screen dimensions:", IDC2_DIMSTATIC, 3, 3, 162, 8
RTEXT "&Rows", IDC2_ROWSSTATIC, 3, 15, 35, 8
EDITTEXT IDC2_ROWSEDIT, 45, 13, 35, 12
RTEXT "Colu&mns", IDC2_COLSSTATIC, 87, 15, 35, 8
EDITTEXT IDC2_COLSEDIT, 129, 13, 35, 12
RTEXT "&Saved lines of scrollback", IDC2_SAVESTATIC, 3, 30, 119, 8
EDITTEXT IDC2_SAVEEDIT, 129, 28, 35, 12
RTEXT "Font:", IDC2_FONTSTATIC, 3, 48, 105, 8
PUSHBUTTON "C&hange...", IDC2_CHOOSEFONT, 115, 45, 49, 14
AUTOCHECKBOX "Auto &wrap mode initially on", IDC2_WRAPMODE, 3, 62, 162, 8
AUTOCHECKBOX "&DEC Origin Mode initially on", IDC2_DECOM, 3, 72, 162, 8
AUTOCHECKBOX "Implicit CR in every &LF", IDC2_LFHASCR, 3, 82, 162, 8
AUTOCHECKBOX "Bee&p enabled", IDC1_BEEP, 3, 92, 162, 8
AUTOCHECKBOX "Use Back&ground colour erase", IDC2_BCE, 3, 102, 162, 8
AUTOCHECKBOX "Enable bli&nking text", IDC2_BLINKTEXT, 3, 112, 162, 8
END
/* Accelerators used: [aco] bikty */
IDD_PANELW DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Initial window &title:", IDCW_WINTITLE, 3, 3, 119, 8
EDITTEXT IDCW_WINEDIT, 3, 11, 119, 12, ES_AUTOHSCROLL
AUTOCHECKBOX "Avoid ever using &icon title", IDCW_WINNAME, 3, 29, 162, 8
AUTOCHECKBOX "&Blinking cursor", IDCW_BLINKCUR, 3, 39, 162, 8
AUTOCHECKBOX "Displa&y scrollbar", IDCW_SCROLLBAR, 3, 49, 162, 8
AUTOCHECKBOX "Loc&k Window size", IDCW_LOCKSIZE, 3, 59, 162, 8
END
/* Accelerators used: [aco] bdflrstuv */
IDD_PANEL3 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Terminal-&type string", IDC3_TTSTATIC, 3, 5, 77, 8
EDITTEXT IDC3_TTEDIT, 87, 3, 77, 12, ES_AUTOHSCROLL
LTEXT "Terminal-&speed string", IDC3_TSSTATIC, 3, 19, 77, 8
EDITTEXT IDC3_TSEDIT, 87, 17, 77, 12, ES_AUTOHSCROLL
LTEXT "Auto-login &username", IDC3_LOGSTATIC, 3, 33, 77, 8
EDITTEXT IDC3_LOGEDIT, 87, 31, 77, 12, ES_AUTOHSCROLL
LTEXT "Environment variables:", IDC3_ENVSTATIC, 3, 53, 162, 8
LTEXT "&Variable", IDC3_VARSTATIC, 3, 65, 26, 8
EDITTEXT IDC3_VAREDIT, 36, 63, 26, 12, ES_AUTOHSCROLL
LTEXT "Va&lue", IDC3_VALSTATIC, 70, 65, 26, 8
EDITTEXT IDC3_VALEDIT, 104, 63, 59, 12, ES_AUTOHSCROLL
LISTBOX IDC3_ENVLIST, 3, 81, 119, 55,
LBS_HASSTRINGS | LBS_USETABSTOPS | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "A&dd", IDC3_ENVADD, 129, 81, 35, 14
PUSHBUTTON "&Remove", IDC3_ENVREMOVE, 129, 98, 35, 14
LTEXT "ENVIRON interpretation:", IDC3_EMSTATIC, 3, 136, 77, 8
AUTORADIOBUTTON "&BSD", IDC3_EMBSD, 87, 136, 35, 8, WS_GROUP
AUTORADIOBUTTON "R&FC", IDC3_EMRFC, 129, 136, 35, 8
END
/* Accelerators used: [aco] 123abdhkmprtu */
IDD_PANEL35 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Terminal-&type string", IDC3_TTSTATIC, 3, 5, 77, 8
EDITTEXT IDC3_TTEDIT, 87, 3, 77, 12, ES_AUTOHSCROLL
AUTOCHECKBOX "Don't allocate a &pseudo-terminal", IDC3_NOPTY, 3, 19, 162, 8
LTEXT "Auto-login &username", IDC3_LOGSTATIC, 3, 31, 77, 8
EDITTEXT IDC3_LOGEDIT, 87, 29, 77, 12, ES_AUTOHSCROLL
LTEXT "Cipher:", IDC3_CIPHERSTATIC, 3, 45, 23, 8
AUTORADIOBUTTON "&3DES", IDC3_CIPHER3DES, 33, 45, 38, 8, WS_GROUP
AUTORADIOBUTTON "&Blowfish", IDC3_CIPHERBLOWF, 79, 45, 38, 8
AUTORADIOBUTTON "&DES", IDC3_CIPHERDES, 125, 45, 38, 8
AUTOCHECKBOX "Atte&mpt TIS or CryptoCard authentication", IDC3_AUTHTIS, 3, 55, 162, 8
LTEXT "Prefer protocol version:", IDC3_SSHPROTSTATIC, 3, 75, 105, 8
AUTORADIOBUTTON "&1", IDC3_SSHPROT1, 115, 75, 21, 8, WS_GROUP
AUTORADIOBUTTON "&2", IDC3_SSHPROT2, 143, 75, 21, 8
LTEXT "Public &key file:", IDC3_PKSTATIC, 3, 85, 119, 8
EDITTEXT IDC3_PKEDIT, 3, 93, 119, 12, ES_AUTOHSCROLL
LTEXT "&Remote command:", IDC3_CMDSTATIC, 3, 111, 119, 8
EDITTEXT IDC3_CMDEDIT, 3, 119, 119, 12, ES_AUTOHSCROLL
PUSHBUTTON "C&hange...", IDC3_PKBUTTON, 129, 119, 35, 12
AUTOCHECKBOX "Allow &agent forwarding", IDC3_AGENTFWD, 3, 135, 162, 8
END
/* Accelerators used: [aco] stwx */
IDD_PANEL4 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Action of mouse buttons:", IDC4_MBSTATIC, 3, 3, 162, 8
AUTORADIOBUTTON "&Windows (Right pastes, Middle extends)",
IDC4_MBWINDOWS, 3, 13, 162, 8, WS_GROUP
AUTORADIOBUTTON "&xterm (Right extends, Middle pastes)",
IDC4_MBXTERM, 3, 23, 162, 8
LTEXT "Character classes:", IDC4_CCSTATIC, 3, 37, 162, 8
LISTBOX IDC4_CCLIST, 3, 47, 162, 96,
LBS_HASSTRINGS | WS_VSCROLL | LBS_USETABSTOPS | LBS_MULTIPLESEL | WS_TABSTOP
PUSHBUTTON "&Set", IDC4_CCSET, 33, 147, 34, 14
LTEXT "&to class", IDC4_CCSTATIC2, 73, 147+3, 26, 8
EDITTEXT IDC4_CCEDIT, 105, 147+1, 36, 12
END
/* Accelerators used: [aco] bhlu */
IDD_PANEL5 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE | NOT WS_BORDER
FONT 8, "MS Sans Serif"
BEGIN
AUTOCHECKBOX "&Bolded text is a different colour", IDC5_BOLDCOLOUR, 3, 3, 162, 8
AUTOCHECKBOX "Attempt to use &logical palettes", IDC5_PALETTE, 3, 19, 162, 8
LTEXT "Colo&urs:", IDC5_STATIC, 3, 35, 162, 8
LISTBOX IDC5_LIST, 3, 45, 100, 110,
LBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP
LTEXT "Red:", IDC5_RSTATIC, 109, 45, 27, 8
RTEXT "", IDC5_RVALUE, 138, 45, 27, 8
LTEXT "Green:", IDC5_GSTATIC, 109, 45+8, 27, 8
RTEXT "", IDC5_GVALUE, 138, 45+8, 27, 8
LTEXT "Blue:", IDC5_BSTATIC, 109, 45+16, 27, 8
RTEXT "", IDC5_BVALUE, 138, 45+16, 27, 8
PUSHBUTTON "C&hange...", IDC5_CHANGE, 109, 135, 56, 14
END
/* Accelerators used: [aco] beiknpsx */
IDD_PANEL6 DIALOG DISCARDABLE 6, 30, 168, 163
STYLE WS_CHILD | WS_VISIBLE
FONT 8, "MS Sans Serif"
BEGIN
LTEXT "Handling of VT100 line drawing characters:",IDC2_VTSTATIC, 3, 3, 162, 8
AUTORADIOBUTTON "Font has &XWindows encoding",
IDC2_VTXWINDOWS, 3, 13, 162, 8, WS_GROUP
AUTORADIOBUTTON "Use font in &both ANSI and OEM modes",
IDC2_VTOEMANSI, 3, 23, 162, 8
AUTORADIOBUTTON "Use font in O&EM mode only",
IDC2_VTOEMONLY, 3, 33, 162, 8
AUTORADIOBUTTON "&Poor man's line drawing (""+"", ""-"" and ""|"")",
IDC2_VTPOORMAN, 3, 43, 162, 8
LTEXT "Character set translation:", IDC6_XLATSTATIC, 3, 59, 162, 8
AUTORADIOBUTTON "&None", IDC6_NOXLAT, 3, 69, 162, 8, WS_GROUP
AUTORADIOBUTTON "&KOI8 / Win-1251", IDC6_KOI8WIN1251, 3, 79, 162, 8
AUTORADIOBUTTON "&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, 3, 89, 162, 8
AUTOCHECKBOX "CAP&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR, 3, 105, 162, 8
END END
/* Accelerators used: c */ /* Accelerators used: c */

848
windlg.c
View File

@ -442,18 +442,609 @@ static int CALLBACK AboutProc (HWND hwnd, UINT msg,
return 0; return 0;
} }
/* ----------------------------------------------------------------------
* Routines to self-manage the controls in a dialog box.
*/
#define GAPBETWEEN 3
#define GAPWITHIN 1
#define DLGWIDTH 168
#define STATICHEIGHT 8
#define CHECKBOXHEIGHT 8
#define RADIOHEIGHT 8
#define EDITHEIGHT 12
#define COMBOHEIGHT 12
#define PUSHBTNHEIGHT 14
struct ctlpos {
HWND hwnd;
LONG units;
WPARAM font;
int ypos, width;
};
/* Used on self-constructed dialogs. */
void ctlposinit(struct ctlpos *cp, HWND hwnd) {
RECT r;
cp->hwnd = hwnd;
cp->units = GetWindowLong(hwnd, GWL_USERDATA);
cp->font = GetWindowLong(hwnd, DWL_USER);
cp->ypos = GAPBETWEEN;
GetClientRect(hwnd, &r);
cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN;
}
/* Used on kosher dialogs. */
void ctlposinit2(struct ctlpos *cp, HWND hwnd) {
RECT r;
cp->hwnd = hwnd;
r.left = r.top = 0;
r.right = 4;
r.bottom = 8;
MapDialogRect(hwnd, &r);
cp->units = (r.bottom << 16) | r.right;
cp->font = SendMessage(hwnd, WM_GETFONT, 0, 0);
cp->ypos = GAPBETWEEN;
GetClientRect(hwnd, &r);
cp->width = (r.right * 4) / (cp->units & 0xFFFF) - 2*GAPBETWEEN;
}
void doctl(struct ctlpos *cp, RECT r, char *wclass, int wstyle, int exstyle,
char *wtext, int wid) {
HWND ctl;
/*
* Note nonstandard use of RECT. This is deliberate: by
* transforming the width and height directly we arrange to
* have all supposedly same-sized controls really same-sized.
*/
/* MapDialogRect, or its near equivalent. */
r.left = (r.left * (cp->units & 0xFFFF)) / 4;
r.right = (r.right * (cp->units & 0xFFFF)) / 4;
r.top = (r.top * ((cp->units>>16) & 0xFFFF)) / 8;
r.bottom = (r.bottom * ((cp->units>>16) & 0xFFFF)) / 8;
ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle,
r.left, r.top, r.right, r.bottom,
cp->hwnd, (HMENU)wid, hinst, NULL);
SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0));
}
/*
* Some edit boxes. Each one has a static above it. The percentages
* of the horizontal space are provided.
*/
void multiedit(struct ctlpos *cp, ...) {
RECT r;
va_list ap;
int percent, xpos;
percent = xpos = 0;
va_start(ap, cp);
while (1) {
char *text;
int staticid, editid, pcwidth;
text = va_arg(ap, char *);
if (!text)
break;
staticid = va_arg(ap, int);
editid = va_arg(ap, int);
pcwidth = va_arg(ap, int);
r.left = xpos + GAPBETWEEN;
percent += pcwidth;
xpos = (cp->width + GAPBETWEEN) * percent / 100;
r.right = xpos - r.left;
r.top = cp->ypos; r.bottom = STATICHEIGHT;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0,
text, staticid);
r.top = cp->ypos + 8 + GAPWITHIN; r.bottom = EDITHEIGHT;
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE,
"", editid);
}
va_end(ap);
cp->ypos += 8+GAPWITHIN+12+GAPBETWEEN;
}
/*
* A set of radio buttons on the same line, with a static above
* them. `nacross' dictates how many parts the line is divided into
* (you might want this not to equal the number of buttons if you
* needed to line up some 2s and some 3s to look good in the same
* panel).
*/
void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...) {
RECT r;
va_list ap;
int group;
int i;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id);
va_start(ap, nacross);
group = WS_GROUP;
i = 0;
while (1) {
char *btext;
int bid;
btext = va_arg(ap, char *);
if (!btext)
break;
bid = va_arg(ap, int);
r.left = GAPBETWEEN + i * (cp->width+GAPBETWEEN)/nacross;
r.right = (i+1) * (cp->width+GAPBETWEEN)/nacross - r.left;
r.top = cp->ypos; r.bottom = RADIOHEIGHT;
doctl(cp, r, "BUTTON",
BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group,
0,
btext, bid);
group = 0;
i++;
}
va_end(ap);
cp->ypos += r.bottom + GAPBETWEEN;
}
/*
* A set of radio buttons on multiple lines, with a static above
* them.
*/
void radiobig(struct ctlpos *cp, char *text, int id, ...) {
RECT r;
va_list ap;
int group;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id);
va_start(ap, id);
group = WS_GROUP;
while (1) {
char *btext;
int bid;
btext = va_arg(ap, char *);
if (!btext)
break;
bid = va_arg(ap, int);
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "BUTTON",
BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP | group,
0,
btext, bid);
group = 0;
}
va_end(ap);
cp->ypos += GAPBETWEEN - GAPWITHIN;
}
/*
* A single standalone checkbox.
*/
void checkbox(struct ctlpos *cp, char *text, int id) {
RECT r;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = CHECKBOXHEIGHT;
cp->ypos += r.bottom + GAPBETWEEN;
doctl(cp, r, "BUTTON",
BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 0,
text, id);
}
/*
* A button on the right hand side, with a static to its left.
*/
void staticbtn(struct ctlpos *cp, char *stext, int sid, char *btext, int bid) {
const int height = (PUSHBTNHEIGHT > STATICHEIGHT ?
PUSHBTNHEIGHT : STATICHEIGHT);
RECT r;
int lwid, rwid, rpos;
rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4;
lwid = rpos - 2*GAPBETWEEN;
rwid = cp->width + GAPBETWEEN - rpos;
r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2;
r.right = lwid; r.bottom = STATICHEIGHT;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2;
r.right = rwid; r.bottom = PUSHBTNHEIGHT;
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0,
btext, bid);
cp->ypos += height + GAPBETWEEN;
}
/*
* An edit control on the right hand side, with a static to its left.
*/
void staticedit(struct ctlpos *cp, char *stext, int sid, int eid) {
const int height = (EDITHEIGHT > STATICHEIGHT ?
EDITHEIGHT : STATICHEIGHT);
RECT r;
int lwid, rwid, rpos;
rpos = GAPBETWEEN + (cp->width + GAPBETWEEN) / 2;
lwid = rpos - 2*GAPBETWEEN;
rwid = cp->width + GAPBETWEEN - rpos;
r.left = GAPBETWEEN; r.top = cp->ypos + (height-STATICHEIGHT)/2;
r.right = lwid; r.bottom = STATICHEIGHT;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
r.left = rpos; r.top = cp->ypos + (height-EDITHEIGHT)/2;
r.right = rwid; r.bottom = EDITHEIGHT;
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE,
"", eid);
cp->ypos += height + GAPBETWEEN;
}
/*
* A tab-control substitute when a real tab control is unavailable.
*/
void ersatztab(struct ctlpos *cp, char *stext, int sid, int lid, int s2id) {
const int height = (COMBOHEIGHT > STATICHEIGHT ?
COMBOHEIGHT : STATICHEIGHT);
RECT r;
int bigwid, lwid, rwid, rpos;
static const int BIGGAP = 15;
static const int MEDGAP = 3;
bigwid = cp->width + 2*GAPBETWEEN - 2*BIGGAP;
cp->ypos += MEDGAP;
rpos = BIGGAP + (bigwid + BIGGAP) / 2;
lwid = rpos - 2*BIGGAP;
rwid = bigwid + BIGGAP - rpos;
r.left = BIGGAP; r.top = cp->ypos + (height-STATICHEIGHT)/2;
r.right = lwid; r.bottom = STATICHEIGHT;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
r.left = rpos; r.top = cp->ypos + (height-COMBOHEIGHT)/2;
r.right = rwid; r.bottom = COMBOHEIGHT*10;
doctl(cp, r, "COMBOBOX",
WS_CHILD | WS_VISIBLE | WS_TABSTOP |
CBS_DROPDOWNLIST | CBS_HASSTRINGS,
WS_EX_CLIENTEDGE,
"", lid);
cp->ypos += height + MEDGAP + GAPBETWEEN;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = 2;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_ETCHEDHORZ,
0, "", s2id);
}
/*
* A static line, followed by an edit control on the left hand side
* and a button on the right.
*/
void editbutton(struct ctlpos *cp, char *stext, int sid,
int eid, char *btext, int bid) {
const int height = (EDITHEIGHT > PUSHBTNHEIGHT ?
EDITHEIGHT : PUSHBTNHEIGHT);
RECT r;
int lwid, rwid, rpos;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4;
lwid = rpos - 2*GAPBETWEEN;
rwid = cp->width + GAPBETWEEN - rpos;
r.left = GAPBETWEEN; r.top = cp->ypos + (height-EDITHEIGHT)/2;
r.right = lwid; r.bottom = EDITHEIGHT;
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE,
"", eid);
r.left = rpos; r.top = cp->ypos + (height-PUSHBTNHEIGHT)/2;
r.right = rwid; r.bottom = PUSHBTNHEIGHT;
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0,
btext, bid);
cp->ypos += height + GAPBETWEEN;
}
/*
* Special control which was hard to describe generically: the
* session-saver assembly. A static; below that an edit box; below
* that a list box. To the right of the list box, a column of
* buttons.
*/
void sesssaver(struct ctlpos *cp, char *text,
int staticid, int editid, int listid, ...) {
RECT r;
va_list ap;
int lwid, rwid, rpos;
int y;
const int LISTDEFHEIGHT = 66;
rpos = GAPBETWEEN + 3 * (cp->width + GAPBETWEEN) / 4;
lwid = rpos - 2*GAPBETWEEN;
rwid = cp->width + GAPBETWEEN - rpos;
/* The static control. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = lwid; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid);
/* The edit control. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = lwid; r.bottom = EDITHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE,
"", staticid);
/*
* The buttons (we should hold off on the list box until we
* know how big the buttons are).
*/
va_start(ap, listid);
y = cp->ypos;
while (1) {
char *btext = va_arg(ap, char *);
int bid;
if (!btext) break;
bid = va_arg(ap, int);
r.left = rpos; r.top = y;
r.right = rwid; r.bottom = PUSHBTNHEIGHT;
y += r.bottom + GAPWITHIN;
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0,
btext, bid);
}
/* Compute list box height. LISTDEFHEIGHT, or height of buttons. */
y -= cp->ypos;
y -= GAPWITHIN;
if (y < LISTDEFHEIGHT) y = LISTDEFHEIGHT;
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = lwid; r.bottom = y;
cp->ypos += y + GAPBETWEEN;
doctl(cp, r, "LISTBOX",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS,
WS_EX_CLIENTEDGE,
"", listid);
}
/*
* Another special control: the environment-variable setter. A
* static line first; then a pair of edit boxes with associated
* statics, and two buttons; then a list box.
*/
void envsetter(struct ctlpos *cp, char *stext, int sid,
char *e1stext, int e1sid, int e1id,
char *e2stext, int e2sid, int e2id,
int listid, char *b1text, int b1id, char *b2text, int b2id) {
RECT r;
const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ?
STATICHEIGHT :
EDITHEIGHT > PUSHBTNHEIGHT ?
EDITHEIGHT : PUSHBTNHEIGHT);
const static int percents[] = { 20, 35, 10, 25 };
int i, j, xpos, percent;
const int LISTHEIGHT = 42;
/* The static control. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
/* The statics+edits+buttons. */
for (j = 0; j < 2; j++) {
percent = 10;
for (i = 0; i < 4; i++) {
xpos = (cp->width + GAPBETWEEN) * percent / 100;
r.left = xpos + GAPBETWEEN;
percent += percents[i];
xpos = (cp->width + GAPBETWEEN) * percent / 100;
r.right = xpos - r.left;
r.top = cp->ypos;
r.bottom = (i==0 ? STATICHEIGHT :
i==1 ? EDITHEIGHT :
PUSHBTNHEIGHT);
r.top += (height-r.bottom)/2;
if (i==0) {
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0,
j==0 ? e1stext : e2stext, j==0 ? e1sid : e2sid);
} else if (i==1) {
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE,
"", j==0 ? e1id : e2id);
} else if (i==3) {
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0,
j==0 ? b1text : b2text, j==0 ? b1id : b2id);
}
}
cp->ypos += height + GAPWITHIN;
}
/* The list box. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = LISTHEIGHT;
cp->ypos += r.bottom + GAPBETWEEN;
doctl(cp, r, "LISTBOX",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS |
LBS_USETABSTOPS,
WS_EX_CLIENTEDGE,
"", listid);
}
/*
* Yet another special control: the character-class setter. A
* static, then a list, then a line containing a
* button-and-static-and-edit.
*/
void charclass(struct ctlpos *cp, char *stext, int sid, int listid,
char *btext, int bid, int eid, char *s2text, int s2id) {
RECT r;
const int height = (STATICHEIGHT > EDITHEIGHT && STATICHEIGHT > PUSHBTNHEIGHT ?
STATICHEIGHT :
EDITHEIGHT > PUSHBTNHEIGHT ?
EDITHEIGHT : PUSHBTNHEIGHT);
const static int percents[] = { 30, 40, 30 };
int i, xpos, percent;
const int LISTHEIGHT = 66;
/* The static control. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
/* The list box. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = LISTHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "LISTBOX",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS |
LBS_USETABSTOPS,
WS_EX_CLIENTEDGE,
"", listid);
/* The button+static+edit. */
percent = xpos = 0;
for (i = 0; i < 3; i++) {
r.left = xpos + GAPBETWEEN;
percent += percents[i];
xpos = (cp->width + GAPBETWEEN) * percent / 100;
r.right = xpos - r.left;
r.top = cp->ypos;
r.bottom = (i==0 ? PUSHBTNHEIGHT :
i==1 ? STATICHEIGHT :
EDITHEIGHT);
r.top += (height-r.bottom)/2;
if (i==0) {
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0, btext, bid);
} else if (i==1) {
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_CENTER,
0, s2text, s2id);
} else if (i==2) {
doctl(cp, r, "EDIT",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL,
WS_EX_CLIENTEDGE, "", eid);
}
}
cp->ypos += height + GAPBETWEEN;
}
/*
* A special control (horrors!). The colour editor. A static line;
* then on the left, a list box, and on the right, a sequence of
* two-part statics followed by a button.
*/
void colouredit(struct ctlpos *cp, char *stext, int sid, int listid,
char *btext, int bid, ...) {
RECT r;
int y;
va_list ap;
int lwid, rwid, rpos;
const int LISTHEIGHT = 66;
/* The static control. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = cp->width; r.bottom = STATICHEIGHT;
cp->ypos += r.bottom + GAPWITHIN;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
rpos = GAPBETWEEN + 2 * (cp->width + GAPBETWEEN) / 3;
lwid = rpos - 2*GAPBETWEEN;
rwid = cp->width + GAPBETWEEN - rpos;
/* The list box. */
r.left = GAPBETWEEN; r.top = cp->ypos;
r.right = lwid; r.bottom = LISTHEIGHT;
doctl(cp, r, "LISTBOX",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | LBS_HASSTRINGS |
LBS_USETABSTOPS,
WS_EX_CLIENTEDGE,
"", listid);
/* The statics. */
y = cp->ypos;
va_start(ap, bid);
while (1) {
char *ltext;
int lid, rid;
ltext = va_arg(ap, char *);
if (!ltext) break;
lid = va_arg(ap, int);
rid = va_arg(ap, int);
r.top = y; r.bottom = STATICHEIGHT;
y += r.bottom + GAPWITHIN;
r.left = rpos; r.right = rwid/2;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, ltext, lid);
r.left = rpos + r.right; r.right = rwid - r.right;
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE | SS_RIGHT, 0, "", rid);
}
va_end(ap);
/* The button. */
r.top = y + 2*GAPWITHIN; r.bottom = PUSHBTNHEIGHT;
r.left = rpos; r.right = rwid;
doctl(cp, r, "BUTTON",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
0, btext, bid);
cp->ypos += LISTHEIGHT + GAPBETWEEN;
}
static int GeneralPanelProc (HWND hwnd, UINT msg, static int GeneralPanelProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
switch (msg) { switch (msg) {
case WM_SETFONT:
{
HFONT hfont = (HFONT)wParam;
HFONT oldfont;
HDC hdc;
TEXTMETRIC tm;
LONG units;
hdc = GetDC(hwnd);
oldfont = SelectObject(hdc, hfont);
GetTextMetrics(hdc, &tm);
units = (tm.tmHeight << 16) | tm.tmAveCharWidth;
SelectObject(hdc, oldfont);
DeleteDC(hdc);
SetWindowLong(hwnd, GWL_USERDATA, units);
SetWindowLong(hwnd, DWL_USER, wParam);
}
return 0;
case WM_INITDIALOG: case WM_INITDIALOG:
SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
return 1; return 1;
/* case WM_CTLCOLORDLG: */
/* return (int) GetStockObject (LTGRAY_BRUSH); */
/* case WM_CTLCOLORSTATIC: */
/* case WM_CTLCOLORBTN: */
/* SetBkColor ((HDC)wParam, RGB(192,192,192)); */
/* return (int) GetStockObject (LTGRAY_BRUSH); */
case WM_CLOSE: case WM_CLOSE:
DestroyWindow (hwnd); DestroyWindow (hwnd);
return 1; return 1;
@ -466,9 +1057,32 @@ static char savedsession[2048];
static int CALLBACK ConnectionProc (HWND hwnd, UINT msg, static int CALLBACK ConnectionProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
int i; int i;
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] dehlnprstwx */
ctlposinit(&cp, hwnd);
multiedit(&cp,
"Host &Name", IDC0_HOSTSTATIC, IDC0_HOST, 75,
"&Port", IDC0_PORTSTATIC, IDC0_PORT, 25, NULL);
radioline(&cp, "Protocol:", IDC0_PROTSTATIC, 3,
"&Raw", IDC0_PROTRAW,
"&Telnet", IDC0_PROTTELNET,
#ifdef FWHACK
"SS&H/hack",
#else
"SS&H",
#endif
IDC0_PROTSSH, NULL);
sesssaver(&cp, "Stor&ed Sessions",
IDC0_SESSSTATIC, IDC0_SESSEDIT, IDC0_SESSLIST,
"&Load", IDC0_SESSLOAD,
"&Save", IDC0_SESSSAVE,
"&Delete", IDC0_SESSDEL, NULL);
checkbox(&cp, "Close Window on E&xit", IDC0_CLOSEEXIT);
checkbox(&cp, "&Warn on Close", IDC0_CLOSEWARN);
SetDlgItemText (hwnd, IDC0_HOST, cfg.host); SetDlgItemText (hwnd, IDC0_HOST, cfg.host);
SetDlgItemText (hwnd, IDC0_SESSEDIT, savedsession); SetDlgItemText (hwnd, IDC0_SESSEDIT, savedsession);
SetDlgItemInt (hwnd, IDC0_PORT, cfg.port, FALSE); SetDlgItemInt (hwnd, IDC0_PORT, cfg.port, FALSE);
@ -631,9 +1245,34 @@ static int CALLBACK ConnectionProc (HWND hwnd, UINT msg,
} }
static int CALLBACK KeyboardProc (HWND hwnd, UINT msg, static int CALLBACK KeyboardProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] 4?ehiklmnprsuvxy */
ctlposinit(&cp, hwnd);
radioline(&cp, "Action of Backspace:", IDC1_DELSTATIC, 2,
"Control-&H", IDC1_DEL008,
"Control-&? (127)", IDC1_DEL127, NULL);
radioline(&cp, "Action of Home and End:", IDC1_HOMESTATIC, 2,
"&Standard", IDC1_HOMETILDE,
"&rxvt", IDC1_HOMERXVT, NULL);
radioline(&cp, "Function key and keypad layout:", IDC1_FUNCSTATIC, 3,
"&VT400", IDC1_FUNCTILDE,
"&Linux", IDC1_FUNCLINUX,
"&Xterm R6", IDC1_FUNCXTERM, NULL);
radioline(&cp, "Initial state of cursor keys:", IDC1_CURSTATIC, 2,
"&Normal", IDC1_CURNORMAL,
"A&pplication", IDC1_CURAPPLIC, NULL);
radioline(&cp, "Initial state of numeric keypad:", IDC1_KPSTATIC, 3,
"Nor&mal", IDC1_KPNORMAL,
"Appl&ication", IDC1_KPAPPLIC,
"N&etHack", IDC1_KPNH, NULL);
checkbox(&cp, "ALT-F&4 is special (closes window)", IDC1_ALTF4);
checkbox(&cp, "ALT-Space is special (S&ystem menu)", IDC1_ALTSPACE);
checkbox(&cp, "&Use local terminal line discipline", IDC1_LDISCTERM);
checkbox(&cp, "Reset scrollback on &keypress", IDC1_SCROLLKEY);
CheckRadioButton (hwnd, IDC1_DEL008, IDC1_DEL127, CheckRadioButton (hwnd, IDC1_DEL008, IDC1_DEL127,
cfg.bksp_is_delete ? IDC1_DEL127 : IDC1_DEL008); cfg.bksp_is_delete ? IDC1_DEL127 : IDC1_DEL008);
CheckRadioButton (hwnd, IDC1_HOMETILDE, IDC1_HOMERXVT, CheckRadioButton (hwnd, IDC1_HOMETILDE, IDC1_HOMERXVT,
@ -724,12 +1363,28 @@ static void fmtfont (char *buf) {
static int CALLBACK TerminalProc (HWND hwnd, UINT msg, static int CALLBACK TerminalProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
CHOOSEFONT cf; CHOOSEFONT cf;
LOGFONT lf; LOGFONT lf;
char fontstatic[256]; char fontstatic[256];
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] dghlmnprsw */
ctlposinit(&cp, hwnd);
multiedit(&cp,
"&Rows", IDC2_ROWSSTATIC, IDC2_ROWSEDIT, 33,
"Colu&mns", IDC2_COLSSTATIC, IDC2_COLSEDIT, 33,
"&Scrollback", IDC2_SAVESTATIC, IDC2_SAVEEDIT, 33,
NULL);
staticbtn(&cp, "", IDC2_FONTSTATIC, "C&hange...", IDC2_CHOOSEFONT);
checkbox(&cp, "Auto &wrap mode initially on", IDC2_WRAPMODE);
checkbox(&cp, "&DEC Origin Mode initially on", IDC2_DECOM);
checkbox(&cp, "Implicit CR in every &LF", IDC2_LFHASCR);
checkbox(&cp, "Bee&p enabled", IDC1_BEEP);
checkbox(&cp, "Use Back&ground colour erase", IDC2_BCE);
checkbox(&cp, "Enable bli&nking text", IDC2_BLINKTEXT);
CheckDlgButton (hwnd, IDC2_WRAPMODE, cfg.wrap_mode); CheckDlgButton (hwnd, IDC2_WRAPMODE, cfg.wrap_mode);
CheckDlgButton (hwnd, IDC2_DECOM, cfg.dec_om); CheckDlgButton (hwnd, IDC2_DECOM, cfg.dec_om);
CheckDlgButton (hwnd, IDC2_LFHASCR, cfg.lfhascr); CheckDlgButton (hwnd, IDC2_LFHASCR, cfg.lfhascr);
@ -823,8 +1478,19 @@ static int CALLBACK TerminalProc (HWND hwnd, UINT msg,
static int CALLBACK WindowProc (HWND hwnd, UINT msg, static int CALLBACK WindowProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] bikty */
ctlposinit(&cp, hwnd);
multiedit(&cp,
"Initial window &title:", IDCW_WINTITLE, IDCW_WINEDIT, 100,
NULL);
checkbox(&cp, "Avoid ever using &icon title", IDCW_WINNAME);
checkbox(&cp, "&Blinking cursor", IDCW_BLINKCUR);
checkbox(&cp, "Displa&y scrollbar", IDCW_SCROLLBAR);
checkbox(&cp, "Loc&k Window size", IDCW_LOCKSIZE);
SetDlgItemText (hwnd, IDCW_WINEDIT, cfg.wintitle); SetDlgItemText (hwnd, IDCW_WINEDIT, cfg.wintitle);
CheckDlgButton (hwnd, IDCW_WINNAME, cfg.win_name_always); CheckDlgButton (hwnd, IDCW_WINNAME, cfg.win_name_always);
CheckDlgButton (hwnd, IDCW_BLINKCUR, cfg.blink_cur); CheckDlgButton (hwnd, IDCW_BLINKCUR, cfg.blink_cur);
@ -867,9 +1533,24 @@ static int CALLBACK WindowProc (HWND hwnd, UINT msg,
static int CALLBACK TelnetProc (HWND hwnd, UINT msg, static int CALLBACK TelnetProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
int i; int i;
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] bdflrstuv */
ctlposinit(&cp, hwnd);
staticedit(&cp, "Terminal-&type string", IDC3_TTSTATIC, IDC3_TTEDIT);
staticedit(&cp, "Terminal-&speed string", IDC3_TSSTATIC, IDC3_TSEDIT);
staticedit(&cp, "Auto-login &username", IDC3_LOGSTATIC, IDC3_LOGEDIT);
envsetter(&cp, "Environment variables:", IDC3_ENVSTATIC,
"&Variable", IDC3_VARSTATIC, IDC3_VAREDIT,
"Va&lue", IDC3_VALSTATIC, IDC3_VALEDIT,
IDC3_ENVLIST,
"A&dd", IDC3_ENVADD, "&Remove", IDC3_ENVREMOVE);
radioline(&cp, "Handling of OLD_ENVIRON ambiguity:", IDC3_EMSTATIC, 2,
"&BSD (commonplace)", IDC3_EMBSD,
"R&FC 1408 (unusual)", IDC3_EMRFC, NULL);
SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype);
SetDlgItemText (hwnd, IDC3_TSEDIT, cfg.termspeed); SetDlgItemText (hwnd, IDC3_TSEDIT, cfg.termspeed);
SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username); SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username);
@ -982,11 +1663,33 @@ static int CALLBACK TelnetProc (HWND hwnd, UINT msg,
static int CALLBACK SshProc (HWND hwnd, UINT msg, static int CALLBACK SshProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
OPENFILENAME of; OPENFILENAME of;
char filename[sizeof(cfg.keyfile)]; char filename[sizeof(cfg.keyfile)];
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] 123abdkmprtuw */
ctlposinit(&cp, hwnd);
staticedit(&cp, "Terminal-&type string", IDC3_TTSTATIC, IDC3_TTEDIT);
staticedit(&cp, "Auto-login &username", IDC3_LOGSTATIC, IDC3_LOGEDIT);
multiedit(&cp,
"&Remote command:", IDC3_CMDSTATIC, IDC3_CMDEDIT, 100,
NULL);
checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC3_NOPTY);
checkbox(&cp, "Atte&mpt TIS or CryptoCard authentication",
IDC3_AUTHTIS);
checkbox(&cp, "Allow &agent forwarding", IDC3_AGENTFWD);
editbutton(&cp, "Private &key file for authentication:",
IDC3_PKSTATIC, IDC3_PKEDIT, "Bro&wse...", IDC3_PKBUTTON);
radioline(&cp, "Preferred SSH protocol version:",
IDC3_SSHPROTSTATIC, 2,
"&1", IDC3_SSHPROT1, "&2", IDC3_SSHPROT2, NULL);
radioline(&cp, "Preferred encryption algorithm:", IDC3_CIPHERSTATIC, 3,
"&3DES", IDC3_CIPHER3DES,
"&Blowfish", IDC3_CIPHERBLOWF,
"&DES", IDC3_CIPHERDES, NULL);
SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype); SetDlgItemText (hwnd, IDC3_TTEDIT, cfg.termtype);
SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username); SetDlgItemText (hwnd, IDC3_LOGEDIT, cfg.username);
CheckDlgButton (hwnd, IDC3_NOPTY, cfg.nopty); CheckDlgButton (hwnd, IDC3_NOPTY, cfg.nopty);
@ -1094,10 +1797,21 @@ static int CALLBACK SshProc (HWND hwnd, UINT msg,
static int CALLBACK SelectionProc (HWND hwnd, UINT msg, static int CALLBACK SelectionProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
int i; int i;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] stwx */
ctlposinit(&cp, hwnd);
radiobig(&cp, "Action of mouse buttons:", IDC4_MBSTATIC,
"&Windows (Right pastes, Middle extends)", IDC4_MBWINDOWS,
"&xterm (Right extends, Middle pastes)", IDC4_MBXTERM,
NULL);
charclass(&cp, "Character classes:", IDC4_CCSTATIC, IDC4_CCLIST,
"&Set", IDC4_CCSET, IDC4_CCEDIT,
"&to class", IDC4_CCSTATIC2);
CheckRadioButton (hwnd, IDC4_MBWINDOWS, IDC4_MBXTERM, CheckRadioButton (hwnd, IDC4_MBWINDOWS, IDC4_MBXTERM,
cfg.mouse_is_xterm ? IDC4_MBXTERM : IDC4_MBWINDOWS); cfg.mouse_is_xterm ? IDC4_MBXTERM : IDC4_MBWINDOWS);
{ {
@ -1172,8 +1886,21 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg,
TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE,
TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE
}; };
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] bmlu */
ctlposinit(&cp, hwnd);
checkbox(&cp, "&Bolded text is a different colour", IDC5_BOLDCOLOUR);
checkbox(&cp, "Attempt to use &logical palettes", IDC5_PALETTE);
colouredit(&cp, "Select a colo&ur and click to modify it:",
IDC5_STATIC, IDC5_LIST,
"&Modify...", IDC5_CHANGE,
"Red:", IDC5_RSTATIC, IDC5_RVALUE,
"Green:", IDC5_GSTATIC, IDC5_GVALUE,
"Blue:", IDC5_BSTATIC, IDC5_BVALUE, NULL);
CheckDlgButton (hwnd, IDC5_BOLDCOLOUR, cfg.bold_colour); CheckDlgButton (hwnd, IDC5_BOLDCOLOUR, cfg.bold_colour);
CheckDlgButton (hwnd, IDC5_PALETTE, cfg.try_palette); CheckDlgButton (hwnd, IDC5_PALETTE, cfg.try_palette);
{ {
@ -1267,8 +1994,26 @@ static int CALLBACK ColourProc (HWND hwnd, UINT msg,
static int CALLBACK TranslationProc (HWND hwnd, UINT msg, static int CALLBACK TranslationProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) { WPARAM wParam, LPARAM lParam) {
struct ctlpos cp;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
/* Accelerators used: [aco] beiknpsx */
ctlposinit(&cp, hwnd);
radiobig(&cp,
"Handling of VT100 line drawing characters:", IDC2_VTSTATIC,
"Font has &XWindows encoding", IDC2_VTXWINDOWS,
"Use font in &both ANSI and OEM modes", IDC2_VTOEMANSI,
"Use font in O&EM mode only", IDC2_VTOEMONLY,
"&Poor man's line drawing (""+"", ""-"" and ""|"")",
IDC2_VTPOORMAN, NULL);
radiobig(&cp,
"Character set translation:", IDC6_XLATSTATIC,
"&None", IDC6_NOXLAT,
"&KOI8 / Win-1251", IDC6_KOI8WIN1251,
"&ISO-8859-2 / Win-1250", IDC6_88592WIN1250, NULL);
checkbox(&cp, "CAP&S LOCK acts as cyrillic switch", IDC6_CAPSLOCKCYR);
CheckRadioButton (hwnd, IDC6_NOXLAT, IDC6_88592WIN1250, CheckRadioButton (hwnd, IDC6_NOXLAT, IDC6_88592WIN1250,
cfg.xlat_88592w1250 ? IDC6_88592WIN1250 : cfg.xlat_88592w1250 ? IDC6_88592WIN1250 :
cfg.xlat_enablekoiwin ? IDC6_KOI8WIN1251 : cfg.xlat_enablekoiwin ? IDC6_KOI8WIN1251 :
@ -1335,10 +2080,31 @@ static char *names[NPANELS] = {
static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8}; static int mainp[MAIN_NPANELS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8};
static int reconfp[RECONF_NPANELS] = { 1, 2, 3, 6, 7, 8}; static int reconfp[RECONF_NPANELS] = { 1, 2, 3, 6, 7, 8};
static HWND makesubdialog(HWND hwnd, int x, int y, int w, int h, int n) {
RECT r;
HWND ret;
WPARAM font;
r.left = x; r.top = y;
r.right = r.left + w; r.bottom = r.top + h;
MapDialogRect(hwnd, &r);
ret = CreateWindowEx(WS_EX_CONTROLPARENT,
WC_DIALOG, "", /* no title */
WS_CHILD | WS_VISIBLE | DS_SETFONT,
r.left, r.top,
r.right-r.left, r.bottom-r.top,
hwnd, (HMENU)(panelids[n]),
hinst, NULL);
SetWindowLong (ret, DWL_DLGPROC, (LONG)panelproc[n]);
font = SendMessage(hwnd, WM_GETFONT, 0, 0);
SendMessage (ret, WM_SETFONT, font, MAKELPARAM(0, 0));
SendMessage (ret, WM_INITDIALOG, 0, 0);
return ret;
}
static int GenericMainDlgProc (HWND hwnd, UINT msg, static int GenericMainDlgProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam, WPARAM wParam, LPARAM lParam,
int npanels, int *panelnums, HWND *page) { int npanels, int *panelnums, HWND *page) {
HWND hw; HWND hw, tabctl;
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
@ -1351,25 +2117,48 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
(rs.bottom + rs.top + rd.top - rd.bottom)/2, (rs.bottom + rs.top + rd.top - rd.bottom)/2,
rd.right-rd.left, rd.bottom-rd.top, TRUE); rd.right-rd.left, rd.bottom-rd.top, TRUE);
} }
{
RECT r;
r.left = 3; r.right = r.left + 174;
r.top = 3; r.bottom = r.top + 193;
MapDialogRect(hwnd, &r);
tabctl = CreateWindowEx(0, WC_TABCONTROL, "",
WS_CHILD | WS_VISIBLE |
WS_TABSTOP | TCS_MULTILINE,
r.left, r.top,
r.right-r.left, r.bottom-r.top,
hwnd, (HMENU)IDC_TAB, hinst, NULL);
if (!tabctl) {
struct ctlpos cp;
ctlposinit2(&cp, hwnd);
ersatztab(&cp, "Category:", IDC_TABSTATIC1, IDC_TABLIST,
IDC_TABSTATIC2);
} else {
WPARAM font = SendMessage(hwnd, WM_GETFONT, 0, 0);
SendMessage(tabctl, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
}
}
*page = NULL; *page = NULL;
{ /* initialise the tab control */ if (tabctl) { /* initialise the tab control */
TC_ITEMHEADER tab; TC_ITEMHEADER tab;
int i; int i;
hw = GetDlgItem (hwnd, IDC_TAB);
for (i=0; i<npanels; i++) { for (i=0; i<npanels; i++) {
tab.mask = TCIF_TEXT; tab.mask = TCIF_TEXT;
tab.pszText = names[panelnums[i]]; tab.pszText = names[panelnums[i]];
TabCtrl_InsertItem (hw, i, &tab); TabCtrl_InsertItem (tabctl, i, &tab);
} }
/* *page = CreateDialogIndirect (hinst, panels[panelnums[0]].temp, } else {
hwnd, panelproc[panelnums[0]]);*/ int i;
*page = CreateDialog (hinst, panelids[panelnums[0]],
hwnd, panelproc[panelnums[0]]); for (i=0; i<npanels; i++) {
SetWindowLong (*page, GWL_EXSTYLE, SendDlgItemMessage(hwnd, IDC_TABLIST, CB_ADDSTRING,
GetWindowLong (*page, GWL_EXSTYLE) | 0, (LPARAM)names[panelnums[i]]);
WS_EX_CONTROLPARENT); }
} SendDlgItemMessage(hwnd, IDC_TABLIST, CB_SETCURSEL, 0, 0);
}
*page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[0]);
SetFocus (*page); SetFocus (*page);
return 0; return 0;
case WM_NOTIFY: case WM_NOTIFY:
@ -1378,21 +2167,24 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom); int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
if (*page) if (*page)
DestroyWindow (*page); DestroyWindow (*page);
/* *page = CreateDialogIndirect (hinst, panels[panelnums[i]].temp, *page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[i]);
hwnd, panelproc[panelnums[i]]);*/
*page = CreateDialog (hinst, panelids[panelnums[i]],
hwnd, panelproc[panelnums[i]]);
SetWindowLong (*page, GWL_EXSTYLE,
GetWindowLong (*page, GWL_EXSTYLE) |
WS_EX_CONTROLPARENT);
SetFocus (((LPNMHDR)lParam)->hwndFrom); /* ensure focus stays */ SetFocus (((LPNMHDR)lParam)->hwndFrom); /* ensure focus stays */
return 0; return 0;
} }
break; break;
/* case WM_CTLCOLORDLG: */
/* return (int) GetStockObject (LTGRAY_BRUSH); */
case WM_COMMAND: case WM_COMMAND:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDC_TABLIST:
if (HIWORD(wParam) == CBN_SELCHANGE) {
HWND tablist = GetDlgItem (hwnd, IDC_TABLIST);
int i = SendMessage (tablist, CB_GETCURSEL, 0, 0);
if (*page)
DestroyWindow (*page);
*page = makesubdialog(hwnd, 6, 30, 168, 163, panelnums[i]);
SetFocus(tablist); /* ensure focus stays */
return 0;
}
break;
case IDOK: case IDOK:
if (*cfg.host) if (*cfg.host)
EndDialog (hwnd, 1); EndDialog (hwnd, 1);