Introduced wrapper macros snew(), snewn() and sresize() for the
[u/mdw/putty] / wincfg.c
index 5b5bf9a..896c1bc 100644 (file)
--- a/wincfg.c
+++ b/wincfg.c
@@ -54,6 +54,41 @@ void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help,
     }
 
     /*
+     * Full-screen mode is a Windows peculiarity; hence
+     * scrollbar_in_fullscreen is as well.
+     */
+    s = ctrl_getset(b, "Window", "scrollback",
+                   "Control the scrollback in the window");
+    ctrl_checkbox(s, "Display scrollbar in full screen mode", 'i',
+                 HELPCTX(window_scrollback),
+                 dlg_stdcheckbox_handler,
+                 I(offsetof(Config,scrollbar_in_fullscreen)));
+    /*
+     * Really this wants to go just after `Display scrollbar'. See
+     * if we can find that control, and do some shuffling.
+     */
+    {
+        int i;
+        for (i = 0; i < s->ncontrols; i++) {
+            c = s->ctrls[i];
+            if (c->generic.type == CTRL_CHECKBOX &&
+                c->generic.context.i == offsetof(Config,scrollbar)) {
+                /*
+                 * Control i is the scrollbar checkbox.
+                 * Control s->ncontrols-1 is the scrollbar-in-FS one.
+                 */
+                if (i < s->ncontrols-2) {
+                    c = s->ctrls[s->ncontrols-1];
+                    memmove(s->ctrls+i+2, s->ctrls+i+1,
+                            (s->ncontrols-i-2)*sizeof(union control *));
+                    s->ctrls[i+1] = c;
+                }
+                break;
+            }
+        }
+    }
+
+    /*
      * Windows has the AltGr key, which has various Windows-
      * specific options.
      */
@@ -93,19 +128,15 @@ void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help,
                assert(c->generic.handler == dlg_stdradiobutton_handler);
                c->radio.nbuttons++;
                c->radio.buttons =
-                   srealloc(c->radio.buttons,
-                            c->radio.nbuttons * sizeof(*c->radio.buttons));
+                   sresize(c->radio.buttons, c->radio.nbuttons, char *);
                c->radio.buttons[c->radio.nbuttons-1] =
                    dupstr("Play a custom sound file");
                c->radio.buttondata =
-                   srealloc(c->radio.buttondata,
-                            c->radio.nbuttons * sizeof(*c->radio.buttondata));
+                   sresize(c->radio.buttondata, c->radio.nbuttons, intorptr);
                c->radio.buttondata[c->radio.nbuttons-1] = I(BELL_WAVEFILE);
                if (c->radio.shortcuts) {
                    c->radio.shortcuts =
-                       srealloc(c->radio.shortcuts,
-                                (c->radio.nbuttons *
-                                 sizeof(*c->radio.shortcuts)));
+                       sresize(c->radio.shortcuts, c->radio.nbuttons, char);
                    c->radio.shortcuts[c->radio.nbuttons-1] = NO_SHORTCUT;
                }
                break;
@@ -166,29 +197,23 @@ void win_setup_config_box(struct controlbox *b, HWND *hwndp, int has_help,
                assert(c->generic.handler == dlg_stdradiobutton_handler);
                c->radio.nbuttons += 2;
                c->radio.buttons =
-                   srealloc(c->radio.buttons,
-                            c->radio.nbuttons * sizeof(*c->radio.buttons));
+                   sresize(c->radio.buttons, c->radio.nbuttons, char *);
                c->radio.buttons[c->radio.nbuttons-2] =
                    dupstr("Use font in both ANSI and OEM modes");
                c->radio.buttons[c->radio.nbuttons-1] =
                    dupstr("Use font in OEM mode only");
                c->radio.buttondata =
-                   srealloc(c->radio.buttondata,
-                            c->radio.nbuttons * sizeof(*c->radio.buttondata));
+                   sresize(c->radio.buttondata, c->radio.nbuttons, intorptr);
                c->radio.buttondata[c->radio.nbuttons-2] = I(VT_OEMANSI);
                c->radio.buttondata[c->radio.nbuttons-1] = I(VT_OEMONLY);
                if (!c->radio.shortcuts) {
                    int j;
-                   c->radio.shortcuts =
-                       smalloc((c->radio.nbuttons *
-                                sizeof(*c->radio.shortcuts)));
+                   c->radio.shortcuts = snewn(c->radio.nbuttons, char);
                    for (j = 0; j < c->radio.nbuttons; j++)
                        c->radio.shortcuts[j] = NO_SHORTCUT;
                } else {
-                   c->radio.shortcuts =
-                       srealloc(c->radio.shortcuts,
-                                (c->radio.nbuttons *
-                                 sizeof(*c->radio.shortcuts)));
+                   c->radio.shortcuts = sresize(c->radio.shortcuts,
+                                                c->radio.nbuttons, char);
                }
                c->radio.shortcuts[c->radio.nbuttons-2] = 'b';
                c->radio.shortcuts[c->radio.nbuttons-1] = 'e';