X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/0bd8d76d08b2f222bc624a9b85e482a6e2629710..8d90b8b27bf086da6245030459ab3e5977313eb0:/dialog.h diff --git a/dialog.h b/dialog.h index fb3906cf..9ea8599e 100644 --- a/dialog.h +++ b/dialog.h @@ -162,7 +162,7 @@ union control { * * The `data' parameter points to the writable data being * modified as a result of the configuration activity; for - * example, the PuTTY `Config' structure, although not + * example, the PuTTY `Conf' structure, although not * necessarily. * * The `dlg' parameter is passed back to the platform- @@ -209,6 +209,10 @@ union control { * has a drop-down list built in. (Note that a _non_- * editable drop-down list is done as a special case of a * list box.) + * + * Don't try setting has_list and password on the same + * control; front ends are not required to support that + * combination. */ int has_list; /* @@ -305,9 +309,16 @@ union control { */ int draglist; /* - * If this is set, the list can have more than one element - * selected at a time. This is not guaranteed to work on a - * drop-down list, so don't try it! + * If this is non-zero, the list can have more than one + * element selected at a time. This is not guaranteed to + * work on a drop-down list, so don't try it! + * + * Different non-zero values request slightly different + * types of multi-selection (this may well be meaningful + * only in GTK, so everyone else can ignore it if they + * want). 1 means the list box expects to have individual + * items selected, whereas 2 means it expects the user to + * want to select a large contiguous range at a time. */ int multisel; /* @@ -326,6 +337,11 @@ union control { * the respective widths of `ncols' columns, which together * will exactly fit the width of the list box. Otherwise * `percentages' must be NULL. + * + * There should never be more than one column in a + * drop-down list (one with height==0), because front ends + * may have to implement it as a special case of an + * editable combo box. */ int ncols; /* number of columns */ int *percentages; /* % width of each column */ @@ -411,6 +427,8 @@ struct controlset { union control **ctrls; /* actual array */ }; +typedef void (*ctrl_freefn_t)(void *); /* used by ctrl_alloc_with_free */ + /* * This is the container structure which holds a complete set of * controls. @@ -422,6 +440,7 @@ struct controlbox { int nfrees; int freesize; void **frees; /* array of aux data areas to free */ + ctrl_freefn_t *freefuncs; /* parallel array of free functions */ }; struct controlbox *ctrl_new_box(void); @@ -448,8 +467,14 @@ void ctrl_free(union control *); * and so data allocated through this function is better not used * to hold modifiable per-instance things. It's mostly here for * allocating structures to be passed as control handler params. + * + * ctrl_alloc_with_free also allows you to provide a function to free + * the structure, in case there are other dynamically allocated bits + * and pieces dangling off it. */ void *ctrl_alloc(struct controlbox *b, size_t size); +void *ctrl_alloc_with_free(struct controlbox *b, size_t size, + ctrl_freefn_t freefunc); /* * Individual routines to create `union control' structures in a controlset. @@ -506,60 +531,6 @@ union control *ctrl_checkbox(struct controlset *, char *label, char shortcut, union control *ctrl_tabdelay(struct controlset *, union control *); /* - * Standard handler routines to cover most of the common cases in - * the config box. - */ -/* - * The standard radio-button handler expects the main `context' - * field to contain the `offsetof' of an int field in the structure - * pointed to by `data', and expects each of the individual button - * data to give a value for that int field. - */ -void dlg_stdradiobutton_handler(union control *ctrl, void *dlg, - void *data, int event); -/* - * The standard checkbox handler expects the main `context' field - * to contain the `offsetof' an int field in the structure pointed - * to by `data', optionally ORed with CHECKBOX_INVERT to indicate - * that the sense of the datum is opposite to the sense of the - * checkbox. - */ -#define CHECKBOX_INVERT (1<<30) -void dlg_stdcheckbox_handler(union control *ctrl, void *dlg, - void *data, int event); -/* - * The standard edit-box handler expects the main `context' field - * to contain the `offsetof' a field in the structure pointed to by - * `data'. The secondary `context2' field indicates the type of - * this field: - * - * - if context2 > 0, the field is a char array and context2 gives - * its size. - * - if context2 == -1, the field is an int and the edit box is - * numeric. - * - if context2 < -1, the field is an int and the edit box is - * _floating_, and (-context2) gives the scale. (E.g. if - * context2 == -1000, then typing 1.2 into the box will set the - * field to 1200.) - */ -void dlg_stdeditbox_handler(union control *ctrl, void *dlg, - void *data, int event); -/* - * The standard file-selector handler expects the main `context' - * field to contain the `offsetof' a Filename field in the - * structure pointed to by `data'. - */ -void dlg_stdfilesel_handler(union control *ctrl, void *dlg, - void *data, int event); -/* - * The standard font-selector handler expects the main `context' - * field to contain the `offsetof' a Font field in the structure - * pointed to by `data'. - */ -void dlg_stdfontsel_handler(union control *ctrl, void *dlg, - void *data, int event); - -/* * Routines the platform-independent dialog code can call to read * and write the values of controls. */ @@ -568,7 +539,7 @@ int dlg_radiobutton_get(union control *ctrl, void *dlg); void dlg_checkbox_set(union control *ctrl, void *dlg, int checked); int dlg_checkbox_get(union control *ctrl, void *dlg); void dlg_editbox_set(union control *ctrl, void *dlg, char const *text); -void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length); +char *dlg_editbox_get(union control *ctrl, void *dlg); /* result must be freed by caller */ /* The `listbox' functions can also apply to combo boxes. */ void dlg_listbox_clear(union control *ctrl, void *dlg); void dlg_listbox_del(union control *ctrl, void *dlg, int index); @@ -580,18 +551,18 @@ void dlg_listbox_add(union control *ctrl, void *dlg, char const *text); * strings in any listbox then you MUST not assign them different * IDs and expect to get meaningful results back. */ -void dlg_listbox_addwithindex(union control *ctrl, void *dlg, - char const *text, int id); +void dlg_listbox_addwithid(union control *ctrl, void *dlg, + char const *text, int id); int dlg_listbox_getid(union control *ctrl, void *dlg, int index); /* dlg_listbox_index returns <0 if no single element is selected. */ int dlg_listbox_index(union control *ctrl, void *dlg); int dlg_listbox_issel(union control *ctrl, void *dlg, int index); void dlg_listbox_select(union control *ctrl, void *dlg, int index); void dlg_text_set(union control *ctrl, void *dlg, char const *text); -void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn); -void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn); -void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fn); -void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fn); +void dlg_filesel_set(union control *ctrl, void *dlg, Filename *fn); +Filename *dlg_filesel_get(union control *ctrl, void *dlg); +void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec *fn); +FontSpec *dlg_fontsel_get(union control *ctrl, void *dlg); /* * Bracketing a large set of updates in these two functions will * cause the front end (if possible) to delay updating the screen @@ -604,6 +575,10 @@ void dlg_update_done(union control *ctrl, void *dlg); */ void dlg_set_focus(union control *ctrl, void *dlg); /* + * Change the label text on a control. + */ +void dlg_label_change(union control *ctrl, void *dlg, char const *text); +/* * Return the `ctrl' structure for the most recent control that had * the input focus apart from the one mentioned. This is NOT * GUARANTEED to work on all platforms, so don't base any critical