#define HOST_BOX_TITLE "Host Name (or IP address)"
#define PORT_BOX_TITLE "Port"
-/*
- * Convenience function: determine whether this binary supports a
- * given backend.
- */
-static int have_backend(int protocol)
-{
- struct backend_list *p = backends;
- for (p = backends; p->name; p++) {
- if (p->protocol == protocol)
- return 1;
- }
- return 0;
-}
-
static void config_host_handler(union control *ctrl, void *dlg,
void *data, int event)
{
void config_protocolbuttons_handler(union control *ctrl, void *dlg,
void *data, int event)
{
- int button, defport;
+ int button;
Config *cfg = (Config *)data;
struct hostport *hp = (struct hostport *)ctrl->radio.context.p;
assert(button >= 0 && button < ctrl->radio.nbuttons);
cfg->protocol = ctrl->radio.buttondata[button].i;
if (oldproto != cfg->protocol) {
- defport = -1;
- switch (cfg->protocol) {
- case PROT_SSH: defport = 22; break;
- case PROT_TELNET: defport = 23; break;
- case PROT_RLOGIN: defport = 513; break;
- }
- if (defport > 0 && cfg->port != defport) {
- cfg->port = defport;
- }
+ Backend *ob = backend_from_proto(oldproto);
+ Backend *nb = backend_from_proto(cfg->protocol);
+ assert(ob);
+ assert(nb);
+ /* Iff the user hasn't changed the port from the protocol
+ * default (if any), update it with the new protocol's
+ * default.
+ * (XXX: this isn't perfect; a default can become permanent
+ * by going via the serial backend. However, it helps with
+ * the common case of tabbing through the controls in order
+ * and setting a non-default port.) */
+ if (cfg->port == ob->default_port &&
+ cfg->port > 0 && nb->default_port > 0)
+ cfg->port = nb->default_port;
}
dlg_refresh(hp->host, dlg);
dlg_refresh(hp->port, dlg);
Config *cfg = (Config *)data;
struct colour_data *cd =
(struct colour_data *)ctrl->generic.context.p;
- int update = FALSE, r, g, b;
+ int update = FALSE, clear, r, g, b;
if (event == EVENT_REFRESH) {
if (ctrl == cd->listbox) {
for (i = 0; i < lenof(colours); i++)
dlg_listbox_add(ctrl, dlg, colours[i]);
dlg_update_done(ctrl, dlg);
- dlg_editbox_set(cd->redit, dlg, "");
- dlg_editbox_set(cd->gedit, dlg, "");
- dlg_editbox_set(cd->bedit, dlg, "");
+ clear = TRUE;
+ update = TRUE;
}
} else if (event == EVENT_SELCHANGE) {
if (ctrl == cd->listbox) {
/* The user has selected a colour. Update the RGB text. */
int i = dlg_listbox_index(ctrl, dlg);
if (i < 0) {
- dlg_beep(dlg);
- return;
+ clear = TRUE;
+ } else {
+ clear = FALSE;
+ r = cfg->colours[i][0];
+ g = cfg->colours[i][1];
+ b = cfg->colours[i][2];
}
- r = cfg->colours[i][0];
- g = cfg->colours[i][1];
- b = cfg->colours[i][2];
update = TRUE;
}
} else if (event == EVENT_VALCHANGE) {
cfg->colours[i][0] = r;
cfg->colours[i][1] = g;
cfg->colours[i][2] = b;
+ clear = FALSE;
update = TRUE;
}
}
}
if (update) {
- char buf[40];
- sprintf(buf, "%d", r); dlg_editbox_set(cd->redit, dlg, buf);
- sprintf(buf, "%d", g); dlg_editbox_set(cd->gedit, dlg, buf);
- sprintf(buf, "%d", b); dlg_editbox_set(cd->bedit, dlg, buf);
+ if (clear) {
+ dlg_editbox_set(cd->redit, dlg, "");
+ dlg_editbox_set(cd->gedit, dlg, "");
+ dlg_editbox_set(cd->bedit, dlg, "");
+ } else {
+ char buf[40];
+ sprintf(buf, "%d", r); dlg_editbox_set(cd->redit, dlg, buf);
+ sprintf(buf, "%d", g); dlg_editbox_set(cd->gedit, dlg, buf);
+ sprintf(buf, "%d", b); dlg_editbox_set(cd->bedit, dlg, buf);
+ }
}
}
{
static const char *const afs = "A46";
char *afp = strchr(afs, *p);
+#ifndef NO_IPV6
int idx = afp ? afp-afs : 0;
+#endif
if (afp)
p++;
#ifndef NO_IPV6
hp->port = c;
ctrl_columns(s, 1, 100);
- if (!have_backend(PROT_SSH)) {
+ if (!backend_from_proto(PROT_SSH)) {
ctrl_radiobuttons(s, "Connection type:", NO_SHORTCUT, 3,
HELPCTX(session_hostname),
config_protocolbuttons_handler, P(hp),
{
char *sshlogname, *sshrawlogname;
if ((midsession && protocol == PROT_SSH) ||
- (!midsession && have_backend(PROT_SSH))) {
+ (!midsession && backend_from_proto(PROT_SSH))) {
sshlogname = "SSH packets";
sshrawlogname = "SSH packets and raw data";
} else {
dlg_stdcheckbox_handler, I(offsetof(Config,logflush)));
if ((midsession && protocol == PROT_SSH) ||
- (!midsession && have_backend(PROT_SSH))) {
+ (!midsession && backend_from_proto(PROT_SSH))) {
s = ctrl_getset(b, "Session/Logging", "ssh",
"Options specific to SSH packet logging");
ctrl_checkbox(s, "Omit known password fields", 'k',
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)));
ctrl_checkbox(s, "Use background colour to erase screen", 'e',
HELPCTX(terminal_bce),
dlg_stdcheckbox_handler, I(offsetof(Config,bce)));
"IPv6", '6', I(ADDRTYPE_IPV6),
NULL);
#endif
+
+ s = ctrl_getset(b, "Connection", "identity",
+ "Logical name of remote host");
+ ctrl_editbox(s, "Logical name of remote host (e.g. for SSH key lookup):",
+ 'm', 100,
+ HELPCTX(connection_loghost),
+ dlg_stdeditbox_handler, I(offsetof(Config,loghost)),
+ I(sizeof(((Config *)0)->loghost)));
}
/*
* when we're not doing SSH.
*/
- if (have_backend(PROT_SSH) && (!midsession || protocol == PROT_SSH)) {
+ if (backend_from_proto(PROT_SSH) && (!midsession || protocol == PROT_SSH)) {
/*
* The Connection/SSH panel.
ctrl_droplist(s, "Handles SSH-2 key re-exchange badly", 'k', 20,
HELPCTX(ssh_bugs_rekey2),
sshbug_handler, I(offsetof(Config,sshbug_rekey2)));
+ ctrl_droplist(s, "Ignores SSH-2 maximum packet size", 'x', 20,
+ HELPCTX(ssh_bugs_maxpkt2),
+ sshbug_handler, I(offsetof(Config,sshbug_maxpkt2)));
}
}
}