Various error-handling fixes, mostly in Unix PuTTY but one (failure
[u/mdw/putty] / config.c
index 6aac6ce..7204a6c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -110,7 +110,7 @@ static void cipherlist_handler(union control *ctrl, void *dlg,
                    break;
                }
            }
-           dlg_listbox_addwithindex(ctrl, dlg, cstr, c);
+           dlg_listbox_addwithid(ctrl, dlg, cstr, c);
        }
        dlg_update_done(ctrl, dlg);
 
@@ -179,9 +179,9 @@ static void sshbug_handler(union control *ctrl, void *dlg,
     if (event == EVENT_REFRESH) {
        dlg_update_start(ctrl, dlg);
        dlg_listbox_clear(ctrl, dlg);
-       dlg_listbox_addwithindex(ctrl, dlg, "Auto", AUTO);
-       dlg_listbox_addwithindex(ctrl, dlg, "Off", FORCE_OFF);
-       dlg_listbox_addwithindex(ctrl, dlg, "On", FORCE_ON);
+       dlg_listbox_addwithid(ctrl, dlg, "Auto", AUTO);
+       dlg_listbox_addwithid(ctrl, dlg, "Off", FORCE_OFF);
+       dlg_listbox_addwithid(ctrl, dlg, "On", FORCE_ON);
        switch (*(int *)ATOFFSET(data, ctrl->listbox.context.i)) {
          case AUTO:      dlg_listbox_select(ctrl, dlg, 0); break;
          case FORCE_OFF: dlg_listbox_select(ctrl, dlg, 1); break;
@@ -305,7 +305,13 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
                    savedsession[0] = '\0';
                }
            }
-           save_settings(savedsession, !isdef, cfg);
+            {
+                char *errmsg = save_settings(savedsession, !isdef, cfg);
+                if (errmsg) {
+                    dlg_error_msg(dlg, errmsg);
+                    sfree(errmsg);
+                }
+            }
            get_sesslist(ssd->sesslist, FALSE);
            get_sesslist(ssd->sesslist, TRUE);
            dlg_refresh(ssd->editbox, dlg);
@@ -328,7 +334,7 @@ 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, savedsession, dlg, &cfg2)) {
                    dlg_beep(dlg);
@@ -396,7 +402,7 @@ static void charclass_handler(union control *ctrl, void *dlg,
 }
 
 struct colour_data {
-    union control *listbox, *rgbtext, *button;
+    union control *listbox, *redit, *gedit, *bedit, *button;
 };
 
 static const char *const colours[] = {
@@ -429,7 +435,9 @@ static void colour_handler(union control *ctrl, void *dlg,
            for (i = 0; i < lenof(colours); i++)
                dlg_listbox_add(ctrl, dlg, colours[i]);
            dlg_update_done(ctrl, dlg);
-           dlg_text_set(cd->rgbtext, dlg, "");
+           dlg_editbox_set(cd->redit, dlg, "");
+           dlg_editbox_set(cd->gedit, dlg, "");
+           dlg_editbox_set(cd->bedit, dlg, "");
        }
     } else if (event == EVENT_SELCHANGE) {
        if (ctrl == cd->listbox) {
@@ -444,6 +452,25 @@ static void colour_handler(union control *ctrl, void *dlg,
            b = cfg->colours[i][2];
            update = TRUE;
        }
+    } else if (event == EVENT_VALCHANGE) {
+       if (ctrl == cd->redit || ctrl == cd->gedit || ctrl == cd->bedit) {
+           /* The user has changed the colour using the edit boxes. */
+           char buf[80];
+           int i, cval;
+
+           dlg_editbox_get(ctrl, dlg, buf, lenof(buf));
+           cval = atoi(buf) & 255;
+
+           i = dlg_listbox_index(cd->listbox, dlg);
+           if (i >= 0) {
+               if (ctrl == cd->redit)
+                   cfg->colours[i][0] = cval;
+               else if (ctrl == cd->gedit)
+                   cfg->colours[i][1] = cval;
+               else if (ctrl == cd->bedit)
+                   cfg->colours[i][2] = cval;
+           }
+       }
     } else if (event == EVENT_ACTION) {
        if (ctrl == cd->button) {
            int i = dlg_listbox_index(cd->listbox, dlg);
@@ -480,8 +507,9 @@ static void colour_handler(union control *ctrl, void *dlg,
 
     if (update) {
        char buf[40];
-       sprintf(buf, "%02x/%02x/%02x", r, g, b);
-       dlg_text_set(cd->rgbtext, dlg, buf);
+       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);
     }
 }
 
@@ -596,6 +624,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) {
@@ -700,6 +733,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. */
@@ -754,6 +788,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));
@@ -766,11 +805,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);
     }
 
@@ -919,13 +953,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.
@@ -986,10 +1020,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)));
@@ -1117,7 +1147,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                                charclass_handler, P(ccd));
     ccd->listbox->listbox.multisel = 1;
     ccd->listbox->listbox.ncols = 4;
-    ccd->listbox->listbox.percentages = smalloc(4*sizeof(int));
+    ccd->listbox->listbox.percentages = snewn(4, int);
     ccd->listbox->listbox.percentages[0] = 15;
     ccd->listbox->listbox.percentages[1] = 25;
     ccd->listbox->listbox.percentages[2] = 20;
@@ -1154,10 +1184,18 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     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->rgbtext = ctrl_text(s, "00/00/00", HELPCTX(colours_config));
-    cd->rgbtext->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;
@@ -1312,6 +1350,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 = snewn(2, int);
+           ed->listbox->listbox.percentages[0] = 30;
+           ed->listbox->listbox.percentages[1] = 70;
        }
 
        s = ctrl_getset(b, "Connection/Telnet", "protocol",
@@ -1488,6 +1530,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 = snewn(2, 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.