+
+#ifndef NO_GSSAPI
+ /*
+ * Connection/SSH/Auth/GSSAPI, which sadly won't fit on
+ * the main Auth panel.
+ */
+ ctrl_settitle(b, "Connection/SSH/Auth/GSSAPI",
+ "Options controlling GSSAPI authentication");
+ s = ctrl_getset(b, "Connection/SSH/Auth/GSSAPI", "gssapi", NULL);
+
+ ctrl_checkbox(s, "Attempt GSSAPI authentication (SSH-2 only)",
+ 't', HELPCTX(ssh_gssapi),
+ dlg_stdcheckbox_handler,
+ I(offsetof(Config,try_gssapi_auth)));
+
+ ctrl_checkbox(s, "Allow GSSAPI credential delegation", 'l',
+ HELPCTX(ssh_gssapi_delegation),
+ dlg_stdcheckbox_handler,
+ I(offsetof(Config,gssapifwd)));
+
+ /*
+ * GSSAPI library selection.
+ */
+ if (ngsslibs > 1) {
+ c = ctrl_draglist(s, "Preference order for GSSAPI libraries:",
+ 'p', HELPCTX(ssh_gssapi_libraries),
+ gsslist_handler, P(NULL));
+ c->listbox.height = ngsslibs;
+
+ /*
+ * I currently assume that if more than one GSS
+ * library option is available, then one of them is
+ * 'user-supplied' and so we should present the
+ * following file selector. This is at least half-
+ * reasonable, because if we're using statically
+ * linked GSSAPI then there will only be one option
+ * and no way to load from a user-supplied library,
+ * whereas if we're using dynamic libraries then
+ * there will almost certainly be some default
+ * option in addition to a user-supplied path. If
+ * anyone ever ports PuTTY to a system on which
+ * dynamic-library GSSAPI is available but there is
+ * absolutely no consensus on where to keep the
+ * libraries, there'll need to be a flag alongside
+ * ngsslibs to control whether the file selector is
+ * displayed.
+ */
+
+ ctrl_filesel(s, "User-supplied GSSAPI library path:", 's',
+ FILTER_DYNLIB_FILES, FALSE, "Select library file",
+ HELPCTX(ssh_gssapi_libraries),
+ dlg_stdfilesel_handler,
+ I(offsetof(Config, ssh_gss_custom)));
+ }
+#endif
+ }
+
+ if (!midsession) {
+ /*
+ * The Connection/SSH/TTY panel.
+ */
+ ctrl_settitle(b, "Connection/SSH/TTY", "Remote terminal settings");
+
+ s = ctrl_getset(b, "Connection/SSH/TTY", "sshtty", NULL);
+ ctrl_checkbox(s, "Don't allocate a pseudo-terminal", 'p',
+ HELPCTX(ssh_nopty),
+ dlg_stdcheckbox_handler,
+ I(offsetof(Config,nopty)));
+
+ s = ctrl_getset(b, "Connection/SSH/TTY", "ttymodes",
+ "Terminal modes");
+ td = (struct ttymodes_data *)
+ ctrl_alloc(b, sizeof(struct ttymodes_data));
+ ctrl_columns(s, 2, 75, 25);
+ c = ctrl_text(s, "Terminal modes to send:", HELPCTX(ssh_ttymodes));
+ c->generic.column = 0;
+ td->rembutton = ctrl_pushbutton(s, "Remove", 'r',
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td));
+ td->rembutton->generic.column = 1;
+ td->rembutton->generic.tabdelay = 1;
+ ctrl_columns(s, 1, 100);
+ td->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT,
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td));
+ td->listbox->listbox.multisel = 1;
+ td->listbox->listbox.height = 4;
+ td->listbox->listbox.ncols = 2;
+ td->listbox->listbox.percentages = snewn(2, int);
+ td->listbox->listbox.percentages[0] = 40;
+ td->listbox->listbox.percentages[1] = 60;
+ ctrl_tabdelay(s, td->rembutton);
+ ctrl_columns(s, 2, 75, 25);
+ td->modelist = ctrl_droplist(s, "Mode:", 'm', 67,
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td));
+ td->modelist->generic.column = 0;
+ td->addbutton = ctrl_pushbutton(s, "Add", 'd',
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td));
+ td->addbutton->generic.column = 1;
+ td->addbutton->generic.tabdelay = 1;
+ ctrl_columns(s, 1, 100); /* column break */
+ /* Bit of a hack to get the value radio buttons and
+ * edit-box on the same row. */
+ ctrl_columns(s, 3, 25, 50, 25);
+ c = ctrl_text(s, "Value:", HELPCTX(ssh_ttymodes));
+ c->generic.column = 0;
+ td->valradio = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 2,
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td),
+ "Auto", NO_SHORTCUT, P(NULL),
+ "This:", NO_SHORTCUT, P(NULL),
+ NULL);
+ td->valradio->generic.column = 1;
+ td->valbox = ctrl_editbox(s, NULL, NO_SHORTCUT, 100,
+ HELPCTX(ssh_ttymodes),
+ ttymodes_handler, P(td), P(NULL));
+ td->valbox->generic.column = 2;
+ ctrl_tabdelay(s, td->addbutton);
+