X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=dialog.c;h=31a9627be1c86f1e9fbe63883c7213b105c7a14a;hb=5471539a6738484b48fb938c88dce547a3e4b299;hp=127783a3b7a6302e170f49bfda1fad42863dd63e;hpb=a1f3b7a358adaa7c2a98359cd0373aa823eeb14b;p=PuTTY.git diff --git a/dialog.c b/dialog.c index 127783a3..31a9627b 100644 --- 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;