Newer
Older
dlg_error_msg(dlg, "You need to specify a source port number");
return;
}
p = str + strlen(str);
if (type != 'D') {
*p++ = '\t';
dlg_editbox_get(pfd->destbox, dlg, p,
sizeof(str) - (p - str));
if (!*p || !strchr(p, ':')) {
dlg_error_msg(dlg,
"You need to specify a destination address\n"
"in the form \"host.name:port\"");
return;
}
} else
*p = '\0';
p = cfg->portfwd;
while (*p) {
if (strcmp(p,str) == 0) {
dlg_error_msg(dlg, "Specified forwarding already exists");
break;
}
while (*p)
p++;
p++;
}
if (!*p) {
if ((p - cfg->portfwd) + strlen(str) + 2 <=
sizeof(cfg->portfwd)) {
strcpy(p, str);
p[strlen(str) + 1] = '\0';
dlg_listbox_add(pfd->listbox, dlg, str);
dlg_editbox_set(pfd->sourcebox, dlg, "");
dlg_editbox_set(pfd->destbox, dlg, "");
} else {
dlg_error_msg(dlg, "Too many forwardings");
}
}
} else if (ctrl == pfd->rembutton) {
int i = dlg_listbox_index(pfd->listbox, dlg);
if (i < 0)
dlg_beep(dlg);
else {
char *p, *q, *src, *dst;
char dir;
dlg_listbox_del(pfd->listbox, dlg, i);
p = cfg->portfwd;
while (i > 0) {
if (!*p)
goto disaster2;
while (*p)
p++;
p++;
i--;
}
q = p;
if (!*p)
goto disaster2;
/* Populate the controls with the entry we're about to
* delete, for ease of editing. */
{
static const char *const afs = "A46";
char *afp = strchr(afs, *p);
int idx = afp ? afp-afs : 0;
if (afp)
p++;
#ifndef NO_IPV6
dlg_radiobutton_set(pfd->addressfamily, dlg, idx);
#endif
}
{
static const char *const dirs = "LRD";
dir = *p;
dlg_radiobutton_set(pfd->direction, dlg,
strchr(dirs, dir) - dirs);
}
p++;
if (dir != 'D') {
src = p;
p = strchr(p, '\t');
if (!p)
goto disaster2;
*p = '\0';
p++;
dst = p;
} else {
src = p;
dst = "";
}
p = strchr(p, '\0');
if (!p)
goto disaster2;
dlg_editbox_set(pfd->sourcebox, dlg, src);
dlg_editbox_set(pfd->destbox, dlg, dst);
p++;
while (*p) {
while (*p)
*q++ = *p++;
*q++ = *p++;
}
*q = '\0';
disaster2:;
}
}
}
}

Jacob Nevins
committed
void setup_config_box(struct controlbox *b, int midsession,
int protocol, int protcfginfo)
{
struct controlset *s;
struct sessionsaver_data *ssd;
struct charclass_data *ccd;
struct colour_data *cd;
struct ttymodes_data *td;
struct environ_data *ed;
struct portfwd_data *pfd;
union control *c;
ssd = (struct sessionsaver_data *)
ctrl_alloc(b, sizeof(struct sessionsaver_data));
memset(ssd, 0, sizeof(*ssd));

Jacob Nevins
committed
ssd->midsession = midsession;
/*
* The standard panel that appears at the bottom of all panels:
* Open, Cancel, Apply etc.
*/
s = ctrl_getset(b, "", "", "");
ctrl_columns(s, 5, 20, 20, 20, 20, 20);
ssd->okbutton = ctrl_pushbutton(s,
(midsession ? "Apply" : "Open"),
(char)(midsession ? 'a' : 'o'),
HELPCTX(no_help),
sessionsaver_handler, P(ssd));
ssd->okbutton->button.isdefault = TRUE;
ssd->okbutton->generic.column = 3;
ssd->cancelbutton = ctrl_pushbutton(s, "Cancel", 'c', HELPCTX(no_help),
sessionsaver_handler, P(ssd));
ssd->cancelbutton->button.iscancel = TRUE;
ssd->cancelbutton->generic.column = 4;
/* We carefully don't close the 5-column part, so that platform-
* specific add-ons can put extra buttons alongside Open and Cancel. */
/*
* The Session panel.
*/
str = dupprintf("Basic options for your %s session", appname);
ctrl_settitle(b, "Session", str);
sfree(str);
if (!midsession) {
struct hostport *hp = (struct hostport *)
ctrl_alloc(b, sizeof(struct hostport));
s = ctrl_getset(b, "Session", "hostport",
"Specify the destination you want to connect to");
ctrl_columns(s, 2, 75, 25);
c = ctrl_editbox(s, HOST_BOX_TITLE, 'n', 100,
HELPCTX(session_hostname),
config_host_handler, I(0), I(0));
c->generic.column = 0;
hp->host = c;
c = ctrl_editbox(s, PORT_BOX_TITLE, 'p', 100,
HELPCTX(session_hostname),
config_port_handler, I(0), I(0));
c->generic.column = 1;
hp->port = c;
ctrl_columns(s, 1, 100);
if (!backend_from_proto(PROT_SSH)) {
ctrl_radiobuttons(s, "Connection type:", NO_SHORTCUT, 3,
HELPCTX(session_hostname),
config_protocolbuttons_handler, P(hp),
"Raw", 'w', I(PROT_RAW),
"Telnet", 't', I(PROT_TELNET),
"Rlogin", 'i', I(PROT_RLOGIN),
NULL);
} else {
ctrl_radiobuttons(s, "Connection type:", NO_SHORTCUT, 4,
HELPCTX(session_hostname),
config_protocolbuttons_handler, P(hp),
"Raw", 'w', I(PROT_RAW),
"Telnet", 't', I(PROT_TELNET),
"Rlogin", 'i', I(PROT_RLOGIN),
"SSH", 's', I(PROT_SSH),
NULL);
}
}
/*
* The Load/Save panel is available even in mid-session.
*/
s = ctrl_getset(b, "Session", "savedsessions",
midsession ? "Save the current session settings" :
"Load, save or delete a stored session");
ctrl_columns(s, 2, 75, 25);

Jacob Nevins
committed
get_sesslist(&ssd->sesslist, TRUE);
ssd->editbox = ctrl_editbox(s, "Saved Sessions", 'e', 100,
HELPCTX(session_saved),
sessionsaver_handler, P(ssd), P(NULL));
ssd->editbox->generic.column = 0;
/* Reset columns so that the buttons are alongside the list, rather
* than alongside that edit box. */
ctrl_columns(s, 1, 100);
ctrl_columns(s, 2, 75, 25);
ssd->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT,
HELPCTX(session_saved),
sessionsaver_handler, P(ssd));
ssd->listbox->generic.column = 0;
ssd->listbox->listbox.height = 7;

Jacob Nevins
committed
if (!midsession) {
ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l',
HELPCTX(session_saved),
sessionsaver_handler, P(ssd));
ssd->loadbutton->generic.column = 1;
} else {
/* We can't offer the Load button mid-session, as it would allow the
* user to load and subsequently save settings they can't see. (And
* also change otherwise immutable settings underfoot; that probably
* shouldn't be a problem, but.) */
ssd->loadbutton = NULL;
}
/* "Save" button is permitted mid-session. */
ssd->savebutton = ctrl_pushbutton(s, "Save", 'v',
HELPCTX(session_saved),
sessionsaver_handler, P(ssd));
ssd->savebutton->generic.column = 1;

Jacob Nevins
committed
if (!midsession) {
ssd->delbutton = ctrl_pushbutton(s, "Delete", 'd',
HELPCTX(session_saved),
sessionsaver_handler, P(ssd));
ssd->delbutton->generic.column = 1;
} else {
/* Disable the Delete button mid-session too, for UI consistency. */
ssd->delbutton = NULL;
}
ctrl_columns(s, 1, 100);
s = ctrl_getset(b, "Session", "otheropts", NULL);
c = ctrl_radiobuttons(s, "Close window on exit:", 'x', 4,
HELPCTX(session_coe),
dlg_stdradiobutton_handler,
I(offsetof(Config, close_on_exit)),
"Always", I(FORCE_ON),
"Never", I(FORCE_OFF),
"Only on clean exit", I(AUTO), NULL);
/*
* The Session/Logging panel.
*/
ctrl_settitle(b, "Session/Logging", "Options controlling session logging");
s = ctrl_getset(b, "Session/Logging", "main", NULL);
/*
* The logging buttons change depending on whether SSH packet
* logging can sensibly be available.
*/
{
char *sshlogname, *sshrawlogname;
if ((midsession && protocol == PROT_SSH) ||
(!midsession && backend_from_proto(PROT_SSH))) {
sshlogname = "SSH packets";
sshrawlogname = "SSH packets and raw data";
} else {
sshlogname = NULL; /* this will disable both buttons */
sshrawlogname = NULL; /* this will just placate optimisers */
}
ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 2,
HELPCTX(logging_main),
I(offsetof(Config, logtype)),
"None", 't', I(LGTYP_NONE),
"Printable output", 'p', I(LGTYP_ASCII),
"All session output", 'l', I(LGTYP_DEBUG),
sshlogname, 's', I(LGTYP_PACKETS),
sshrawlogname, 'r', I(LGTYP_SSHRAW),
NULL);
}
ctrl_filesel(s, "Log file name:", 'f',
NULL, TRUE, "Select session log file name",
HELPCTX(logging_filename),
dlg_stdfilesel_handler, I(offsetof(Config, logfilename)));
ctrl_text(s, "(Log file name can contain &Y, &M, &D for date,"
" &T for time, and &H for host name)",
HELPCTX(logging_filename));
ctrl_radiobuttons(s, "What to do if the log file already exists:", 'e', 1,
HELPCTX(logging_exists),
dlg_stdradiobutton_handler, I(offsetof(Config,logxfovr)),
"Always overwrite it", I(LGXF_OVR),
"Always append to the end of it", I(LGXF_APN),
"Ask the user every time", I(LGXF_ASK), NULL);
ctrl_checkbox(s, "Flush log file frequently", 'u',
HELPCTX(logging_flush),
dlg_stdcheckbox_handler, I(offsetof(Config,logflush)));

Jacob Nevins
committed
if ((midsession && protocol == PROT_SSH) ||
(!midsession && backend_from_proto(PROT_SSH))) {

Jacob Nevins
committed
s = ctrl_getset(b, "Session/Logging", "ssh",
"Options specific to SSH packet logging");
ctrl_checkbox(s, "Omit known password fields", 'k',
HELPCTX(logging_ssh_omit_password),
dlg_stdcheckbox_handler, I(offsetof(Config,logomitpass)));
ctrl_checkbox(s, "Omit session data", 'd',
HELPCTX(logging_ssh_omit_data),
dlg_stdcheckbox_handler, I(offsetof(Config,logomitdata)));
}
/*
* The Terminal panel.
*/
ctrl_settitle(b, "Terminal", "Options controlling the terminal emulation");
s = ctrl_getset(b, "Terminal", "general", "Set various terminal options");
ctrl_checkbox(s, "Auto wrap mode initially on", 'w',
HELPCTX(terminal_autowrap),
dlg_stdcheckbox_handler, I(offsetof(Config,wrap_mode)));
ctrl_checkbox(s, "DEC Origin Mode initially on", 'd',
HELPCTX(terminal_decom),
dlg_stdcheckbox_handler, I(offsetof(Config,dec_om)));
ctrl_checkbox(s, "Implicit CR in every LF", 'r',
HELPCTX(terminal_lfhascr),
dlg_stdcheckbox_handler, I(offsetof(Config,lfhascr)));
ctrl_checkbox(s, "Implicit LF in every CR", 'f',
HELPCTX(terminal_crhaslf),
dlg_stdcheckbox_handler, I(offsetof(Config,crhaslf)));
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
ctrl_checkbox(s, "Use background colour to erase screen", 'e',
HELPCTX(terminal_bce),
dlg_stdcheckbox_handler, I(offsetof(Config,bce)));
ctrl_checkbox(s, "Enable blinking text", 'n',
HELPCTX(terminal_blink),
dlg_stdcheckbox_handler, I(offsetof(Config,blinktext)));
ctrl_editbox(s, "Answerback to ^E:", 's', 100,
HELPCTX(terminal_answerback),
dlg_stdeditbox_handler, I(offsetof(Config,answerback)),
I(sizeof(((Config *)0)->answerback)));
s = ctrl_getset(b, "Terminal", "ldisc", "Line discipline options");
ctrl_radiobuttons(s, "Local echo:", 'l', 3,
HELPCTX(terminal_localecho),
dlg_stdradiobutton_handler,I(offsetof(Config,localecho)),
"Auto", I(AUTO),
"Force on", I(FORCE_ON),
"Force off", I(FORCE_OFF), NULL);
ctrl_radiobuttons(s, "Local line editing:", 't', 3,
HELPCTX(terminal_localedit),
dlg_stdradiobutton_handler,I(offsetof(Config,localedit)),
"Auto", I(AUTO),
"Force on", I(FORCE_ON),
"Force off", I(FORCE_OFF), NULL);
s = ctrl_getset(b, "Terminal", "printing", "Remote-controlled printing");
ctrl_combobox(s, "Printer to send ANSI printer output to:", 'p', 100,
HELPCTX(terminal_printing),
printerbox_handler, P(NULL), P(NULL));
/*
* The Terminal/Keyboard panel.
*/
ctrl_settitle(b, "Terminal/Keyboard",
"Options controlling the effects of keys");
s = ctrl_getset(b, "Terminal/Keyboard", "mappings",
"Change the sequences sent by:");
ctrl_radiobuttons(s, "The Backspace key", 'b', 2,
HELPCTX(keyboard_backspace),
dlg_stdradiobutton_handler,
I(offsetof(Config, bksp_is_delete)),
"Control-H", I(0), "Control-? (127)", I(1), NULL);
ctrl_radiobuttons(s, "The Home and End keys", 'e', 2,
HELPCTX(keyboard_homeend),
dlg_stdradiobutton_handler,
I(offsetof(Config, rxvt_homeend)),
"Standard", I(0), "rxvt", I(1), NULL);
ctrl_radiobuttons(s, "The Function keys and keypad", 'f', 3,
HELPCTX(keyboard_funkeys),
dlg_stdradiobutton_handler,
I(offsetof(Config, funky_type)),
"ESC[n~", I(0), "Linux", I(1), "Xterm R6", I(2),
"VT400", I(3), "VT100+", I(4), "SCO", I(5), NULL);
s = ctrl_getset(b, "Terminal/Keyboard", "appkeypad",
"Application keypad settings:");
ctrl_radiobuttons(s, "Initial state of cursor keys:", 'r', 3,
HELPCTX(keyboard_appcursor),
dlg_stdradiobutton_handler,
I(offsetof(Config, app_cursor)),
"Normal", I(0), "Application", I(1), NULL);
ctrl_radiobuttons(s, "Initial state of numeric keypad:", 'n', 3,
HELPCTX(keyboard_appkeypad),
numeric_keypad_handler, P(NULL),
"Normal", I(0), "Application", I(1), "NetHack", I(2),
NULL);
/*
* The Terminal/Bell panel.
*/
ctrl_settitle(b, "Terminal/Bell",
"Options controlling the terminal bell");
s = ctrl_getset(b, "Terminal/Bell", "style", "Set the style of bell");
ctrl_radiobuttons(s, "Action to happen when a bell occurs:", 'b', 1,
HELPCTX(bell_style),
dlg_stdradiobutton_handler, I(offsetof(Config, beep)),
"None (bell disabled)", I(BELL_DISABLED),
"Make default system alert sound", I(BELL_DEFAULT),
"Visual bell (flash window)", I(BELL_VISUAL), NULL);
s = ctrl_getset(b, "Terminal/Bell", "overload",
"Control the bell overload behaviour");
ctrl_checkbox(s, "Bell is temporarily disabled when over-used", 'd',
HELPCTX(bell_overload),
dlg_stdcheckbox_handler, I(offsetof(Config,bellovl)));
ctrl_editbox(s, "Over-use means this many bells...", 'm', 20,
HELPCTX(bell_overload),
dlg_stdeditbox_handler, I(offsetof(Config,bellovl_n)), I(-1));
ctrl_editbox(s, "... in this many seconds", 't', 20,
HELPCTX(bell_overload),
dlg_stdeditbox_handler, I(offsetof(Config,bellovl_t)),
I(-TICKSPERSEC));
ctrl_text(s, "The bell is re-enabled after a few seconds of silence.",
HELPCTX(bell_overload));
ctrl_editbox(s, "Seconds of silence required", 's', 20,
HELPCTX(bell_overload),
dlg_stdeditbox_handler, I(offsetof(Config,bellovl_s)),
I(-TICKSPERSEC));
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
/*
* The Terminal/Features panel.
*/
ctrl_settitle(b, "Terminal/Features",
"Enabling and disabling advanced terminal features");
s = ctrl_getset(b, "Terminal/Features", "main", NULL);
ctrl_checkbox(s, "Disable application cursor keys mode", 'u',
HELPCTX(features_application),
dlg_stdcheckbox_handler, I(offsetof(Config,no_applic_c)));
ctrl_checkbox(s, "Disable application keypad mode", 'k',
HELPCTX(features_application),
dlg_stdcheckbox_handler, I(offsetof(Config,no_applic_k)));
ctrl_checkbox(s, "Disable xterm-style mouse reporting", 'x',
HELPCTX(features_mouse),
dlg_stdcheckbox_handler, I(offsetof(Config,no_mouse_rep)));
ctrl_checkbox(s, "Disable remote-controlled terminal resizing", 's',
HELPCTX(features_resize),
dlg_stdcheckbox_handler,
I(offsetof(Config,no_remote_resize)));
ctrl_checkbox(s, "Disable switching to alternate terminal screen", 'w',
HELPCTX(features_altscreen),
dlg_stdcheckbox_handler, I(offsetof(Config,no_alt_screen)));
ctrl_checkbox(s, "Disable remote-controlled window title changing", 't',
HELPCTX(features_retitle),
dlg_stdcheckbox_handler,
I(offsetof(Config,no_remote_wintitle)));
ctrl_radiobuttons(s, "Response to remote title query (SECURITY):", 'q', 3,
HELPCTX(features_qtitle),
dlg_stdradiobutton_handler,
I(offsetof(Config,remote_qtitle_action)),
"None", I(TITLE_NONE),
"Empty string", I(TITLE_EMPTY),
"Window title", I(TITLE_REAL), NULL);
ctrl_checkbox(s, "Disable destructive backspace on server sending ^?",'b',
HELPCTX(features_dbackspace),
dlg_stdcheckbox_handler, I(offsetof(Config,no_dbackspace)));
ctrl_checkbox(s, "Disable remote-controlled character set configuration",
'r', HELPCTX(features_charset), dlg_stdcheckbox_handler,
I(offsetof(Config,no_remote_charset)));
ctrl_checkbox(s, "Disable Arabic text shaping",

Jacob Nevins
committed
'l', HELPCTX(features_arabicshaping), dlg_stdcheckbox_handler,
I(offsetof(Config, arabicshaping)));
ctrl_checkbox(s, "Disable bidirectional text display",

Jacob Nevins
committed
'd', HELPCTX(features_bidi), dlg_stdcheckbox_handler,
I(offsetof(Config, bidi)));
/*
* The Window panel.
*/
str = dupprintf("Options controlling %s's window", appname);
ctrl_settitle(b, "Window", str);
sfree(str);
s = ctrl_getset(b, "Window", "size", "Set the size of the window");
ctrl_columns(s, 2, 50, 50);
c = ctrl_editbox(s, "Columns", 'm', 100,
HELPCTX(window_size),
dlg_stdeditbox_handler, I(offsetof(Config,width)), I(-1));
c->generic.column = 0;
c = ctrl_editbox(s, "Rows", 'r', 100,
HELPCTX(window_size),
dlg_stdeditbox_handler, I(offsetof(Config,height)),I(-1));
c->generic.column = 1;
ctrl_columns(s, 1, 100);
s = ctrl_getset(b, "Window", "scrollback",
"Control the scrollback in the window");
ctrl_editbox(s, "Lines of scrollback", 's', 50,
HELPCTX(window_scrollback),
dlg_stdeditbox_handler, I(offsetof(Config,savelines)), I(-1));
ctrl_checkbox(s, "Display scrollbar", 'd',
HELPCTX(window_scrollback),
dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar)));
ctrl_checkbox(s, "Reset scrollback on keypress", 'k',
HELPCTX(window_scrollback),
dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_key)));
ctrl_checkbox(s, "Reset scrollback on display activity", 'p',
HELPCTX(window_scrollback),
dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_disp)));
ctrl_checkbox(s, "Push erased text into scrollback", 'e',
HELPCTX(window_erased),
dlg_stdcheckbox_handler,
I(offsetof(Config,erase_to_scrollback)));
/*
* The Window/Appearance panel.
*/
str = dupprintf("Configure the appearance of %s's window", appname);
ctrl_settitle(b, "Window/Appearance", str);
sfree(str);
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
s = ctrl_getset(b, "Window/Appearance", "cursor",
"Adjust the use of the cursor");
ctrl_radiobuttons(s, "Cursor appearance:", NO_SHORTCUT, 3,
HELPCTX(appearance_cursor),
dlg_stdradiobutton_handler,
I(offsetof(Config, cursor_type)),
"Block", 'l', I(0),
"Underline", 'u', I(1),
"Vertical line", 'v', I(2), NULL);
ctrl_checkbox(s, "Cursor blinks", 'b',
HELPCTX(appearance_cursor),
dlg_stdcheckbox_handler, I(offsetof(Config,blink_cur)));
s = ctrl_getset(b, "Window/Appearance", "font",
"Font settings");
ctrl_fontsel(s, "Font used in the terminal window", 'n',
HELPCTX(appearance_font),
dlg_stdfontsel_handler, I(offsetof(Config, font)));
s = ctrl_getset(b, "Window/Appearance", "mouse",
"Adjust the use of the mouse pointer");
ctrl_checkbox(s, "Hide mouse pointer when typing in window", 'p',
HELPCTX(appearance_hidemouse),
dlg_stdcheckbox_handler, I(offsetof(Config,hide_mouseptr)));
s = ctrl_getset(b, "Window/Appearance", "border",
"Adjust the window border");
ctrl_editbox(s, "Gap between text and window edge:", 'e', 20,
HELPCTX(appearance_border),
dlg_stdeditbox_handler,
I(offsetof(Config,window_border)), I(-1));
/*
* The Window/Behaviour panel.
*/
str = dupprintf("Configure the behaviour of %s's window", appname);
ctrl_settitle(b, "Window/Behaviour", str);
sfree(str);
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
s = ctrl_getset(b, "Window/Behaviour", "title",
"Adjust the behaviour of the window title");
ctrl_editbox(s, "Window title:", 't', 100,
HELPCTX(appearance_title),
dlg_stdeditbox_handler, I(offsetof(Config,wintitle)),
I(sizeof(((Config *)0)->wintitle)));
ctrl_checkbox(s, "Separate window and icon titles", 'i',
HELPCTX(appearance_title),
dlg_stdcheckbox_handler,
I(CHECKBOX_INVERT | offsetof(Config,win_name_always)));
s = ctrl_getset(b, "Window/Behaviour", "main", NULL);
ctrl_checkbox(s, "Warn before closing window", 'w',
HELPCTX(behaviour_closewarn),
dlg_stdcheckbox_handler, I(offsetof(Config,warn_on_close)));
/*
* The Window/Translation panel.
*/
ctrl_settitle(b, "Window/Translation",
"Options controlling character set translation");
s = ctrl_getset(b, "Window/Translation", "trans",

Jacob Nevins
committed
"Character set translation");
ctrl_combobox(s, "Remote character set:",
'r', 100, HELPCTX(translation_codepage),
codepage_handler, P(NULL), P(NULL));
s = ctrl_getset(b, "Window/Translation", "tweaks", NULL);
ctrl_checkbox(s, "Treat CJK ambiguous characters as wide", 'w',
HELPCTX(translation_cjk_ambig_wide),
dlg_stdcheckbox_handler, I(offsetof(Config,cjk_ambig_wide)));
str = dupprintf("Adjust how %s handles line drawing characters", appname);
s = ctrl_getset(b, "Window/Translation", "linedraw", str);
sfree(str);
ctrl_radiobuttons(s, "Handling of line drawing characters:", NO_SHORTCUT,1,
HELPCTX(translation_linedraw),
dlg_stdradiobutton_handler,
I(offsetof(Config, vtmode)),
"Use Unicode line drawing code points",'u',I(VT_UNICODE),
"Poor man's line drawing (+, - and |)",'p',I(VT_POORMAN),
NULL);
ctrl_checkbox(s, "Copy and paste line drawing characters as lqqqk",'d',
HELPCTX(selection_linedraw),
dlg_stdcheckbox_handler, I(offsetof(Config,rawcnp)));
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
/*
* The Window/Selection panel.
*/
ctrl_settitle(b, "Window/Selection", "Options controlling copy and paste");
s = ctrl_getset(b, "Window/Selection", "mouse",
"Control use of mouse");
ctrl_checkbox(s, "Shift overrides application's use of mouse", 'p',
HELPCTX(selection_shiftdrag),
dlg_stdcheckbox_handler, I(offsetof(Config,mouse_override)));
ctrl_radiobuttons(s,
"Default selection mode (Alt+drag does the other one):",
NO_SHORTCUT, 2,
HELPCTX(selection_rect),
dlg_stdradiobutton_handler,
I(offsetof(Config, rect_select)),
"Normal", 'n', I(0),
"Rectangular block", 'r', I(1), NULL);
s = ctrl_getset(b, "Window/Selection", "charclass",
"Control the select-one-word-at-a-time mode");
ccd = (struct charclass_data *)
ctrl_alloc(b, sizeof(struct charclass_data));
ccd->listbox = ctrl_listbox(s, "Character classes:", 'e',
HELPCTX(selection_charclasses),
charclass_handler, P(ccd));
ccd->listbox->listbox.multisel = 1;
ccd->listbox->listbox.ncols = 4;
ccd->listbox->listbox.percentages = snewn(4, int);
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
ccd->listbox->listbox.percentages[0] = 15;
ccd->listbox->listbox.percentages[1] = 25;
ccd->listbox->listbox.percentages[2] = 20;
ccd->listbox->listbox.percentages[3] = 40;
ctrl_columns(s, 2, 67, 33);
ccd->editbox = ctrl_editbox(s, "Set to class", 't', 50,
HELPCTX(selection_charclasses),
charclass_handler, P(ccd), P(NULL));
ccd->editbox->generic.column = 0;
ccd->button = ctrl_pushbutton(s, "Set", 's',
HELPCTX(selection_charclasses),
charclass_handler, P(ccd));
ccd->button->generic.column = 1;
ctrl_columns(s, 1, 100);
/*
* The Window/Colours panel.
*/
ctrl_settitle(b, "Window/Colours", "Options controlling use of colours");
s = ctrl_getset(b, "Window/Colours", "general",
"General options for colour usage");
ctrl_checkbox(s, "Allow terminal to specify ANSI colours", 'i',
HELPCTX(colours_ansi),
dlg_stdcheckbox_handler, I(offsetof(Config,ansi_colour)));
ctrl_checkbox(s, "Allow terminal to use xterm 256-colour mode", '2',
HELPCTX(colours_xterm256), dlg_stdcheckbox_handler,
I(offsetof(Config,xterm_256_colour)));
ctrl_checkbox(s, "Bolded text is a different colour", 'b',
HELPCTX(colours_bold),
dlg_stdcheckbox_handler, I(offsetof(Config,bold_colour)));
str = dupprintf("Adjust the precise colours %s displays", appname);
s = ctrl_getset(b, "Window/Colours", "adjust", str);
sfree(str);
ctrl_text(s, "Select a colour from the list, and then click the"
" Modify button to change its appearance.",
HELPCTX(colours_config));
ctrl_columns(s, 2, 67, 33);
cd = (struct colour_data *)ctrl_alloc(b, sizeof(struct colour_data));
cd->listbox = ctrl_listbox(s, "Select a colour to adjust:", 'u',
HELPCTX(colours_config), colour_handler, P(cd));
cd->listbox->generic.column = 0;
cd->listbox->listbox.height = 7;
c = ctrl_text(s, "RGB value:", HELPCTX(colours_config));
c->generic.column = 1;
cd->redit = ctrl_editbox(s, "Red", 'r', 50, HELPCTX(colours_config),
colour_handler, P(cd), P(NULL));
cd->redit->generic.column = 1;
cd->gedit = ctrl_editbox(s, "Green", 'n', 50, HELPCTX(colours_config),
colour_handler, P(cd), P(NULL));
cd->gedit->generic.column = 1;
cd->bedit = ctrl_editbox(s, "Blue", 'e', 50, HELPCTX(colours_config),
colour_handler, P(cd), P(NULL));
cd->bedit->generic.column = 1;
cd->button = ctrl_pushbutton(s, "Modify", 'm', HELPCTX(colours_config),
colour_handler, P(cd));
cd->button->generic.column = 1;
ctrl_columns(s, 1, 100);
/*
* The Connection panel. This doesn't show up if we're in a
* non-network utility such as pterm. We tell this by being
* passed a protocol < 0.
if (protocol >= 0) {
ctrl_settitle(b, "Connection", "Options controlling the connection");
s = ctrl_getset(b, "Connection", "keepalive",
"Sending of null packets to keep session active");
ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20,
HELPCTX(connection_keepalive),
dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)),
I(-1));
if (!midsession) {
s = ctrl_getset(b, "Connection", "tcp",
"Low-level TCP connection options");
ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)",
'n', HELPCTX(connection_nodelay),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_nodelay)));
ctrl_checkbox(s, "Enable TCP keepalives (SO_KEEPALIVE option)",
'p', HELPCTX(connection_tcpkeepalive),
dlg_stdcheckbox_handler,
I(offsetof(Config,tcp_keepalives)));
#ifndef NO_IPV6
s = ctrl_getset(b, "Connection", "ipversion",
"Internet protocol version");
ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 3,
HELPCTX(connection_ipversion),
dlg_stdradiobutton_handler,
I(offsetof(Config, addressfamily)),
"Auto", 'u', I(ADDRTYPE_UNSPEC),
"IPv4", '4', I(ADDRTYPE_IPV4),
"IPv6", '6', I(ADDRTYPE_IPV6),
NULL);
#endif
{
char *label = backend_from_proto(PROT_SSH) ?
"Logical name of remote host (e.g. for SSH key lookup):" :
"Logical name of remote host:";
s = ctrl_getset(b, "Connection", "identity",
"Logical name of remote host");
ctrl_editbox(s, label, 'm', 100,
HELPCTX(connection_loghost),
dlg_stdeditbox_handler, I(offsetof(Config,loghost)),
I(sizeof(((Config *)0)->loghost)));
}
}
/*
* A sub-panel Connection/Data, containing options that
* decide on data to send to the server.
*/
if (!midsession) {
ctrl_settitle(b, "Connection/Data", "Data to send to the server");
s = ctrl_getset(b, "Connection/Data", "login",
"Login details");
ctrl_editbox(s, "Auto-login username", 'u', 50,
HELPCTX(connection_username),
dlg_stdeditbox_handler, I(offsetof(Config,username)),
I(sizeof(((Config *)0)->username)));

Jacob Nevins
committed
{
/* We assume the local username is sufficiently stable
* to include on the dialog box. */
char *user = get_username();
char *userlabel = dupprintf("Use system username (%s)",
user ? user : "");

Jacob Nevins
committed
sfree(user);
ctrl_radiobuttons(s, "When username is not specified:", 'n', 4,
HELPCTX(connection_username_from_env),
dlg_stdradiobutton_handler,
I(offsetof(Config, username_from_env)),
"Prompt", I(FALSE),
userlabel, I(TRUE),
NULL);
sfree(userlabel);
}
s = ctrl_getset(b, "Connection/Data", "term",
"Terminal details");
ctrl_editbox(s, "Terminal-type string", 't', 50,
HELPCTX(connection_termtype),
dlg_stdeditbox_handler, I(offsetof(Config,termtype)),
I(sizeof(((Config *)0)->termtype)));
ctrl_editbox(s, "Terminal speeds", 's', 50,
HELPCTX(connection_termspeed),
dlg_stdeditbox_handler, I(offsetof(Config,termspeed)),
I(sizeof(((Config *)0)->termspeed)));
s = ctrl_getset(b, "Connection/Data", "env",
"Environment variables");
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
ctrl_columns(s, 2, 80, 20);
ed = (struct environ_data *)
ctrl_alloc(b, sizeof(struct environ_data));
ed->varbox = ctrl_editbox(s, "Variable", 'v', 60,
HELPCTX(telnet_environ),
environ_handler, P(ed), P(NULL));
ed->varbox->generic.column = 0;
ed->valbox = ctrl_editbox(s, "Value", 'l', 60,
HELPCTX(telnet_environ),
environ_handler, P(ed), P(NULL));
ed->valbox->generic.column = 0;
ed->addbutton = ctrl_pushbutton(s, "Add", 'd',
HELPCTX(telnet_environ),
environ_handler, P(ed));
ed->addbutton->generic.column = 1;
ed->rembutton = ctrl_pushbutton(s, "Remove", 'r',
HELPCTX(telnet_environ),
environ_handler, P(ed));
ed->rembutton->generic.column = 1;
ctrl_columns(s, 1, 100);
ed->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT,
HELPCTX(telnet_environ),
environ_handler, P(ed));
ed->listbox->listbox.height = 3;
ed->listbox->listbox.ncols = 2;
ed->listbox->listbox.percentages = snewn(2, int);
ed->listbox->listbox.percentages[0] = 30;
ed->listbox->listbox.percentages[1] = 70;
}
if (!midsession) {
/*
* The Connection/Proxy panel.
*/
ctrl_settitle(b, "Connection/Proxy",
"Options controlling proxy usage");
s = ctrl_getset(b, "Connection/Proxy", "basics", NULL);
ctrl_radiobuttons(s, "Proxy type:", 't', 3,
HELPCTX(proxy_type),
dlg_stdradiobutton_handler,
I(offsetof(Config, proxy_type)),
"None", I(PROXY_NONE),
"SOCKS 4", I(PROXY_SOCKS4),
"SOCKS 5", I(PROXY_SOCKS5),
"HTTP", I(PROXY_HTTP),
"Telnet", I(PROXY_TELNET),
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
NULL);
ctrl_columns(s, 2, 80, 20);
c = ctrl_editbox(s, "Proxy hostname", 'y', 100,
HELPCTX(proxy_main),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_host)),
I(sizeof(((Config *)0)->proxy_host)));
c->generic.column = 0;
c = ctrl_editbox(s, "Port", 'p', 100,
HELPCTX(proxy_main),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_port)),
I(-1));
c->generic.column = 1;
ctrl_columns(s, 1, 100);
ctrl_editbox(s, "Exclude Hosts/IPs", 'e', 100,
HELPCTX(proxy_exclude),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_exclude_list)),
I(sizeof(((Config *)0)->proxy_exclude_list)));
ctrl_checkbox(s, "Consider proxying local host connections", 'x',
HELPCTX(proxy_exclude),
dlg_stdcheckbox_handler,
I(offsetof(Config,even_proxy_localhost)));
ctrl_radiobuttons(s, "Do DNS name lookup at proxy end:", 'd', 3,
HELPCTX(proxy_dns),
dlg_stdradiobutton_handler,
I(offsetof(Config, proxy_dns)),
"No", I(FORCE_OFF),
"Auto", I(AUTO),
"Yes", I(FORCE_ON), NULL);
ctrl_editbox(s, "Username", 'u', 60,
HELPCTX(proxy_auth),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_username)),
I(sizeof(((Config *)0)->proxy_username)));
c = ctrl_editbox(s, "Password", 'w', 60,
HELPCTX(proxy_auth),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_password)),
I(sizeof(((Config *)0)->proxy_password)));
c->editbox.password = 1;
ctrl_editbox(s, "Telnet command", 'm', 100,
HELPCTX(proxy_command),
dlg_stdeditbox_handler,
I(offsetof(Config,proxy_telnet_command)),
I(sizeof(((Config *)0)->proxy_telnet_command)));
}
/*
* The Telnet panel exists in the base config box, and in a
* mid-session reconfig box _if_ we're using Telnet.
*/
if (!midsession || protocol == PROT_TELNET) {
/*
* The Connection/Telnet panel.
*/
ctrl_settitle(b, "Connection/Telnet",
"Options controlling Telnet connections");
s = ctrl_getset(b, "Connection/Telnet", "protocol",
"Telnet protocol adjustments");
if (!midsession) {
ctrl_radiobuttons(s, "Handling of OLD_ENVIRON ambiguity:",
NO_SHORTCUT, 2,
HELPCTX(telnet_oldenviron),
dlg_stdradiobutton_handler,
I(offsetof(Config, rfc_environ)),
"BSD (commonplace)", 'b', I(0),
"RFC 1408 (unusual)", 'f', I(1), NULL);
ctrl_radiobuttons(s, "Telnet negotiation mode:", 't', 2,
HELPCTX(telnet_passive),
dlg_stdradiobutton_handler,
I(offsetof(Config, passive_telnet)),
"Passive", I(1), "Active", I(0), NULL);
}
ctrl_checkbox(s, "Keyboard sends Telnet special commands", 'k',
HELPCTX(telnet_specialkeys),
dlg_stdcheckbox_handler,
I(offsetof(Config,telnet_keyboard)));
ctrl_checkbox(s, "Return key sends Telnet New Line instead of ^M",
'm', HELPCTX(telnet_newline),
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
dlg_stdcheckbox_handler,
I(offsetof(Config,telnet_newline)));
}
if (!midsession) {
/*
* The Connection/Rlogin panel.
*/
ctrl_settitle(b, "Connection/Rlogin",
"Options controlling Rlogin connections");
s = ctrl_getset(b, "Connection/Rlogin", "data",
"Data to send to the server");
ctrl_editbox(s, "Local username:", 'l', 50,
HELPCTX(rlogin_localuser),
dlg_stdeditbox_handler, I(offsetof(Config,localusername)),
I(sizeof(((Config *)0)->localusername)));
}
/*
* All the SSH stuff is omitted in PuTTYtel, or in a reconfig
* when we're not doing SSH.
*/
if (backend_from_proto(PROT_SSH) && (!midsession || protocol == PROT_SSH)) {
/*
* The Connection/SSH panel.
*/
ctrl_settitle(b, "Connection/SSH",
"Options controlling SSH connections");
if (midsession && protcfginfo == 1) {
s = ctrl_getset(b, "Connection/SSH", "disclaimer", NULL);
ctrl_text(s, "Nothing on this panel may be reconfigured in mid-"
"session; it is only here so that sub-panels of it can "
"exist without looking strange.", HELPCTX(no_help));
}
if (!midsession) {
s = ctrl_getset(b, "Connection/SSH", "data",
"Data to send to the server");
ctrl_editbox(s, "Remote command:", 'r', 100,
HELPCTX(ssh_command),
dlg_stdeditbox_handler, I(offsetof(Config,remote_cmd)),
I(sizeof(((Config *)0)->remote_cmd)));
s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options");
ctrl_checkbox(s, "Don't start a shell or command at all", 'n',
HELPCTX(ssh_noshell),
dlg_stdcheckbox_handler,
I(offsetof(Config,ssh_no_shell)));
}
if (!midsession || protcfginfo != 1) {
s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options");
ctrl_checkbox(s, "Enable compression", 'e',
HELPCTX(ssh_compress),
dlg_stdcheckbox_handler,
I(offsetof(Config,compression)));
}
if (!midsession) {
s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options");
ctrl_radiobuttons(s, "Preferred SSH protocol version:", NO_SHORTCUT, 4,
HELPCTX(ssh_protocol),
dlg_stdradiobutton_handler,
I(offsetof(Config, sshprot)),
"1 only", 'l', I(0),
"1", '1', I(1),