X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=dialog.h;h=9ac355c64afcab78279aa88db966d25969b15184;hb=4455604dbce2d175ce1d601d51472bb1b0a535d8;hp=6b9f5e38bd5390719c821d502667757ce60f0c92;hpb=616c837cf0a624402edc189a72266e5f1271b432;p=PuTTY.git diff --git a/dialog.h b/dialog.h index 6b9f5e38..9ac355c6 100644 --- a/dialog.h +++ b/dialog.h @@ -51,6 +51,11 @@ enum { */ typedef union { void *p; int i; } intorptr; +#ifndef INLINE +intorptr I(int i); +intorptr P(void *p); +#endif + #if defined DEFINE_INTORPTR_FNS || defined INLINE #ifdef INLINE #define PREFIX INLINE @@ -60,9 +65,6 @@ typedef union { void *p; int i; } intorptr; PREFIX intorptr I(int i) { intorptr ret; ret.i = i; return ret; } PREFIX intorptr P(void *p) { intorptr ret; ret.p = p; return ret; } #undef PREFIX -#else -intorptr I(int i); -intorptr P(void *p); #endif /* @@ -160,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- @@ -207,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; /* @@ -280,6 +286,11 @@ union control { * Return even if it doesn't have the input focus. */ int isdefault; + /* + * Also, the reverse of this: a default cancel-type button, + * which is implicitly pressed when you hit Escape. + */ + int iscancel; } button; struct { STANDARD_PREFIX; @@ -298,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; /* @@ -319,9 +337,20 @@ 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 */ + /* + * Flag which can be set to FALSE to suppress the horizontal + * scroll bar if a list box entry goes off the right-hand + * side. + */ + int hscroll; } listbox; struct { STANDARD_PREFIX; @@ -404,6 +433,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. @@ -415,6 +446,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); @@ -426,10 +458,10 @@ void ctrl_free_box(struct controlbox *); /* Set up a panel title. */ struct controlset *ctrl_settitle(struct controlbox *, - char *path, char *title); + const char *path, const char *title); /* Retrieve a pointer to a controlset, creating it if absent. */ -struct controlset *ctrl_getset(struct controlbox *, - char *path, char *name, char *boxtitle); +struct controlset *ctrl_getset(struct controlbox *, const char *path, + const char *name, const char *boxtitle); void ctrl_free_set(struct controlset *); void ctrl_free(union control *); @@ -441,8 +473,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. @@ -455,12 +493,12 @@ void *ctrl_alloc(struct controlbox *b, size_t size); /* `ncolumns' is followed by that many percentages, as integers. */ union control *ctrl_columns(struct controlset *, int ncolumns, ...); -union control *ctrl_editbox(struct controlset *, char *label, char shortcut, - int percentage, intorptr helpctx, +union control *ctrl_editbox(struct controlset *, const char *label, + char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2); -union control *ctrl_combobox(struct controlset *, char *label, char shortcut, - int percentage, intorptr helpctx, +union control *ctrl_combobox(struct controlset *, const char *label, + char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context, intorptr context2); /* @@ -469,89 +507,35 @@ union control *ctrl_combobox(struct controlset *, char *label, char shortcut, * title is expected to be followed by a shortcut _iff_ `shortcut' * is NO_SHORTCUT. */ -union control *ctrl_radiobuttons(struct controlset *, char *label, - char shortcut, int ncolumns, - intorptr helpctx, +union control *ctrl_radiobuttons(struct controlset *, const char *label, + char shortcut, int ncolumns, intorptr helpctx, handler_fn handler, intorptr context, ...); -union control *ctrl_pushbutton(struct controlset *,char *label,char shortcut, - intorptr helpctx, +union control *ctrl_pushbutton(struct controlset *, const char *label, + char shortcut, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_listbox(struct controlset *,char *label,char shortcut, - intorptr helpctx, +union control *ctrl_listbox(struct controlset *, const char *label, + char shortcut, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_droplist(struct controlset *, char *label, char shortcut, - int percentage, intorptr helpctx, +union control *ctrl_droplist(struct controlset *, const char *label, + char shortcut, int percentage, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_draglist(struct controlset *,char *label,char shortcut, - intorptr helpctx, +union control *ctrl_draglist(struct controlset *, const char *label, + char shortcut, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_filesel(struct controlset *,char *label,char shortcut, - char const *filter, int write, char *title, - intorptr helpctx, +union control *ctrl_filesel(struct controlset *, const char *label, + char shortcut, const char *filter, int write, + const char *title, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_fontsel(struct controlset *,char *label,char shortcut, - intorptr helpctx, +union control *ctrl_fontsel(struct controlset *, const char *label, + char shortcut, intorptr helpctx, handler_fn handler, intorptr context); -union control *ctrl_text(struct controlset *, char *text, intorptr helpctx); -union control *ctrl_checkbox(struct controlset *, char *label, char shortcut, - intorptr helpctx, +union control *ctrl_text(struct controlset *, const char *text, + intorptr helpctx); +union control *ctrl_checkbox(struct controlset *, const char *label, + char shortcut, intorptr helpctx, handler_fn handler, intorptr context); 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. @@ -561,7 +545,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); @@ -573,18 +557,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 @@ -597,18 +581,23 @@ void dlg_update_done(union control *ctrl, void *dlg); */ void dlg_set_focus(union control *ctrl, void *dlg); /* - * Return the `ctrl' structure for the control that had the input - * focus before this one. This is NOT GUARANTEED to work on all - * platforms, so don't base any critical functionality on it! + * 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 + * functionality on it! */ -union control *dlg_last_focused(void *dlg); +union control *dlg_last_focused(union control *ctrl, void *dlg); /* * During event processing, you might well want to give an error * indication to the user. dlg_beep() is a quick and easy generic * error; dlg_error() puts up a message-box or equivalent. */ void dlg_beep(void *dlg); -void dlg_error_msg(void *dlg, char *msg); +void dlg_error_msg(void *dlg, const char *msg); /* * This function signals to the front end that the dialog's * processing is completed, and passes an integer value (typically @@ -658,8 +647,8 @@ void dlg_refresh(union control *ctrl, void *dlg); * ... process this controlset ... * } */ -int ctrl_find_path(struct controlbox *b, char *path, int index); -int ctrl_path_elements(char *path); +int ctrl_find_path(struct controlbox *b, const char *path, int index); +int ctrl_path_elements(const 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);