Fiddle with the cmdline_saved mechanism: the `-load' option is now
[u/mdw/putty] / config.c
index f41e9ec..185529c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -198,10 +198,11 @@ static void sshbug_handler(union control *ctrl, void *dlg,
     }
 }
 
+#define SAVEDSESSION_LEN 2048
+
 struct sessionsaver_data {
     union control *editbox, *listbox, *loadbutton, *savebutton, *delbutton;
     union control *okbutton, *cancelbutton;
-    char savedsession[2048];
     struct sesslist *sesslist;
 };
 
@@ -211,6 +212,7 @@ struct sessionsaver_data {
  * failure.
  */
 static int load_selected_session(struct sessionsaver_data *ssd,
+                                char *savedsession,
                                 void *dlg, Config *cfg)
 {
     int i = dlg_listbox_index(ssd->listbox, dlg);
@@ -222,11 +224,11 @@ static int load_selected_session(struct sessionsaver_data *ssd,
     isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings");
     load_settings(ssd->sesslist->sessions[i], !isdef, cfg);
     if (!isdef) {
-       strncpy(ssd->savedsession, ssd->sesslist->sessions[i],
-               sizeof(ssd->savedsession));
-       ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0';
+       strncpy(savedsession, ssd->sesslist->sessions[i],
+               SAVEDSESSION_LEN);
+       savedsession[SAVEDSESSION_LEN-1] = '\0';
     } else {
-       ssd->savedsession[0] = '\0';
+       savedsession[0] = '\0';
     }
     dlg_refresh(NULL, dlg);
     /* Restore the selection, which might have been clobbered by
@@ -241,10 +243,25 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
     Config *cfg = (Config *)data;
     struct sessionsaver_data *ssd =
        (struct sessionsaver_data *)ctrl->generic.context.p;
+    char *savedsession;
+
+    /*
+     * The first time we're called in a new dialog, we must
+     * allocate space to store the current contents of the saved
+     * session edit box (since it must persist even when we switch
+     * panels, but is not part of the Config).
+     */
+    if (!dlg_get_privdata(ssd->editbox, dlg)) {
+       savedsession = (char *)
+           dlg_alloc_privdata(ssd->editbox, dlg, SAVEDSESSION_LEN);
+       savedsession[0] = '\0';
+    } else {
+       savedsession = dlg_get_privdata(ssd->editbox, dlg);
+    }
 
     if (event == EVENT_REFRESH) {
        if (ctrl == ssd->editbox) {
-           dlg_editbox_set(ctrl, dlg, ssd->savedsession);
+           dlg_editbox_set(ctrl, dlg, savedsession);
        } else if (ctrl == ssd->listbox) {
            int i;
            dlg_update_start(ctrl, dlg);
@@ -255,8 +272,8 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
        }
     } else if (event == EVENT_VALCHANGE) {
        if (ctrl == ssd->editbox) {
-           dlg_editbox_get(ctrl, dlg, ssd->savedsession,
-                           sizeof(ssd->savedsession));
+           dlg_editbox_get(ctrl, dlg, savedsession,
+                           SAVEDSESSION_LEN);
        }
     } else if (event == EVENT_ACTION) {
        if (ctrl == ssd->listbox || ctrl == ssd->loadbutton) {
@@ -267,13 +284,13 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
             * double-click on the list box _and_ that session
             * contains a hostname.
             */
-           if (load_selected_session(ssd, dlg, cfg) &&
+           if (load_selected_session(ssd, savedsession, dlg, cfg) &&
                (ctrl == ssd->listbox && cfg->host[0])) {
                dlg_end(dlg, 1);       /* it's all over, and succeeded */
            }
        } else if (ctrl == ssd->savebutton) {
-           int isdef = !strcmp(ssd->savedsession, "Default Settings");
-           if (!ssd->savedsession[0]) {
+           int isdef = !strcmp(savedsession, "Default Settings");
+           if (!savedsession[0]) {
                int i = dlg_listbox_index(ssd->listbox, dlg);
                if (i < 0) {
                    dlg_beep(dlg);
@@ -281,14 +298,14 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
                }
                isdef = !strcmp(ssd->sesslist->sessions[i], "Default Settings");
                if (!isdef) {
-                   strncpy(ssd->savedsession, ssd->sesslist->sessions[i],
-                           sizeof(ssd->savedsession));
-                   ssd->savedsession[sizeof(ssd->savedsession)-1] = '\0';
+                   strncpy(savedsession, ssd->sesslist->sessions[i],
+                           SAVEDSESSION_LEN);
+                   savedsession[SAVEDSESSION_LEN-1] = '\0';
                } else {
-                   ssd->savedsession[0] = '\0';
+                   savedsession[0] = '\0';
                }
            }
-           save_settings(ssd->savedsession, !isdef, cfg);
+           save_settings(savedsession, !isdef, cfg);
            get_sesslist(ssd->sesslist, FALSE);
            get_sesslist(ssd->sesslist, TRUE);
            dlg_refresh(ssd->editbox, dlg);
@@ -311,9 +328,9 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
             * there was a session selected in that which had a
             * valid host name in it, then load it and go.
             */
-           if (dlg_last_focused(dlg) == ssd->listbox && !*cfg->host) {
+           if (dlg_last_focused(ctrl, dlg) == ssd->listbox && !*cfg->host) {
                Config cfg2;
-               if (!load_selected_session(ssd, dlg, &cfg2)) {
+               if (!load_selected_session(ssd, savedsession, dlg, &cfg2)) {
                    dlg_beep(dlg);
                    return;
                }
@@ -579,6 +596,11 @@ static void portfwd_handler(union control *ctrl, void *dlg,
                p += strlen(p) + 1;
            }
            dlg_update_done(ctrl, dlg);
+       } else if (ctrl == pfd->direction) {
+           /*
+            * Default is Local.
+            */
+           dlg_radiobutton_set(ctrl, dlg, 0);
        }
     } else if (event == EVENT_ACTION) {
        if (ctrl == pfd->addbutton) {
@@ -683,6 +705,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     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. */
@@ -706,7 +729,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                         I(offsetof(Config,port)), I(-1));
        c->generic.column = 1;
        ctrl_columns(s, 1, 100);
-       if (backends[3].backend == NULL) {
+       if (backends[3].name == NULL) {
            ctrl_radiobuttons(s, "Protocol:", NO_SHORTCUT, 3,
                              HELPCTX(session_hostname),
                              protocolbuttons_handler, P(c),
@@ -728,7 +751,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
        s = ctrl_getset(b, "Session", "savedsessions",
                        "Load, save or delete a stored session");
        ctrl_columns(s, 2, 75, 25);
-       ssd->savedsession[0] = '\0';
        ssd->sesslist = sesslist;
        ssd->editbox = ctrl_editbox(s, "Saved Sessions", 'e', 100,
                                    HELPCTX(session_saved),
@@ -738,6 +760,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
         * 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;
        ssd->loadbutton = ctrl_pushbutton(s, "Load", 'l',
                                          HELPCTX(session_saved),
                                          sessionsaver_handler, P(ssd));
@@ -750,11 +777,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                                         HELPCTX(session_saved),
                                         sessionsaver_handler, P(ssd));
        ssd->delbutton->generic.column = 1;
-       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;
        ctrl_columns(s, 1, 100);
     }
 
@@ -903,13 +925,13 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     ctrl_editbox(s, "... in this many seconds", 't', 20,
                 HELPCTX(bell_overload),
                 dlg_stdeditbox_handler, I(offsetof(Config,bellovl_t)),
-                I(-1000));
+                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(-1000));
+                I(-TICKSPERSEC));
 
     /*
      * The Terminal/Features panel.
@@ -970,10 +992,6 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     ctrl_checkbox(s, "Display scrollbar", 'd',
                  HELPCTX(window_scrollback),
                  dlg_stdcheckbox_handler, I(offsetof(Config,scrollbar)));
-    ctrl_checkbox(s, "Display scrollbar in full screen mode", 'i',
-                 HELPCTX(window_scrollback),
-                 dlg_stdcheckbox_handler,
-                 I(offsetof(Config,scrollbar_in_fullscreen)));
     ctrl_checkbox(s, "Reset scrollback on keypress", 'k',
                  HELPCTX(window_scrollback),
                  dlg_stdcheckbox_handler, I(offsetof(Config,scroll_on_key)));
@@ -1296,6 +1314,10 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                                       HELPCTX(telnet_environ),
                                       environ_handler, P(ed));
            ed->listbox->listbox.height = 3;
+           ed->listbox->listbox.ncols = 2;
+           ed->listbox->listbox.percentages = smalloc(2*sizeof(int));
+           ed->listbox->listbox.percentages[0] = 30;
+           ed->listbox->listbox.percentages[1] = 70;
        }
 
        s = ctrl_getset(b, "Connection/Telnet", "protocol",
@@ -1350,7 +1372,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
      * All the SSH stuff is omitted in PuTTYtel.
      */
 
-    if (!midsession && backends[3].backend != NULL) {
+    if (!midsession && backends[3].name != NULL) {
 
        /*
         * The Connection/SSH panel.
@@ -1384,9 +1406,11 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                          "2 only", 'n', I(3), NULL);
 
        s = ctrl_getset(b, "Connection/SSH", "encryption", "Encryption options");
-       ctrl_draglist(s, "Encryption cipher selection policy:", 's',
-                     HELPCTX(ssh_ciphers),
-                     cipherlist_handler, P(NULL));
+       c = ctrl_draglist(s, "Encryption cipher selection policy:", 's',
+                         HELPCTX(ssh_ciphers),
+                         cipherlist_handler, P(NULL));
+       c->listbox.height = 6;
+       
        ctrl_checkbox(s, "Enable non-standard use of single-DES in SSH 2", 'i',
                      HELPCTX(ssh_ciphers),
                      dlg_stdcheckbox_handler,
@@ -1470,6 +1494,10 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                                    HELPCTX(ssh_tunnels_portfwd),
                                    portfwd_handler, P(pfd));
        pfd->listbox->listbox.height = 3;
+       pfd->listbox->listbox.ncols = 2;
+       pfd->listbox->listbox.percentages = smalloc(2*sizeof(int));
+       pfd->listbox->listbox.percentages[0] = 20;
+       pfd->listbox->listbox.percentages[1] = 80;
        ctrl_tabdelay(s, pfd->rembutton);
        ctrl_text(s, "Add new forwarded port:", HELPCTX(ssh_tunnels_portfwd));
        /* You want to enter source, destination and type, _then_ hit Add.