]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - dialog.c
first pass
[PuTTY.git] / dialog.c
index 127783a3b7a6302e170f49bfda1fad42863dd63e..31a9627be1c86f1e9fbe63883c7213b105c7a14a 100644 (file)
--- a/dialog.c
+++ b/dialog.c
@@ -13,7 +13,7 @@
 #include "putty.h"
 #include "dialog.h"
 
-int ctrl_path_elements(char *path)
+int ctrl_path_elements(const char *path)
 {
     int i = 1;
     while (*path) {
@@ -25,7 +25,7 @@ int ctrl_path_elements(char *path)
 
 /* Return the number of matching path elements at the starts of p1 and p2,
  * or INT_MAX if the paths are identical. */
-int ctrl_path_compare(char *p1, char *p2)
+int ctrl_path_compare(const char *p1, const char *p2)
 {
     int i = 0;
     while (*p1 || *p2) {
@@ -47,6 +47,7 @@ struct controlbox *ctrl_new_box(void)
     ret->ctrlsets = NULL;
     ret->nfrees = ret->freesize = 0;
     ret->frees = NULL;
+    ret->freefuncs = NULL;
 
     return ret;
 }
@@ -59,9 +60,10 @@ void ctrl_free_box(struct controlbox *b)
        ctrl_free_set(b->ctrlsets[i]);
     }
     for (i = 0; i < b->nfrees; i++)
-       sfree(b->frees[i]);
+       b->freefuncs[i](b->frees[i]);
     sfree(b->ctrlsets);
     sfree(b->frees);
+    sfree(b->freefuncs);
     sfree(b);
 }
 
@@ -84,7 +86,7 @@ void ctrl_free_set(struct controlset *s)
  * path. If that path doesn't exist, return the index where it
  * should be inserted.
  */
-static int ctrl_find_set(struct controlbox *b, char *path, int start)
+static int ctrl_find_set(struct controlbox *b, const char *path, int start)
 {
     int i, last, thisone;
 
@@ -110,7 +112,7 @@ static int ctrl_find_set(struct controlbox *b, char *path, int start)
  * path, or -1 if no such controlset exists. If -1 is passed as
  * input, finds the first.
  */
-int ctrl_find_path(struct controlbox *b, char *path, int index)
+int ctrl_find_path(struct controlbox *b, const char *path, int index)
 {
     if (index < 0)
        index = ctrl_find_set(b, path, 1);
@@ -125,7 +127,7 @@ int ctrl_find_path(struct controlbox *b, char *path, int index)
 
 /* Set up a panel title. */
 struct controlset *ctrl_settitle(struct controlbox *b,
-                                char *path, char *title)
+                                const char *path, const char *title)
 {
     
     struct controlset *s = snew(struct controlset);
@@ -149,8 +151,8 @@ struct controlset *ctrl_settitle(struct controlbox *b,
 }
 
 /* Retrieve a pointer to a controlset, creating it if absent. */
-struct controlset *ctrl_getset(struct controlbox *b,
-                              char *path, char *name, char *boxtitle)
+struct controlset *ctrl_getset(struct controlbox *b, const char *path,
+                               const char *name, const char *boxtitle)
 {
     struct controlset *s;
     int index = ctrl_find_set(b, path, 1);
@@ -181,7 +183,8 @@ struct controlset *ctrl_getset(struct controlbox *b,
 }
 
 /* Allocate some private data in a controlbox. */
-void *ctrl_alloc(struct controlbox *b, size_t size)
+void *ctrl_alloc_with_free(struct controlbox *b, size_t size,
+                           ctrl_freefn_t freefunc)
 {
     void *p;
     /*
@@ -192,11 +195,24 @@ void *ctrl_alloc(struct controlbox *b, size_t size)
     if (b->nfrees >= b->freesize) {
        b->freesize = b->nfrees + 32;
        b->frees = sresize(b->frees, b->freesize, void *);
+       b->freefuncs = sresize(b->freefuncs, b->freesize, ctrl_freefn_t);
     }
-    b->frees[b->nfrees++] = p;
+    b->frees[b->nfrees] = p;
+    b->freefuncs[b->nfrees] = freefunc;
+    b->nfrees++;
     return p;
 }
 
+static void ctrl_default_free(void *p)
+{
+    sfree(p);
+}
+
+void *ctrl_alloc(struct controlbox *b, size_t size)
+{
+    return ctrl_alloc_with_free(b, size, ctrl_default_free);
+}
+
 static union control *ctrl_new(struct controlset *s, int type,
                               intorptr helpctx, handler_fn handler,
                               intorptr context)
@@ -241,8 +257,8 @@ union control *ctrl_columns(struct controlset *s, int ncolumns, ...)
     return c;
 }
 
-union control *ctrl_editbox(struct controlset *s, char *label, char shortcut,
-                           int percentage,
+union control *ctrl_editbox(struct controlset *s, const char *label,
+                            char shortcut, int percentage,
                            intorptr helpctx, handler_fn handler,
                            intorptr context, intorptr context2)
 {
@@ -256,8 +272,8 @@ union control *ctrl_editbox(struct controlset *s, char *label, char shortcut,
     return c;
 }
 
-union control *ctrl_combobox(struct controlset *s, char *label, char shortcut,
-                            int percentage,
+union control *ctrl_combobox(struct controlset *s, const char *label,
+                             char shortcut, int percentage,
                             intorptr helpctx, handler_fn handler,
                             intorptr context, intorptr context2)
 {
@@ -277,7 +293,7 @@ union control *ctrl_combobox(struct controlset *s, char *label, char shortcut,
  * title is expected to be followed by a shortcut _iff_ `shortcut'
  * is NO_SHORTCUT.
  */
-union control *ctrl_radiobuttons(struct controlset *s, char *label,
+union control *ctrl_radiobuttons(struct controlset *s, const char *label,
                                 char shortcut, int ncolumns, intorptr helpctx,
                                 handler_fn handler, intorptr context, ...)
 {
@@ -323,9 +339,9 @@ union control *ctrl_radiobuttons(struct controlset *s, char *label,
     return c;
 }
 
-union control *ctrl_pushbutton(struct controlset *s,char *label,char shortcut,
-                              intorptr helpctx, handler_fn handler,
-                              intorptr context)
+union control *ctrl_pushbutton(struct controlset *s, const char *label,
+                               char shortcut, intorptr helpctx,
+                               handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_BUTTON, helpctx, handler, context);
     c->button.label = label ? dupstr(label) : NULL;
@@ -335,9 +351,9 @@ union control *ctrl_pushbutton(struct controlset *s,char *label,char shortcut,
     return c;
 }
 
-union control *ctrl_listbox(struct controlset *s,char *label,char shortcut,
-                           intorptr helpctx, handler_fn handler,
-                           intorptr context)
+union control *ctrl_listbox(struct controlset *s, const char *label,
+                            char shortcut, intorptr helpctx,
+                            handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context);
     c->listbox.label = label ? dupstr(label) : NULL;
@@ -348,11 +364,12 @@ union control *ctrl_listbox(struct controlset *s,char *label,char shortcut,
     c->listbox.percentwidth = 100;
     c->listbox.ncols = 0;
     c->listbox.percentages = NULL;
+    c->listbox.hscroll = TRUE;
     return c;
 }
 
-union control *ctrl_droplist(struct controlset *s, char *label, char shortcut,
-                            int percentage, intorptr helpctx,
+union control *ctrl_droplist(struct controlset *s, const char *label,
+                             char shortcut, int percentage, intorptr helpctx,
                             handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context);
@@ -364,12 +381,13 @@ union control *ctrl_droplist(struct controlset *s, char *label, char shortcut,
     c->listbox.percentwidth = percentage;
     c->listbox.ncols = 0;
     c->listbox.percentages = NULL;
+    c->listbox.hscroll = FALSE;
     return c;
 }
 
-union control *ctrl_draglist(struct controlset *s,char *label,char shortcut,
-                            intorptr helpctx, handler_fn handler,
-                            intorptr context)
+union control *ctrl_draglist(struct controlset *s, const char *label,
+                             char shortcut, intorptr helpctx,
+                             handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_LISTBOX, helpctx, handler, context);
     c->listbox.label = label ? dupstr(label) : NULL;
@@ -380,13 +398,14 @@ union control *ctrl_draglist(struct controlset *s,char *label,char shortcut,
     c->listbox.percentwidth = 100;
     c->listbox.ncols = 0;
     c->listbox.percentages = NULL;
+    c->listbox.hscroll = FALSE;
     return c;
 }
 
-union control *ctrl_filesel(struct controlset *s,char *label,char shortcut,
-                           char const *filter, int write, char *title,
-                           intorptr helpctx, handler_fn handler,
-                           intorptr context)
+union control *ctrl_filesel(struct controlset *s, const char *label,
+                            char shortcut, const char *filter, int write,
+                            const char *title, intorptr helpctx,
+                            handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_FILESELECT, helpctx, handler, context);
     c->fileselect.label = label ? dupstr(label) : NULL;
@@ -397,9 +416,9 @@ union control *ctrl_filesel(struct controlset *s,char *label,char shortcut,
     return c;
 }
 
-union control *ctrl_fontsel(struct controlset *s,char *label,char shortcut,
-                           intorptr helpctx, handler_fn handler,
-                           intorptr context)
+union control *ctrl_fontsel(struct controlset *s, const char *label,
+                            char shortcut, intorptr helpctx,
+                            handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_FONTSELECT, helpctx, handler, context);
     c->fontselect.label = label ? dupstr(label) : NULL;
@@ -414,16 +433,17 @@ union control *ctrl_tabdelay(struct controlset *s, union control *ctrl)
     return c;
 }
 
-union control *ctrl_text(struct controlset *s, char *text, intorptr helpctx)
+union control *ctrl_text(struct controlset *s, const char *text,
+                         intorptr helpctx)
 {
     union control *c = ctrl_new(s, CTRL_TEXT, helpctx, NULL, P(NULL));
     c->text.label = dupstr(text);
     return c;
 }
 
-union control *ctrl_checkbox(struct controlset *s, char *label, char shortcut,
-                            intorptr helpctx, handler_fn handler,
-                            intorptr context)
+union control *ctrl_checkbox(struct controlset *s, const char *label,
+                             char shortcut, intorptr helpctx,
+                             handler_fn handler, intorptr context)
 {
     union control *c = ctrl_new(s, CTRL_CHECKBOX, helpctx, handler, context);
     c->checkbox.label = label ? dupstr(label) : NULL;