diff options
author | Alessio Treglia <alessio@debian.org> | 2011-03-24 09:13:51 +0100 |
---|---|---|
committer | Alessio Treglia <alessio@debian.org> | 2011-03-24 09:13:51 +0100 |
commit | e5328e59987b90c4e98959510b810510e384650d (patch) | |
tree | 0f140b79d942c4654701d8fb4cfe2f1dd904f9f0 /snd-prefs.c | |
parent | 36cf8384e5699cda3f1ca607753fe4d4a8515b01 (diff) |
Imported Upstream version 12.0
Diffstat (limited to 'snd-prefs.c')
-rw-r--r-- | snd-prefs.c | 2227 |
1 files changed, 764 insertions, 1463 deletions
diff --git a/snd-prefs.c b/snd-prefs.c index 4036ea8..5793788 100644 --- a/snd-prefs.c +++ b/snd-prefs.c @@ -1,5 +1,8 @@ /* this file included as text in snd-g|xprefs.c */ +/* TODO: make the current help strings less stupid + */ + static void int_to_textfield(widget_t w, int val) { char *str; @@ -73,7 +76,7 @@ static prefs_info **prefs = NULL; static void remember_pref(prefs_info *prf, void (*reflect_func)(struct prefs_info *prf), void (*save_func)(struct prefs_info *prf, FILE *fd), - void (*help_func)(struct prefs_info *prf), + const char *(*help_func)(struct prefs_info *prf), void (*clear_func)(struct prefs_info *prf), void (*revert_func)(struct prefs_info *prf)) { @@ -99,6 +102,18 @@ static void remember_pref(prefs_info *prf, prf->clear_func = clear_func; prf->revert_func = revert_func; prefs[prefs_top++] = prf; + + if ((help_func) && + (prf->label)) + { + if (prf->var_name) + { + char *str; + str = mus_format("%s\n See %s for more info.", (*help_func)(prf), prf->var_name); + add_tooltip(prf->label, str); /* don't free it... */ + } + else add_tooltip(prf->label, (*help_func)(prf)); + } } @@ -250,8 +265,7 @@ static void save_prefs(void) FILE *fd; /* save_options_in_prefs passes us the filename after calling save_options which handles all - * the simple cases. The rest of the special "save" functions called here are for cases - * where we are calling extension code, so we have to make sure the necessary files are loaded. + * the simple cases. */ filename = save_options_in_prefs(); @@ -274,11 +288,8 @@ static void save_prefs(void) * load_path_to_string_array can turn the LOAD_PATH into a char** array. * * load-path needs to be set even if a later init file adds to it; we need a true - * load-path before loading extensions.scm, but this can be called - * repeatedly, and across executions, so we don't want to fill up the list - * with repetitions, - * - * find_sources below is being used to get the current load-path entry that points to extensions.* + * load-path, but this can be called repeatedly, and across executions, so we + * don't want to fill up the list with repetitions */ current_dirs = load_path_to_string_array(¤t_dirs_len); @@ -367,256 +378,6 @@ static char *possibly_quote(char *key) } -static void prefs_help(prefs_info *prf) -{ - if (prf->var_name) - { - if (prf->help_func) - { - prefs_helping = true; - (*(prf->help_func))(prf); - } -#if (!HAVE_SCHEME) - else - { - XEN sym; - sym = C_STRING_TO_XEN_SYMBOL(TO_PROC_NAME((char *)(prf->var_name))); - if (XEN_SYMBOL_P(sym)) - { - XEN obj; - obj = XEN_OBJECT_HELP(sym); - if (XEN_STRING_P(obj)) - { - prefs_helping = true; - snd_help(prf->var_name, - XEN_TO_C_STRING(obj), - WITH_WORD_WRAP); - } - } - } -#endif - } -} - - -#if HAVE_RUBY -static char *no_stars(const char *name) -{ - if (name[0] == '*') - { - char *val; - val = (char *)calloc(strlen(name), sizeof(char)); - strncpy(val, (char *)(name + 1), strlen(name) - 2); - return(val); - } - else return(mus_strdup(name)); -} -#endif - - -static void prefs_variable_set(const char *name, XEN val) -{ -#if HAVE_SCHEME - if (XEN_DEFINED_P(name)) - XEN_VARIABLE_SET(XEN_NAME_AS_C_STRING_TO_VARIABLE(name), val); -#endif - -#if HAVE_FORTH - if (XEN_DEFINED_P(name)) - XEN_VARIABLE_SET(name, val); -#endif - -#if HAVE_RUBY - { - char *str; - str = no_stars(name); - if (XEN_DEFINED_P(str)) - XEN_VARIABLE_SET(str, val); - free(str); - } -#endif -} - - -static void prefs_variable_save(FILE *fd, const char *name, const char *file, XEN val) -{ -#if HAVE_SCHEME - char *temp = NULL; - if (file) - fprintf(fd, "(if (not (provided? 'snd-%s.scm)) (load \"%s.scm\"))\n", file, file); - fprintf(fd, "(set! %s %s)\n", name, temp = XEN_AS_STRING(val)); -#if HAVE_SCHEME - if (temp) free(temp); -#endif -#endif - -#if HAVE_RUBY - char *str; - str = no_stars(name); - if (file) - fprintf(fd, "require \"%s\"\n", file); - fprintf(fd, "$%s = %s\n", TO_PROC_NAME(str), XEN_AS_STRING(val)); - /* fprintf(fd, "set_%s(%s)\n", TO_PROC_NAME(str), XEN_AS_STRING(val)); */ - free(str); -#endif - -#if HAVE_FORTH - if (file) - fprintf(fd, "require %s\n", file); - fprintf(fd, "%s to %s\n", XEN_AS_STRING(val), name); - /* fprintf(fd, "%s set-%s drop\n", XEN_AS_STRING(val), name); */ -#endif -} - - -static XEN prefs_variable_get(const char *name) -{ -#if HAVE_SCHEME || HAVE_FORTH - if (XEN_DEFINED_P(name)) - return(XEN_NAME_AS_C_STRING_TO_VALUE(name)); -#endif - -#if HAVE_RUBY - { - char *str; - XEN val = XEN_FALSE; - str = no_stars(name); - if (XEN_DEFINED_P(str)) - val = XEN_NAME_AS_C_STRING_TO_VALUE(str); - free(str); - return(val); - } -#endif - - return(XEN_FALSE); -} - - -static bool prefs_is_loading = false; - -static void watch_for_snd_error_in_prefs(ss_watcher_reason_t reason, void *msg) -{ - if ((prefs_is_loading) && - (widget_is_active(preferences_dialog))) - post_it("Load error", (const char *)msg); -} - - -static void load_file_with_path_and_extension(const char *file) -{ - /* file is bare (no extension, no directory) file name */ - char *str; - str = mus_format("%s.%s", file, XEN_FILE_EXTENSION); - prefs_is_loading = true; - XEN_LOAD_FILE_WITH_PATH(str); - prefs_is_loading = false; - free(str); -} - - -static void prefs_function_call_0(const char *func) -{ -#if HAVE_EXTENSION_LANGUAGE - char *str; -#if HAVE_SCHEME - str = mus_format("(%s)\n", func); -#endif - -#if HAVE_RUBY - str = mus_format("%s()\n", TO_PROC_NAME(func)); -#endif - -#if HAVE_FORTH - str = mus_format("%s\n", func); -#endif - - XEN_EVAL_C_STRING(str); - free(str); -#endif -} - - -static void prefs_function_call_1(const char *func, XEN arg) -{ -#if HAVE_EXTENSION_LANGUAGE - char *str; -#if HAVE_SCHEME - char *temp = NULL; - str = mus_format("(%s %s)\n", func, temp = XEN_AS_STRING(arg)); -#if HAVE_SCHEME - if (temp) free(temp); -#endif -#endif - -#if HAVE_RUBY - str = mus_format("%s(%s)\n", TO_PROC_NAME(func), XEN_AS_STRING(arg)); -#endif - -#if HAVE_FORTH - str = mus_format("%s %s\n", XEN_AS_STRING(arg), func); -#endif - - XEN_EVAL_C_STRING(str); - free(str); -#endif -} - - -static void prefs_function_save_0(FILE *fd, const char *name, const char *file) -{ -#if HAVE_SCHEME - if (file) - fprintf(fd, "(if (not (provided? 'snd-%s.scm)) (load \"%s.scm\"))\n", file, file); - fprintf(fd, "(%s)\n", name); -#endif - -#if HAVE_RUBY - char *str; - str = TO_PROC_NAME(name); - if (file) - fprintf(fd, "require \"%s\"\n", file); - fprintf(fd, "%s()\n", str); - free(str); -#endif - -#if HAVE_FORTH - if (file) - fprintf(fd, "require %s\n", file); - fprintf(fd, "%s\n", name); -#endif -} - - -static void prefs_function_save_1(FILE *fd, const char *name, const char *file, XEN val) -{ -#if HAVE_SCHEME - char *temp = NULL; - if (file) - fprintf(fd, "(if (not (provided? 'snd-%s.scm)) (load \"%s.scm\"))\n", file, file); - fprintf(fd, "(%s %s)\n", name, temp = XEN_AS_STRING(val)); -#if HAVE_SCHEME - if (temp) free(temp); -#endif -#endif - -#if HAVE_RUBY - char *str; - str = TO_PROC_NAME(name); - if (file) - fprintf(fd, "require \"%s\"\n", file); - fprintf(fd, "%s(%s)\n", str, XEN_AS_STRING(val)); - free(str); -#endif - -#if HAVE_FORTH - if (file) - fprintf(fd, "require %s\n", file); - fprintf(fd, "%s %s\n", XEN_AS_STRING(val), name); -#endif -} - - - /* ---------------- auto-resize ---------------- */ static bool rts_auto_resize = DEFAULT_AUTO_RESIZE; @@ -625,6 +386,14 @@ static void resize_toggle(prefs_info *prf) {set_auto_resize(GET_TOGGLE(prf->togg static void revert_auto_resize(prefs_info *prf) {set_auto_resize(rts_auto_resize);} static void save_auto_resize(prefs_info *prf, FILE *ignore) {rts_auto_resize = auto_resize(ss);} +static const char *help_auto_resize(prefs_info *prf) +{ + return("\ + If this option is set, Snd's main window \n\ + changes size as sounds come and go. "); +} + + /* ---------------- ask-before-overwrite ---------------- */ @@ -634,13 +403,21 @@ static void overwrite_toggle(prefs_info *prf) {set_ask_before_overwrite(GET_TOGG static void revert_ask_before_overwrite(prefs_info *prf) {set_ask_before_overwrite(rts_ask_before_overwrite);} static void save_ask_before_overwrite(prefs_info *prf, FILE *ignore) {rts_ask_before_overwrite = ask_before_overwrite(ss);} +static const char *help_ask_before_overwrite(prefs_info *prf) +{ + return("\ + If this option is set, Snd will ask you before \n\ + it overwrites an existing sound. "); +} + + /* ---------------- show-controls ---------------- */ static bool rts_show_controls = DEFAULT_SHOW_CONTROLS; static void reflect_show_controls(prefs_info *prf) {SET_TOGGLE(prf->toggle, in_show_controls(ss));} -static void controls_toggle(prefs_info *prf) {in_set_show_controls(ss, GET_TOGGLE(prf->toggle));} -static void revert_show_controls(prefs_info *prf) {in_set_show_controls(ss, rts_show_controls);} +static void controls_toggle(prefs_info *prf) {set_show_controls(GET_TOGGLE(prf->toggle));} +static void revert_show_controls(prefs_info *prf) {set_show_controls(rts_show_controls);} static void save_show_controls(prefs_info *prf, FILE *ignore) {rts_show_controls = in_show_controls(ss);} @@ -657,8 +434,8 @@ static void save_just_sounds(prefs_info *prf, FILE *ignore) {rts_just_sounds = j static bool rts_verbose_cursor = DEFAULT_VERBOSE_CURSOR; static void reflect_verbose_cursor(prefs_info *prf) {SET_TOGGLE(prf->toggle, verbose_cursor(ss));} -static void verbose_cursor_toggle(prefs_info *prf) {in_set_verbose_cursor(GET_TOGGLE(prf->toggle));} -static void revert_verbose_cursor(prefs_info *prf) {in_set_verbose_cursor(rts_verbose_cursor);} +static void verbose_cursor_toggle(prefs_info *prf) {set_verbose_cursor(GET_TOGGLE(prf->toggle));} +static void revert_verbose_cursor(prefs_info *prf) {set_verbose_cursor(rts_verbose_cursor);} static void save_verbose_cursor(prefs_info *prf, FILE *ignore) {rts_verbose_cursor = verbose_cursor(ss);} @@ -675,8 +452,8 @@ static void save_graphs_horizontal(prefs_info *prf, FILE *ignore) {rts_graphs_ho static bool rts_show_y_zero = DEFAULT_SHOW_Y_ZERO; static void reflect_show_y_zero(prefs_info *prf) {SET_TOGGLE(prf->toggle, show_y_zero(ss));} -static void y_zero_toggle(prefs_info *prf) {in_set_show_y_zero(GET_TOGGLE(prf->toggle));} -static void revert_show_y_zero(prefs_info *prf) {in_set_show_y_zero(rts_show_y_zero);} +static void y_zero_toggle(prefs_info *prf) {set_show_y_zero(GET_TOGGLE(prf->toggle));} +static void revert_show_y_zero(prefs_info *prf) {set_show_y_zero(rts_show_y_zero);} static void save_show_y_zero(prefs_info *prf, FILE *ignore) {rts_show_y_zero = show_y_zero(ss);} @@ -684,8 +461,8 @@ static void save_show_y_zero(prefs_info *prf, FILE *ignore) {rts_show_y_zero = s static with_grid_t rts_show_grid = DEFAULT_SHOW_GRID; static void reflect_show_grid(prefs_info *prf) {SET_TOGGLE(prf->toggle, show_grid(ss) == WITH_GRID);} -static void grid_toggle(prefs_info *prf) {in_set_show_grid(((GET_TOGGLE(prf->toggle)) ? WITH_GRID : NO_GRID));} -static void revert_show_grid(prefs_info *prf) {in_set_show_grid(rts_show_grid);} +static void grid_toggle(prefs_info *prf) {set_show_grid(((GET_TOGGLE(prf->toggle)) ? WITH_GRID : NO_GRID));} +static void revert_show_grid(prefs_info *prf) {set_show_grid(rts_show_grid);} static void save_show_grid(prefs_info *prf, FILE *ignore) {rts_show_grid = show_grid(ss);} @@ -693,8 +470,8 @@ static void save_show_grid(prefs_info *prf, FILE *ignore) {rts_show_grid = show_ static bool rts_fft_log_magnitude = DEFAULT_FFT_LOG_MAGNITUDE; static void reflect_fft_log_magnitude(prefs_info *prf) {SET_TOGGLE(prf->toggle, fft_log_magnitude(ss));} -static void log_magnitude_toggle(prefs_info *prf) {in_set_fft_log_magnitude(GET_TOGGLE(prf->toggle));} -static void revert_fft_log_magnitude(prefs_info *prf) {in_set_fft_log_magnitude(rts_fft_log_magnitude);} +static void log_magnitude_toggle(prefs_info *prf) {set_fft_log_magnitude(GET_TOGGLE(prf->toggle));} +static void revert_fft_log_magnitude(prefs_info *prf) {set_fft_log_magnitude(rts_fft_log_magnitude);} static void save_fft_log_magnitude(prefs_info *prf, FILE *ignore) {rts_fft_log_magnitude = fft_log_magnitude(ss);} @@ -702,8 +479,8 @@ static void save_fft_log_magnitude(prefs_info *prf, FILE *ignore) {rts_fft_log_m static bool rts_fft_log_frequency = DEFAULT_FFT_LOG_FREQUENCY; static void reflect_fft_log_frequency(prefs_info *prf) {SET_TOGGLE(prf->toggle, fft_log_frequency(ss));} -static void log_frequency_toggle(prefs_info *prf) {in_set_fft_log_frequency(GET_TOGGLE(prf->toggle));} -static void revert_fft_log_frequency(prefs_info *prf) {in_set_fft_log_frequency(rts_fft_log_frequency);} +static void log_frequency_toggle(prefs_info *prf) {set_fft_log_frequency(GET_TOGGLE(prf->toggle));} +static void revert_fft_log_frequency(prefs_info *prf) {set_fft_log_frequency(rts_fft_log_frequency);} static void save_fft_log_frequency(prefs_info *prf, FILE *ignore) {rts_fft_log_frequency = fft_log_frequency(ss);} @@ -760,7 +537,7 @@ static void clear_show_listener(prefs_info *prf) /* we need the original color (Clear), the last saved color (Revert) * the colors are updated continuously, so the current color variable (and the reflection func) is irrelevant * so: - * set original in snd-gxmain or somewhere: requires ss->sgx fields + * set original in snd-gxmain or somewhere * set rts in prefs dialog startup * reflect_color: a no-op * save_color: save current color_t value in rts value (actual fd output dealt with elsewhere) @@ -771,7 +548,7 @@ static void clear_show_listener(prefs_info *prf) */ static color_t saved_basic_color; -static void save_basic_color(prefs_info *prf, FILE *ignore) {saved_basic_color = ss->sgx->basic_color;} +static void save_basic_color(prefs_info *prf, FILE *ignore) {saved_basic_color = ss->basic_color;} static void basic_color_func(prefs_info *prf, float r, float g, float b) {set_basic_color(rgb_to_color(r, g, b));} @@ -784,8 +561,8 @@ static void revert_basic_color(prefs_info *prf) static void clear_basic_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->basic_color); - set_basic_color(ss->sgx->orig_basic_color); + scale_set_color(prf, ss->basic_color); + set_basic_color(ss->orig_basic_color); } @@ -793,7 +570,7 @@ static void clear_basic_color(prefs_info *prf) /* ---------------- highlight-color ---------------- */ static color_t saved_highlight_color; -static void save_highlight_color(prefs_info *prf, FILE *ignore) {saved_highlight_color = ss->sgx->highlight_color;} +static void save_highlight_color(prefs_info *prf, FILE *ignore) {saved_highlight_color = ss->highlight_color;} static void highlight_color_func(prefs_info *prf, float r, float g, float b) {set_highlight_color(rgb_to_color(r, g, b));} @@ -806,8 +583,8 @@ static void revert_highlight_color(prefs_info *prf) static void clear_highlight_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_highlight_color); - set_highlight_color(ss->sgx->orig_highlight_color); + scale_set_color(prf, ss->orig_highlight_color); + set_highlight_color(ss->orig_highlight_color); } @@ -815,7 +592,7 @@ static void clear_highlight_color(prefs_info *prf) /* ---------------- position-color ---------------- */ static color_t saved_position_color; -static void save_position_color(prefs_info *prf, FILE *ignore) {saved_position_color = ss->sgx->position_color;} +static void save_position_color(prefs_info *prf, FILE *ignore) {saved_position_color = ss->position_color;} static void position_color_func(prefs_info *prf, float r, float g, float b) {set_position_color(rgb_to_color(r, g, b));} @@ -828,8 +605,8 @@ static void revert_position_color(prefs_info *prf) static void clear_position_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_position_color); - set_position_color(ss->sgx->orig_position_color); + scale_set_color(prf, ss->orig_position_color); + set_position_color(ss->orig_position_color); } @@ -837,7 +614,7 @@ static void clear_position_color(prefs_info *prf) /* ---------------- zoom-color ---------------- */ static color_t saved_zoom_color; -static void save_zoom_color(prefs_info *prf, FILE *ignore) {saved_zoom_color = ss->sgx->zoom_color;} +static void save_zoom_color(prefs_info *prf, FILE *ignore) {saved_zoom_color = ss->zoom_color;} static void zoom_color_func(prefs_info *prf, float r, float g, float b) {set_zoom_color(rgb_to_color(r, g, b));} @@ -850,8 +627,8 @@ static void revert_zoom_color(prefs_info *prf) static void clear_zoom_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_zoom_color); - set_zoom_color(ss->sgx->orig_zoom_color); + scale_set_color(prf, ss->orig_zoom_color); + set_zoom_color(ss->orig_zoom_color); } @@ -859,7 +636,7 @@ static void clear_zoom_color(prefs_info *prf) /* ---------------- cursor-color ---------------- */ static color_t saved_cursor_color; -static void save_cursor_color(prefs_info *prf, FILE *ignore) {saved_cursor_color = ss->sgx->cursor_color;} +static void save_cursor_color(prefs_info *prf, FILE *ignore) {saved_cursor_color = ss->cursor_color;} static void cursor_color_func(prefs_info *prf, float r, float g, float b) { @@ -877,8 +654,8 @@ static void revert_cursor_color(prefs_info *prf) static void clear_cursor_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_cursor_color); - color_cursor(ss->sgx->orig_cursor_color); + scale_set_color(prf, ss->orig_cursor_color); + color_cursor(ss->orig_cursor_color); } @@ -886,7 +663,7 @@ static void clear_cursor_color(prefs_info *prf) /* ---------------- data-color ---------------- */ static color_t saved_data_color; -static void save_data_color(prefs_info *prf, FILE *ignore) {saved_data_color = ss->sgx->data_color;} +static void save_data_color(prefs_info *prf, FILE *ignore) {saved_data_color = ss->data_color;} static void data_color_func(prefs_info *prf, float r, float g, float b) {set_data_color(rgb_to_color(r, g, b));} @@ -899,8 +676,8 @@ static void revert_data_color(prefs_info *prf) static void clear_data_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_data_color); - set_data_color(ss->sgx->orig_data_color); + scale_set_color(prf, ss->orig_data_color); + set_data_color(ss->orig_data_color); } @@ -908,7 +685,7 @@ static void clear_data_color(prefs_info *prf) /* ---------------- graph-color ---------------- */ static color_t saved_graph_color; -static void save_graph_color(prefs_info *prf, FILE *ignore) {saved_graph_color = ss->sgx->graph_color;} +static void save_graph_color(prefs_info *prf, FILE *ignore) {saved_graph_color = ss->graph_color;} static void graph_color_func(prefs_info *prf, float r, float g, float b) {set_graph_color(rgb_to_color(r, g, b));} @@ -921,8 +698,8 @@ static void revert_graph_color(prefs_info *prf) static void clear_graph_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_graph_color); - set_graph_color(ss->sgx->orig_graph_color); + scale_set_color(prf, ss->orig_graph_color); + set_graph_color(ss->orig_graph_color); } @@ -930,7 +707,7 @@ static void clear_graph_color(prefs_info *prf) /* ---------------- selected-data-color ---------------- */ static color_t saved_selected_data_color; -static void save_selected_data_color(prefs_info *prf, FILE *ignore) {saved_selected_data_color = ss->sgx->selected_data_color;} +static void save_selected_data_color(prefs_info *prf, FILE *ignore) {saved_selected_data_color = ss->selected_data_color;} static void selected_data_color_func(prefs_info *prf, float r, float g, float b) {set_selected_data_color(rgb_to_color(r, g, b));} @@ -943,8 +720,8 @@ static void revert_selected_data_color(prefs_info *prf) static void clear_selected_data_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_selected_data_color); - set_selected_data_color(ss->sgx->orig_selected_data_color); + scale_set_color(prf, ss->orig_selected_data_color); + set_selected_data_color(ss->orig_selected_data_color); } @@ -952,7 +729,7 @@ static void clear_selected_data_color(prefs_info *prf) /* ---------------- selected-graph-color ---------------- */ static color_t saved_selected_graph_color; -static void save_selected_graph_color(prefs_info *prf, FILE *ignore) {saved_selected_graph_color = ss->sgx->selected_graph_color;} +static void save_selected_graph_color(prefs_info *prf, FILE *ignore) {saved_selected_graph_color = ss->selected_graph_color;} static void selected_graph_color_func(prefs_info *prf, float r, float g, float b) {set_selected_graph_color(rgb_to_color(r, g, b));} @@ -965,8 +742,8 @@ static void revert_selected_graph_color(prefs_info *prf) static void clear_selected_graph_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_selected_graph_color); - set_selected_graph_color(ss->sgx->orig_selected_graph_color); + scale_set_color(prf, ss->orig_selected_graph_color); + set_selected_graph_color(ss->orig_selected_graph_color); } @@ -981,7 +758,7 @@ static void set_selection_color(color_t color) static color_t saved_selection_color; -static void save_selection_color(prefs_info *prf, FILE *ignore) {saved_selection_color = ss->sgx->selection_color;} +static void save_selection_color(prefs_info *prf, FILE *ignore) {saved_selection_color = ss->selection_color;} static void selection_color_func(prefs_info *prf, float r, float g, float b) {set_selection_color(rgb_to_color(r, g, b));} @@ -994,8 +771,8 @@ static void revert_selection_color(prefs_info *prf) static void clear_selection_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_selection_color); - set_selection_color(ss->sgx->orig_selection_color); + scale_set_color(prf, ss->orig_selection_color); + set_selection_color(ss->orig_selection_color); } @@ -1003,7 +780,7 @@ static void clear_selection_color(prefs_info *prf) /* ---------------- mark-color ---------------- */ static color_t saved_mark_color; -static void save_mark_color(prefs_info *prf, FILE *ignore) {saved_mark_color = ss->sgx->mark_color;} +static void save_mark_color(prefs_info *prf, FILE *ignore) {saved_mark_color = ss->mark_color;} static void mark_color_func(prefs_info *prf, float r, float g, float b) {color_marks(rgb_to_color(r, g, b));} @@ -1016,8 +793,8 @@ static void revert_mark_color(prefs_info *prf) static void clear_mark_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_mark_color); - color_marks(ss->sgx->orig_mark_color); + scale_set_color(prf, ss->orig_mark_color); + color_marks(ss->orig_mark_color); } @@ -1025,7 +802,7 @@ static void clear_mark_color(prefs_info *prf) /* ---------------- mix-color (waveform) ---------------- */ static color_t saved_mix_color; -static void save_mix_color(prefs_info *prf, FILE *ignore) {saved_mix_color = ss->sgx->mix_color;} +static void save_mix_color(prefs_info *prf, FILE *ignore) {saved_mix_color = ss->mix_color;} static void mix_color_func(prefs_info *prf, float r, float g, float b) {color_mixes(rgb_to_color(r, g, b));} @@ -1038,8 +815,8 @@ static void revert_mix_color(prefs_info *prf) static void clear_mix_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_mix_color); - color_mixes(ss->sgx->orig_mix_color); + scale_set_color(prf, ss->orig_mix_color); + color_mixes(ss->orig_mix_color); } @@ -1047,7 +824,7 @@ static void clear_mix_color(prefs_info *prf) /* ---------------- listener-color ---------------- */ static color_t saved_listener_color; -static void save_listener_color(prefs_info *prf, FILE *ignore) {saved_listener_color = ss->sgx->listener_color;} +static void save_listener_color(prefs_info *prf, FILE *ignore) {saved_listener_color = ss->listener_color;} static void listener_color_func(prefs_info *prf, float r, float g, float b) {color_listener(rgb_to_color(r, g, b));} @@ -1060,8 +837,8 @@ static void revert_listener_color(prefs_info *prf) static void clear_listener_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_listener_color); - color_listener(ss->sgx->orig_listener_color); + scale_set_color(prf, ss->orig_listener_color); + color_listener(ss->orig_listener_color); } @@ -1069,7 +846,7 @@ static void clear_listener_color(prefs_info *prf) /* ---------------- listener-text-color ---------------- */ static color_t saved_listener_text_color; -static void save_listener_text_color(prefs_info *prf, FILE *ignore) {saved_listener_text_color = ss->sgx->listener_text_color;} +static void save_listener_text_color(prefs_info *prf, FILE *ignore) {saved_listener_text_color = ss->listener_text_color;} static void listener_text_color_func(prefs_info *prf, float r, float g, float b) {color_listener_text(rgb_to_color(r, g, b));} @@ -1082,8 +859,8 @@ static void revert_listener_text_color(prefs_info *prf) static void clear_listener_text_color(prefs_info *prf) { - scale_set_color(prf, ss->sgx->orig_listener_text_color); - color_listener_text(ss->sgx->orig_listener_text_color); + scale_set_color(prf, ss->orig_listener_text_color); + color_listener_text(ss->orig_listener_text_color); } @@ -1537,6 +1314,11 @@ static void ladspa_dir_text(prefs_info *prf) } else set_ladspa_dir(mus_strdup(DEFAULT_LADSPA_DIR)); } + +static const char *help_ladspa_dir(prefs_info *prf) +{ + return("This sets the location of the ladspa libraries"); +} #endif @@ -1685,8 +1467,8 @@ static void reflect_transform_peaks(prefs_info *prf) static void revert_transform_peaks(prefs_info *prf) { - in_set_show_transform_peaks(rts_show_transform_peaks); - in_set_max_transform_peaks(rts_max_transform_peaks); + set_show_transform_peaks(rts_show_transform_peaks); + set_max_transform_peaks(rts_max_transform_peaks); } @@ -1699,7 +1481,7 @@ static void save_transform_peaks(prefs_info *prf, FILE *ignore) static void transform_peaks_toggle(prefs_info *prf) { - in_set_show_transform_peaks(GET_TOGGLE(prf->toggle)); + set_show_transform_peaks(GET_TOGGLE(prf->toggle)); } @@ -1716,7 +1498,7 @@ static void max_peaks_text(prefs_info *prf) redirect_errors_to(NULL, NULL); if (!(prf->got_error)) - in_set_max_transform_peaks(value); + set_max_transform_peaks(value); free_TEXT(str); } } @@ -1737,8 +1519,8 @@ static void reflect_mix_waveforms(prefs_info *prf) static void revert_mix_waveforms(prefs_info *prf) { - in_set_show_mix_waveforms(rts_show_mix_waveforms); - in_set_mix_waveform_height(rts_mix_waveform_height); + set_show_mix_waveforms(rts_show_mix_waveforms); + set_mix_waveform_height(rts_mix_waveform_height); } @@ -1751,7 +1533,7 @@ static void save_mix_waveforms(prefs_info *prf, FILE *ignore) static void show_mix_waveforms_toggle(prefs_info *prf) { - in_set_show_mix_waveforms(GET_TOGGLE(prf->toggle)); + set_show_mix_waveforms(GET_TOGGLE(prf->toggle)); } @@ -1768,7 +1550,7 @@ static void mix_waveform_height_text(prefs_info *prf) redirect_errors_to(NULL, NULL); if (!(prf->got_error)) - in_set_mix_waveform_height(value); + set_mix_waveform_height(value); free_TEXT(str); } } @@ -1958,9 +1740,9 @@ static void reflect_fft_window_beta(prefs_info *prf) } -static void revert_fft_window_beta(prefs_info *prf) {in_set_fft_window_beta(rts_fft_window_beta);} +static void revert_fft_window_beta(prefs_info *prf) {set_fft_window_beta(rts_fft_window_beta);} static void save_fft_window_beta(prefs_info *prf, FILE *ignore) {rts_fft_window_beta = fft_window_beta(ss);} -static void fft_window_beta_scale_callback(prefs_info *prf) {in_set_fft_window_beta(GET_SCALE() * prf->scale_max);} +static void fft_window_beta_scale_callback(prefs_info *prf) {set_fft_window_beta(GET_SCALE() * prf->scale_max);} static void fft_window_beta_text_callback(prefs_info *prf) @@ -1977,7 +1759,7 @@ static void fft_window_beta_text_callback(prefs_info *prf) if ((!(prf->got_error)) && (value <= prf->scale_max)) { - in_set_fft_window_beta(value); + set_fft_window_beta(value); SET_SCALE(value / prf->scale_max); } free_TEXT(str); @@ -1996,9 +1778,9 @@ static void reflect_grid_density(prefs_info *prf) } -static void revert_grid_density(prefs_info *prf) {in_set_grid_density(rts_grid_density);} +static void revert_grid_density(prefs_info *prf) {set_grid_density(rts_grid_density);} static void save_grid_density(prefs_info *prf, FILE *ignore) {rts_grid_density = grid_density(ss);} -static void grid_density_scale_callback(prefs_info *prf) {in_set_grid_density(GET_SCALE() * prf->scale_max);} +static void grid_density_scale_callback(prefs_info *prf) {set_grid_density(GET_SCALE() * prf->scale_max);} static void grid_density_text_callback(prefs_info *prf) @@ -2015,7 +1797,7 @@ static void grid_density_text_callback(prefs_info *prf) if ((!(prf->got_error)) && (value <= prf->scale_max)) { - in_set_grid_density(value); + set_grid_density(value); SET_SCALE(value / prf->scale_max); } free_TEXT(str); @@ -2024,92 +1806,46 @@ static void grid_density_text_callback(prefs_info *prf) -/* ---------------- sync choice ---------------- */ - -#define SYNC_WITHIN_EACH_SOUND 2 -#define SYNC_ACROSS_ALL_SOUNDS 1 -#define SYNC_DISABLED 0 -#define SYNC_UNSET -1 - -static int prefs_sync_choice = SYNC_UNSET, rts_sync_choice = 0; - -static int sync_choice(void) -{ - return(XEN_TO_C_INT_OR_ELSE(prefs_variable_get("global-sync-choice"), - SYNC_DISABLED)); -} - - -static void set_sync_choice(int val, const char *load) -{ - if ((load) && - (!XEN_DEFINED_P("global-sync-choice"))) - load_file_with_path_and_extension(load); - if (XEN_DEFINED_P("global-sync-choice")) - { - prefs_variable_set("global-sync-choice", - C_TO_XEN_INT(val)); - if ((load) && - (val != SYNC_DISABLED)) - prefs_function_call_1("set-global-sync", C_TO_XEN_INT(val)); - } -} - - -static void revert_sync_choice(prefs_info *prf) {set_sync_choice(rts_sync_choice, NULL);} -static void clear_sync_choice(prefs_info *prf) {set_sync_choice(SYNC_DISABLED, NULL);} - - -static void help_sync_choice(prefs_info *prf) -{ - snd_help(prf->var_name, - "Many operations can operate on all channels at once, or only on the currently selected \ -channel. If either of these buttons is selected, such operations operate either on all channels \ -within each sound (but not across sounds), or on all current channels at once. The default is \ -to operate only on the selected channel (neither button selected).", - WITH_WORD_WRAP); -} +/* ---------------- sync style ---------------- */ +static sync_style_t rts_sync_style = DEFAULT_SYNC_STYLE; +static void revert_sync_style(prefs_info *prf) {set_sync_style(rts_sync_style);} +static void clear_sync_style(prefs_info *prf) {set_sync_style(DEFAULT_SYNC_STYLE);} +static void save_sync_style(prefs_info *prf, FILE *ignore) {rts_sync_style = sync_style(ss);} -static void reflect_sync_choice(prefs_info *prf) +static const char *help_sync_style(prefs_info *prf) { - prefs_sync_choice = sync_choice(); - SET_TOGGLE(prf->toggle, prefs_sync_choice == SYNC_WITHIN_EACH_SOUND); - SET_TOGGLE(prf->toggle2, prefs_sync_choice == SYNC_ACROSS_ALL_SOUNDS); + return("\ + Many operations can operate either on all channels at once,\n\ + or only on the currently selected channel."); } -static void save_sync_choice(prefs_info *prf, FILE *fd) +static void reflect_sync_style(prefs_info *prf) { - if (prefs_sync_choice != SYNC_UNSET) - { - rts_sync_choice = prefs_sync_choice; - if (prefs_sync_choice != SYNC_DISABLED) - prefs_variable_save(fd, "global-sync-choice", "extensions", C_TO_XEN_INT(prefs_sync_choice)); - } + rts_sync_style = sync_style(ss); + SET_TOGGLE(prf->toggle, rts_sync_style == SYNC_BY_SOUND); + SET_TOGGLE(prf->toggle2, rts_sync_style == SYNC_ALL); } static void sync1_choice(prefs_info *prf) { if (GET_TOGGLE(prf->toggle)) - prefs_sync_choice = SYNC_WITHIN_EACH_SOUND; - else prefs_sync_choice = SYNC_DISABLED; + rts_sync_style = SYNC_BY_SOUND; + else rts_sync_style = SYNC_NONE; SET_TOGGLE(prf->toggle2, false); - /* if user has not loaded extensions, but sets one of the toggle buttons, load extensions and - * set the global-sync-choice variable - */ - set_sync_choice(prefs_sync_choice, "extensions"); + set_sync_style(rts_sync_style); } static void sync2_choice(prefs_info *prf) { if (GET_TOGGLE(prf->toggle2)) - prefs_sync_choice = SYNC_ACROSS_ALL_SOUNDS; - else prefs_sync_choice = SYNC_DISABLED; + rts_sync_style = SYNC_ALL; + else rts_sync_style = SYNC_NONE; SET_TOGGLE(prf->toggle, false); - set_sync_choice(prefs_sync_choice, "extensions"); + set_sync_style(rts_sync_style); } @@ -2389,108 +2125,89 @@ static void startup_size_text(prefs_info *prf) } -/* ---------------- check-for-unsaved-edits ---------------- */ - -static bool rts_unsaved_edits = false, prefs_unsaved_edits = false; - -static bool unsaved_edits(void) -{ - return(XEN_TO_C_BOOLEAN(prefs_variable_get("checking-for-unsaved-edits"))); -} +/* ---------------- ask-about-unsaved-edits ---------------- */ +static bool rts_unsaved_edits = DEFAULT_ASK_ABOUT_UNSAVED_EDITS; +static void revert_unsaved_edits(prefs_info *prf) {set_ask_about_unsaved_edits(rts_unsaved_edits);} +static void clear_unsaved_edits(prefs_info *prf) {set_ask_about_unsaved_edits(DEFAULT_ASK_ABOUT_UNSAVED_EDITS);} +static void save_unsaved_edits(prefs_info *prf, FILE *fd) {rts_unsaved_edits = ask_about_unsaved_edits(ss);} +static void reflect_unsaved_edits(prefs_info *prf) {SET_TOGGLE(prf->toggle, ask_about_unsaved_edits(ss));} +static void unsaved_edits_toggle(prefs_info *prf) {set_ask_about_unsaved_edits(GET_TOGGLE(prf->toggle));} -static void set_unsaved_edits(bool val, const char *load) +static const char *help_unsaved_edits(prefs_info *prf) { - prefs_unsaved_edits = val; - if ((load) && - (!XEN_DEFINED_P("checking-for-unsaved-edits"))) - load_file_with_path_and_extension(load); - if (XEN_DEFINED_P("checking-for-unsaved-edits")) - prefs_function_call_1("check-for-unsaved-edits", C_TO_XEN_BOOLEAN(val)); + return("\ + This option looks for unsaved edits when you \n\ + close a file, or exit Snd. If it finds any, it \n\ + asks you whether you want to save them."); } -static void revert_unsaved_edits(prefs_info *prf) {set_unsaved_edits(rts_unsaved_edits, NULL);} -static void clear_unsaved_edits(prefs_info *prf) {set_unsaved_edits(false, NULL);} - -static void save_unsaved_edits(prefs_info *prf, FILE *fd) -{ - rts_unsaved_edits = GET_TOGGLE(prf->toggle); - if (rts_unsaved_edits) - prefs_function_save_1(fd, "check-for-unsaved-edits", "extensions", C_TO_XEN_BOOLEAN(prefs_unsaved_edits)); -} +/* ---------------- with-inset-graph ---------------- */ +static bool rts_with_inset_graph = DEFAULT_WITH_INSET_GRAPH; +static void revert_with_inset_graph(prefs_info *prf) {set_with_inset_graph(rts_with_inset_graph);} +static void clear_with_inset_graph(prefs_info *prf) {set_with_inset_graph(DEFAULT_WITH_INSET_GRAPH);} +static void reflect_with_inset_graph(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_inset_graph(ss));} -static void reflect_unsaved_edits(prefs_info *prf) +static void with_inset_graph_toggle(prefs_info *prf) { - prefs_unsaved_edits = unsaved_edits(); - SET_TOGGLE(prf->toggle, prefs_unsaved_edits); + set_with_inset_graph(GET_TOGGLE(prf->toggle)); + for_each_chan(update_graph); } - -static void help_unsaved_edits(prefs_info *prf) +static void save_with_inset_graph(prefs_info *prf, FILE *fd) { - snd_help(prf->var_name, - "This option looks for unsaved edits when you close a file, or exit Snd. If it \ -finds any, it asks you whether you want to save them.", - WITH_WORD_WRAP); + rts_with_inset_graph = GET_TOGGLE(prf->toggle); + set_with_inset_graph(rts_with_inset_graph); } - -static void unsaved_edits_toggle(prefs_info *prf) +static const char *help_inset_graph(prefs_info *prf) { - set_unsaved_edits(GET_TOGGLE(prf->toggle), "extensions"); + return("\ + This option displays a small graph of the entire sound \n\ + in the upper right corner of the screen with an indication \n\ + of where the current window is. If you click somewhere in the \n\ +little graph, the cursor and main window are moved to that spot."); } -/* ---------------- with-inset-graph ---------------- */ - -static bool rts_with_inset_graph = false, prefs_with_inset_graph = false; - -static void revert_with_inset_graph(prefs_info *prf) {set_with_inset_graph(rts_with_inset_graph);} -static void clear_with_inset_graph(prefs_info *prf) {set_with_inset_graph(false);} +/* ---------------- with-smpte-label ---------------- */ +static bool rts_with_smpte_label = DEFAULT_WITH_SMPTE_LABEL; +static void revert_smpte(prefs_info *prf) {set_with_smpte_label(rts_with_smpte_label);} +static void clear_smpte(prefs_info *prf) {set_with_smpte_label(DEFAULT_WITH_SMPTE_LABEL);} +static void reflect_smpte(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_smpte_label(ss));} -static void save_with_inset_graph(prefs_info *prf, FILE *fd) +static void smpte_toggle(prefs_info *prf) { - rts_with_inset_graph = GET_TOGGLE(prf->toggle); - set_with_inset_graph(rts_with_inset_graph); + set_with_smpte_label(GET_TOGGLE(prf->toggle)); + for_each_chan(update_graph); } - -static void help_inset_graph(prefs_info *prf) +static void save_smpte(prefs_info *prf, FILE *fd) { - snd_help(prf->var_name, - "This option displays a small graph of the entire sound in the upper right corner \ -of the screen with an indication of where the current window is. If you click somewhere in the \ -little graph, the cursor and main window are moved to that spot.", - WITH_WORD_WRAP); + rts_with_smpte_label = GET_TOGGLE(prf->toggle); + set_with_smpte_label(rts_with_smpte_label); } - -static void with_inset_graph_toggle(prefs_info *prf) +static const char *help_smpte(prefs_info *prf) { - set_with_inset_graph(GET_TOGGLE(prf->toggle)); -} - - -static void reflect_with_inset_graph(prefs_info *prf) -{ - prefs_with_inset_graph = with_inset_graph(ss); - SET_TOGGLE(prf->toggle, prefs_with_inset_graph); + return(" This option displays the SMPTE data in the time domain graph. "); } /* ---------------- with-pointer-focus ---------------- */ -static bool rts_with_pointer_focus = false, prefs_with_pointer_focus = false; +static bool rts_with_pointer_focus = DEFAULT_WITH_POINTER_FOCUS; static void revert_with_pointer_focus(prefs_info *prf) {set_with_pointer_focus(rts_with_pointer_focus);} -static void clear_with_pointer_focus(prefs_info *prf) {set_with_pointer_focus(false);} - +static void clear_with_pointer_focus(prefs_info *prf) {set_with_pointer_focus(DEFAULT_WITH_POINTER_FOCUS);} +static void with_pointer_focus_toggle(prefs_info *prf) {set_with_pointer_focus(GET_TOGGLE(prf->toggle));} +static void reflect_with_pointer_focus(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_pointer_focus(ss));} static void save_with_pointer_focus(prefs_info *prf, FILE *fd) { @@ -2499,94 +2216,12 @@ static void save_with_pointer_focus(prefs_info *prf, FILE *fd) } -static void help_pointer_focus(prefs_info *prf) -{ - snd_help(prf->var_name, - "If this option is set, when the mouse moves over a text or graph widget, the widget is activated.", - WITH_WORD_WRAP); -} - - -static void with_pointer_focus_toggle(prefs_info *prf) -{ - set_with_pointer_focus(GET_TOGGLE(prf->toggle)); -} - - -static void reflect_with_pointer_focus(prefs_info *prf) -{ - prefs_with_pointer_focus = with_pointer_focus(ss); - SET_TOGGLE(prf->toggle, prefs_with_pointer_focus); -} - - - -#if HAVE_SCHEME -/* ---------------- optimization ---------------- */ - -static int rts_optimization = DEFAULT_OPTIMIZATION; - -#define MAX_OPTIMIZATION 6 -#define MIN_OPTIMIZATION 0 - -static void revert_optimization(prefs_info *prf) {set_optimization(rts_optimization);} -static void save_optimization(prefs_info *prf, FILE *ignore) {rts_optimization = optimization(ss);} - - -static void reflect_optimization(prefs_info *prf) -{ - int_to_textfield(prf->text, optimization(ss)); - SET_SENSITIVE(prf->arrow_up, optimization(ss) < MAX_OPTIMIZATION); - SET_SENSITIVE(prf->arrow_down, optimization(ss) > MIN_OPTIMIZATION); -} - - -static void optimization_up(prefs_info *prf) -{ - int val; - val = optimization(ss) + 1; - if (val >= MAX_OPTIMIZATION) SET_SENSITIVE(prf->arrow_up, false); - if (val > MIN_OPTIMIZATION) SET_SENSITIVE(prf->arrow_down, true); - set_optimization(val); - int_to_textfield(prf->text, optimization(ss)); -} - - -static void optimization_down(prefs_info *prf) +static const char *help_pointer_focus(prefs_info *prf) { - int val; - val = optimization(ss) - 1; - if (val <= MIN_OPTIMIZATION) SET_SENSITIVE(prf->arrow_down, false); - if (val < MAX_OPTIMIZATION) SET_SENSITIVE(prf->arrow_up, true); - set_optimization(val); - int_to_textfield(prf->text, optimization(ss)); -} - - -static void optimization_from_text(prefs_info *prf) -{ - int opt; - char *str; - str = GET_TEXT(prf->text); - if ((str) && (*str)) - { - prf->got_error = false; - - redirect_errors_to(redirect_post_prefs_error, (void *)prf); - opt = string_to_int(str, MIN_OPTIMIZATION, "optimization"); - redirect_errors_to(NULL, NULL); - - free_TEXT(str); - if (!(prf->got_error)) - { - if (opt <= MAX_OPTIMIZATION) - set_optimization(opt); - else va_post_prefs_error("%s > %d?", prf, str, MAX_OPTIMIZATION); - } - else prf->got_error = false; - } + return("\ + If this option is set, when the mouse moves over a \n\ + text or graph widget, the widget is activated. "); } -#endif @@ -2598,7 +2233,7 @@ static int rts_cursor_size = DEFAULT_CURSOR_SIZE; #define MIN_CURSOR_SIZE 1 #define MAX_CURSOR_SIZE 500 -static void revert_cursor_size(prefs_info *prf) {in_set_cursor_size(rts_cursor_size);} +static void revert_cursor_size(prefs_info *prf) {set_cursor_size(rts_cursor_size);} static void save_cursor_size(prefs_info *prf, FILE *ignore) {rts_cursor_size = cursor_size(ss);} @@ -2616,7 +2251,7 @@ static void cursor_size_up(prefs_info *prf) size = cursor_size(ss) + 1; if (size >= MAX_CURSOR_SIZE) SET_SENSITIVE(prf->arrow_up, false); if (size > MIN_CURSOR_SIZE) SET_SENSITIVE(prf->arrow_down, true); - in_set_cursor_size(size); + set_cursor_size(size); int_to_textfield(prf->text, cursor_size(ss)); } @@ -2627,7 +2262,7 @@ static void cursor_size_down(prefs_info *prf) size = cursor_size(ss) - 1; if (size <= MIN_CURSOR_SIZE) SET_SENSITIVE(prf->arrow_down, false); if (size < MAX_CURSOR_SIZE) SET_SENSITIVE(prf->arrow_up, true); - in_set_cursor_size(size); + set_cursor_size(size); int_to_textfield(prf->text, cursor_size(ss)); } @@ -2651,7 +2286,7 @@ static void cursor_size_from_text(prefs_info *prf) if (size >= MIN_CURSOR_SIZE) { if (size <= MAX_CURSOR_SIZE) - in_set_cursor_size(size); + set_cursor_size(size); else va_post_prefs_error("%s > %d?", prf, str, MAX_CURSOR_SIZE); } else va_post_prefs_error("%s < %d?", prf, str, MIN_CURSOR_SIZE); @@ -2670,7 +2305,7 @@ static int rts_dot_size = DEFAULT_DOT_SIZE; #define MIN_DOT_SIZE 0 #define MAX_DOT_SIZE 100 -static void revert_dot_size(prefs_info *prf) {in_set_dot_size(rts_dot_size);} +static void revert_dot_size(prefs_info *prf) {set_dot_size(rts_dot_size);} static void save_dot_size(prefs_info *prf, FILE *ignore) {rts_dot_size = dot_size(ss);} @@ -2688,7 +2323,7 @@ static void dot_size_up(prefs_info *prf) size = dot_size(ss) + 1; if (size >= MAX_DOT_SIZE) SET_SENSITIVE(prf->arrow_up, false); if (size > MIN_DOT_SIZE) SET_SENSITIVE(prf->arrow_down, true); - in_set_dot_size(size); + set_dot_size(size); int_to_textfield(prf->text, dot_size(ss)); } @@ -2699,7 +2334,7 @@ static void dot_size_down(prefs_info *prf) size = dot_size(ss) - 1; if (size <= MIN_DOT_SIZE) SET_SENSITIVE(prf->arrow_down, false); if (size < MAX_DOT_SIZE) SET_SENSITIVE(prf->arrow_up, true); - in_set_dot_size(size); + set_dot_size(size); int_to_textfield(prf->text, dot_size(ss)); } @@ -2723,7 +2358,7 @@ static void dot_size_from_text(prefs_info *prf) if (size >= MIN_DOT_SIZE) { if (size <= MAX_DOT_SIZE) - in_set_dot_size(size); + set_dot_size(size); else va_post_prefs_error("%s > %d?", prf, str, MAX_DOT_SIZE); } else va_post_prefs_error("%s < %d?", prf, str, MIN_DOT_SIZE); @@ -2741,7 +2376,7 @@ static mus_long_t rts_fft_size = DEFAULT_TRANSFORM_SIZE; #define MAX_TRANSFORM_SIZE 1073741824 #define MIN_TRANSFORM_SIZE 2 -static void revert_fft_size(prefs_info *prf) {in_set_transform_size(rts_fft_size);} +static void revert_fft_size(prefs_info *prf) {set_transform_size(rts_fft_size);} static void save_fft_size(prefs_info *prf, FILE *ignore) {rts_fft_size = transform_size(ss);} @@ -2759,7 +2394,7 @@ static void fft_size_up(prefs_info *prf) size = transform_size(ss) * 2; if (size >= MAX_TRANSFORM_SIZE) SET_SENSITIVE(prf->arrow_up, false); if (size > MIN_TRANSFORM_SIZE) SET_SENSITIVE(prf->arrow_down, true); - in_set_transform_size(size); + set_transform_size(size); mus_long_t_to_textfield(prf->text, transform_size(ss)); } @@ -2770,7 +2405,7 @@ static void fft_size_down(prefs_info *prf) size = transform_size(ss) / 2; if (size <= MIN_TRANSFORM_SIZE) SET_SENSITIVE(prf->arrow_down, false); if (size < MAX_TRANSFORM_SIZE) SET_SENSITIVE(prf->arrow_up, true); - in_set_transform_size(size); + set_transform_size(size); mus_long_t_to_textfield(prf->text, transform_size(ss)); } @@ -2794,7 +2429,7 @@ static void fft_size_from_text(prefs_info *prf) if (POWER_OF_2_P(size)) { if (size <= MAX_TRANSFORM_SIZE) - in_set_transform_size(size); + set_transform_size(size); else va_post_prefs_error("%s > %d?", prf, str, MAX_TRANSFORM_SIZE); } else post_prefs_error("size must be a power of 2", prf); @@ -2813,7 +2448,7 @@ static int rts_cursor_location_offset = DEFAULT_CURSOR_LOCATION_OFFSET; static void revert_with_tracking_cursor(prefs_info *prf) { - in_set_with_tracking_cursor(ss, rts_with_tracking_cursor); + set_with_tracking_cursor(ss, rts_with_tracking_cursor); set_cursor_update_interval(rts_cursor_update_interval); set_cursor_location_offset(rts_cursor_location_offset); } @@ -2837,7 +2472,7 @@ static void reflect_with_tracking_cursor(prefs_info *prf) static void with_tracking_cursor_toggle(prefs_info *prf) { - in_set_with_tracking_cursor(ss, (GET_TOGGLE(prf->toggle)) ? ALWAYS_TRACK : DONT_TRACK); + set_with_tracking_cursor(ss, (GET_TOGGLE(prf->toggle)) ? ALWAYS_TRACK : TRACK_IF_ASKED); } @@ -2878,18 +2513,18 @@ static void cursor_location_text(prefs_info *prf) static channel_style_t rts_channel_style = DEFAULT_CHANNEL_STYLE; -static const char *channel_styles[NUM_CHANNEL_STYLES] = {"separate", "combined", "superimposed"}; +static const char *channel_styles[NUM_CHANNEL_STYLES] = {"separate ", "combined ", "superimposed"}; static void reflect_channel_style(prefs_info *prf) {set_radio_button(prf, (int)channel_style(ss));} -static void revert_channel_style(prefs_info *prf) {in_set_channel_style(rts_channel_style);} +static void revert_channel_style(prefs_info *prf) {set_channel_style(rts_channel_style);} static void save_channel_style(prefs_info *prf, FILE *ignore) {rts_channel_style = channel_style(ss);} static void channel_style_choice(prefs_info *prf) { if (GET_TOGGLE(prf->radio_button)) - in_set_channel_style((channel_style_t)which_radio_button(prf)); + set_channel_style((channel_style_t)which_radio_button(prf)); } @@ -2898,18 +2533,18 @@ static void channel_style_choice(prefs_info *prf) static cursor_style_t rts_cursor_style = DEFAULT_CURSOR_STYLE; #define NUM_CURSOR_STYLES 2 -static const char *cursor_styles[NUM_CURSOR_STYLES] = {"cross", "line"}; +static const char *cursor_styles[NUM_CURSOR_STYLES] = {"cross ", "line"}; static void reflect_cursor_style(prefs_info *prf) {set_radio_button(prf, (int)cursor_style(ss));} -static void revert_cursor_style(prefs_info *prf) {in_set_cursor_style(rts_cursor_style);} +static void revert_cursor_style(prefs_info *prf) {set_cursor_style(rts_cursor_style);} static void save_cursor_style(prefs_info *prf, FILE *ignore) {rts_cursor_style = cursor_style(ss);} static void cursor_style_choice(prefs_info *prf) { if (GET_TOGGLE(prf->radio_button)) - in_set_cursor_style((cursor_style_t)which_radio_button(prf)); + set_cursor_style((cursor_style_t)which_radio_button(prf)); } @@ -2935,18 +2570,18 @@ static void tracking_cursor_style_choice(prefs_info *prf) static graph_type_t rts_transform_graph_type = DEFAULT_TRANSFORM_GRAPH_TYPE; #define NUM_TRANSFORM_GRAPH_TYPES 3 -static const char *transform_graph_types[NUM_TRANSFORM_GRAPH_TYPES] = {"normal", "sonogram", "spectrogram"}; +static const char *transform_graph_types[NUM_TRANSFORM_GRAPH_TYPES] = {"normal ", "sonogram ", "spectrogram"}; static void reflect_transform_graph_type(prefs_info *prf) {set_radio_button(prf, (int)transform_graph_type(ss));} -static void revert_transform_graph_type(prefs_info *prf) {in_set_transform_graph_type(rts_transform_graph_type);} +static void revert_transform_graph_type(prefs_info *prf) {set_transform_graph_type(rts_transform_graph_type);} static void save_transform_graph_type(prefs_info *prf, FILE *ignore) {rts_transform_graph_type = transform_graph_type(ss);} static void transform_graph_type_choice(prefs_info *prf) { if (GET_TOGGLE(prf->radio_button)) - in_set_transform_graph_type((graph_type_t)which_radio_button(prf)); + set_transform_graph_type((graph_type_t)which_radio_button(prf)); } @@ -2954,18 +2589,18 @@ static void transform_graph_type_choice(prefs_info *prf) static fft_normalize_t rts_transform_normalization = DEFAULT_TRANSFORM_NORMALIZATION; -static const char *transform_normalizations[NUM_TRANSFORM_NORMALIZATIONS] = {"none", "by channel", "by sound", "global"}; +static const char *transform_normalizations[NUM_TRANSFORM_NORMALIZATIONS] = {"none ", "by channel ", "by sound ", "global"}; static void reflect_transform_normalization(prefs_info *prf) {set_radio_button(prf, (int)transform_normalization(ss));} -static void revert_transform_normalization(prefs_info *prf) {in_set_transform_normalization(rts_transform_normalization);} +static void revert_transform_normalization(prefs_info *prf) {set_transform_normalization(rts_transform_normalization);} static void save_transform_normalization(prefs_info *prf, FILE *ignore) {rts_transform_normalization = transform_normalization(ss);} static void transform_normalization_choice(prefs_info *prf) { if (GET_TOGGLE(prf->radio_button)) - in_set_transform_normalization((fft_normalize_t)which_radio_button(prf)); + set_transform_normalization((fft_normalize_t)which_radio_button(prf)); } @@ -2973,18 +2608,18 @@ static void transform_normalization_choice(prefs_info *prf) static graph_style_t rts_graph_style = DEFAULT_GRAPH_STYLE; -static const char *graph_styles[NUM_GRAPH_STYLES] = {"line", "dot", "filled", "dot+line", "lollipop"}; +static const char *graph_styles[NUM_GRAPH_STYLES] = {"line ", "dot ", "filled ", "dot+line ", "lollipop"}; static void reflect_graph_style(prefs_info *prf) {set_radio_button(prf, (int)graph_style(ss));} -static void revert_graph_style(prefs_info *prf) {in_set_graph_style(rts_graph_style);} +static void revert_graph_style(prefs_info *prf) {set_graph_style(rts_graph_style);} static void save_graph_style(prefs_info *prf, FILE *ignore) {rts_graph_style = graph_style(ss);} static void graph_style_choice(prefs_info *prf) { if (GET_TOGGLE(prf->radio_button)) - in_set_graph_style((graph_style_t)which_radio_button(prf)); + set_graph_style((graph_style_t)which_radio_button(prf)); } @@ -2994,7 +2629,7 @@ static speed_style_t rts_speed_control_style = DEFAULT_SPEED_CONTROL_STYLE; static int rts_speed_control_tones = DEFAULT_SPEED_CONTROL_TONES; #define MIN_SPEED_CONTROL_SEMITONES 1 -static const char *speed_control_styles[NUM_SPEED_CONTROL_STYLES] = {"float", "ratio", "semitones:"}; +static const char *speed_control_styles[NUM_SPEED_CONTROL_STYLES] = {"float ", "ratio ", "semitones:"}; static void show_speed_control_semitones(prefs_info *prf) { @@ -3077,19 +2712,19 @@ static int rts_default_output_header_type = DEFAULT_OUTPUT_HEADER_TYPE; static prefs_info *output_data_format_prf = NULL, *output_header_type_prf = NULL; #define NUM_OUTPUT_CHAN_CHOICES 4 -static const char *output_chan_choices[NUM_OUTPUT_CHAN_CHOICES] = {"1", "2", "4", "8"}; +static const char *output_chan_choices[NUM_OUTPUT_CHAN_CHOICES] = {"1 ", "2 ", "4 ", "8"}; static int output_chans[NUM_OUTPUT_CHAN_CHOICES] = {1, 2, 4, 8}; #define NUM_OUTPUT_SRATE_CHOICES 4 -static const char *output_srate_choices[NUM_OUTPUT_SRATE_CHOICES] = {"8000", "22050", "44100", "48000"}; +static const char *output_srate_choices[NUM_OUTPUT_SRATE_CHOICES] = {"8000 ", "22050 ", "44100 ", "48000"}; static int output_srates[NUM_OUTPUT_SRATE_CHOICES] = {8000, 22050, 44100, 48000}; #define NUM_OUTPUT_TYPE_CHOICES 7 -static const char *output_type_choices[NUM_OUTPUT_TYPE_CHOICES] = {"aifc", "wave", "next/sun", "rf64", "nist", "aiff", "caff"}; +static const char *output_type_choices[NUM_OUTPUT_TYPE_CHOICES] = {"aifc ", "wave ", "au ", "rf64 ", "nist ", "aiff ", "caff"}; static int output_types[NUM_OUTPUT_TYPE_CHOICES] = {MUS_AIFC, MUS_RIFF, MUS_NEXT, MUS_RF64, MUS_NIST, MUS_AIFF, MUS_CAFF}; #define NUM_OUTPUT_FORMAT_CHOICES 4 -static const char *output_format_choices[NUM_OUTPUT_FORMAT_CHOICES] = {"short", "int", "float", "double"}; +static const char *output_format_choices[NUM_OUTPUT_FORMAT_CHOICES] = {"short ", "int ", "float ", "double"}; static int output_formats[NUM_OUTPUT_FORMAT_CHOICES] = {MUS_LSHORT, MUS_LINT, MUS_LFLOAT, MUS_LDOUBLE}; @@ -3511,763 +3146,76 @@ static void raw_data_format_from_menu(prefs_info *prf, char *value) #endif +/* ---------------- with-toolbar ---------------- */ -/* ---------------- with-sound ---------------- */ - -static bool rts_with_sound = false; -static char *rts_clm_file_name = NULL; -static mus_long_t rts_clm_file_buffer_size = 65536; -static mus_long_t rts_clm_table_size = 512; - - -static bool with_sound_is_loaded(void) {return(XEN_DEFINED_P("with-sound"));} -static void reflect_with_sound(prefs_info *prf) {} -static void revert_with_sound(prefs_info *prf) {SET_TOGGLE(prf->toggle, rts_with_sound);} -static void clear_with_sound(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - -static void with_sound_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(XEN_DEFINED_P("with-sound")))) - load_file_with_path_and_extension("ws"); -} - - -static void save_with_sound(prefs_info *prf, FILE *fd) -{ - rts_with_sound = GET_TOGGLE(prf->toggle); - if (rts_with_sound) - { -#if HAVE_SCHEME - fprintf(fd, "(if (not (provided? 'snd-ws.scm)) (load \"ws.scm\"))\n"); - if (rts_clm_file_name) - fprintf(fd, "(set! *clm-file-name* \"%s\")\n", rts_clm_file_name); - if (rts_clm_file_buffer_size != 65536) - fprintf(fd, "(set! *clm-file-buffer-size* " MUS_LD ")\n", rts_clm_file_buffer_size); - if (rts_clm_table_size != 512) - fprintf(fd, "(set! *clm-table-size* " MUS_LD ")\n", rts_clm_table_size); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"ws\"\n"); - if (rts_clm_file_name) - fprintf(fd, "$clm_file_name = \"%s\"\n", rts_clm_file_name); - if (rts_clm_file_buffer_size != 65536) - fprintf(fd, "$clm_file_buffer_size = " MUS_LD "\n", rts_clm_file_buffer_size); - if (rts_clm_table_size != 512) - fprintf(fd, "$clm_table_size = " MUS_LD "\n", rts_clm_table_size); -#endif - -#if HAVE_FORTH - fprintf(fd, "require clm\n"); - if (rts_clm_file_name) - fprintf(fd, "\"%s\" to *clm-file-name*\n", rts_clm_file_name); - if (rts_clm_file_buffer_size != 65536) - fprintf(fd, MUS_LD " to *clm-file-buffer-size*\n", rts_clm_file_buffer_size); - if (rts_clm_table_size != 512) - fprintf(fd, MUS_LD " to *clm-table-size*\n", rts_clm_table_size); -#endif - } -} - - -static void help_with_sound(prefs_info *prf) -{ - snd_help(prf->var_name, - "with-sound is the main CLM sound-producing macro. If you want to use CLM functions to create \ -new sounds, then edit them in Snd, include with-sound.", - WITH_WORD_WRAP); -} - - - -/* ---------------- clm file name ---------------- */ - -#define CLM_FILE_NAME "*clm-file-name*" - -static void set_clm_file_name(const char *str) {prefs_variable_set(CLM_FILE_NAME, C_TO_XEN_STRING(str));} - -static const char *find_clm_file_name(void) -{ - XEN val; - val = prefs_variable_get(CLM_FILE_NAME); - if (XEN_STRING_P(val)) - return(XEN_TO_C_STRING(val)); - return(NULL); -} - - -static void clm_file_name_text(prefs_info *prf) -{ - char *str; - str = GET_TEXT(prf->text); - if ((str) && (*str)) - { - rts_with_sound = true; - if (rts_clm_file_name) free(rts_clm_file_name); /* save is done after we're sure with-sound is loaded */ - rts_clm_file_name = mus_strdup(str); - set_clm_file_name(str); - free_TEXT(str); - } -} - - -static void reflect_clm_file_name(prefs_info *prf) -{ - SET_TEXT(prf->text, find_clm_file_name()); -} - -static void clear_clm_file_name(prefs_info *prf) -{ - prefs_variable_set(CLM_FILE_NAME, C_TO_XEN_STRING("test.snd")); -} - - -static void revert_clm_file_name(prefs_info *prf) -{ - prefs_variable_set(CLM_FILE_NAME, C_TO_XEN_STRING((char *)((rts_clm_file_name) ? rts_clm_file_name : "test.snd"))); -} - - -static void help_clm_file_name(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option sets the default output file name used by with-sound.", - WITH_WORD_WRAP); -} - - -static void save_clm_file_name(prefs_info *prf, FILE *ignore) -{ - if (rts_clm_file_name) free(rts_clm_file_name); - rts_clm_file_name = mus_strdup(find_clm_file_name()); -} - - -/* ---------------- clm sizes ---------------- */ - -#define CLM_TABLE_SIZE "*clm-table-size*" -#define CLM_FILE_BUFFER_SIZE "*clm-file-buffer-size*" - -static mus_long_t find_clm_table_size(void) -{ - return(XEN_TO_C_INT64_T_OR_ELSE(prefs_variable_get(CLM_TABLE_SIZE), 512)); -} - - -static mus_long_t find_clm_file_buffer_size(void) -{ - return(XEN_TO_C_INT64_T_OR_ELSE(prefs_variable_get(CLM_FILE_BUFFER_SIZE), 65536)); -} - - -static void reflect_clm_sizes(prefs_info *prf) -{ - rts_clm_table_size = find_clm_table_size(); - mus_long_t_to_textfield(prf->text, rts_clm_table_size); - rts_clm_file_buffer_size = find_clm_file_buffer_size(); - mus_long_t_to_textfield(prf->rtxt, rts_clm_file_buffer_size); -} - - -static void clm_sizes_text(prefs_info *prf) -{ - char *str; - - str = GET_TEXT(prf->text); - if ((str) && (*str)) - { - mus_long_t size = 0; - rts_with_sound = true; - redirect_errors_to(any_error_to_text, (void *)prf); - size = string_to_mus_long_t(str, 1, "table size"); - redirect_errors_to(NULL, NULL); - if (!(prf->got_error)) - rts_clm_table_size = size; - free_TEXT(str); - } - - str = GET_TEXT(prf->rtxt); - if ((str) && (*str)) - { - mus_long_t size = 0; - rts_with_sound = true; - redirect_errors_to(any_error_to_text, (void *)prf); - size = string_to_mus_long_t(str, 1, "file buffer size"); - redirect_errors_to(NULL, NULL); - if (!(prf->got_error)) - rts_clm_file_buffer_size = size; - free_TEXT(str); - } -} - - -static void help_clm_sizes(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option sets the default clm table size and file buffer size.", - WITH_WORD_WRAP); -} - - -static void revert_clm_sizes(prefs_info *prf) -{ - prefs_variable_set(CLM_FILE_BUFFER_SIZE, C_TO_XEN_INT64_T(rts_clm_file_buffer_size)); - prefs_variable_set(CLM_TABLE_SIZE, C_TO_XEN_INT64_T(rts_clm_table_size)); -} - - -static void clear_clm_sizes(prefs_info *prf) -{ - prefs_variable_set(CLM_FILE_BUFFER_SIZE, C_TO_XEN_INT64_T(65536)); - prefs_variable_set(CLM_TABLE_SIZE, C_TO_XEN_INT64_T(512)); -} - - -static void save_clm_sizes(prefs_info *prf, FILE *ignore) -{ - rts_clm_file_buffer_size = find_clm_file_buffer_size(); - rts_clm_table_size = find_clm_table_size(); -} - - -/* ---------------- context sensitive popup ---------------- */ - -static bool include_context_sensitive_popup = false; - -static void help_context_sensitive_popup(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option creates a context-sensitive popup menu (activated by button 3). The menu \ -displayed depends on where the mouse is at the time; there are special menus for the waveform and fft \ -portions of the graphs, the listener, the edit history pane, and the current selection.", - WITH_WORD_WRAP); -} - - -static bool find_context_sensitive_popup(void) -{ - return(XEN_DEFINED_P("edhist-help-edits")); -} - - -static void save_context_sensitive_popup(prefs_info *prf, FILE *fd) -{ - include_context_sensitive_popup = GET_TOGGLE(prf->toggle); - if (include_context_sensitive_popup) - { -#if HAVE_SCHEME - fprintf(fd, "(if (provided? 'snd-motif)\n (if (not (provided? 'snd-popup.scm))\n (load \"popup.scm\"))\n (if (not (provided? 'snd-gtk-popup.scm))\n (load \"gtk-popup.scm\")))\n"); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"popup\"\n"); -#endif - -#if HAVE_FORTH - fprintf(fd, "require popup\n"); -#endif - } -} - - -static void context_sensitive_popup_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_context_sensitive_popup()))) -#if USE_MOTIF - load_file_with_path_and_extension("popup"); -#else - load_file_with_path_and_extension("gtk-popup"); -#endif -} - - -static void reflect_context_sensitive_popup(prefs_info *prf) {} -static void revert_context_sensitive_popup(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_context_sensitive_popup);} -static void clear_context_sensitive_popup(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - - -/* ---------------- effects menu ---------------- */ - -static bool include_effects_menu = false; - -static void help_effects_menu(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option creates a top-level menu named 'Effects'. The effects include such things as \ -reverberation, reversal, normalizations, gains and envelopes, inversion, echos, flanging, companding, \ -filtering, padding, cross synthesis, and so on.", - WITH_WORD_WRAP); -} - - -static bool find_effects_menu(void) -{ - return(XEN_DEFINED_P("effects-menu")); -} - - -static void save_effects_menu(prefs_info *prf, FILE *fd) -{ - include_effects_menu = GET_TOGGLE(prf->toggle); - if (include_effects_menu) - { -#if HAVE_SCHEME - fprintf(fd, "(if (provided? 'snd-motif)\n (if (not (provided? 'snd-new-effects.scm))\n (load \"new-effects.scm\"))\n (if (not (provided? 'snd-gtk-effects.scm))\n (load \"gtk-effects.scm\")))\n"); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"effects\"\n"); -#endif - -#if HAVE_FORTH - fprintf(fd, "require effects\n"); -#endif - } -} - - -static void effects_menu_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_effects_menu()))) -#if USE_MOTIF - load_file_with_path_and_extension("new-effects"); -#else - load_file_with_path_and_extension("gtk-effects"); -#endif -} - - -static void reflect_effects_menu(prefs_info *prf) {} -static void revert_effects_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_effects_menu);} -static void clear_effects_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - +static bool rts_with_toolbar = DEFAULT_WITH_TOOLBAR; - -#if HAVE_SCHEME -/* ---------------- edit menu ---------------- */ - -static bool include_edit_menu = false; - - -static void help_edit_menu(prefs_info *prf) +static const char *help_with_toolbar(prefs_info *prf) { - snd_help(prf->var_name, - "This option adds several options to the top-level Edit menu: selection to file, \ -append selection, mono to stereo, trim, crop, etc.", - WITH_WORD_WRAP); + return(" If this is set, a toolbar is displayed. "); } +static void revert_with_toolbar(prefs_info *prf) {set_with_toolbar_and_display(rts_with_toolbar);} +static void clear_with_toolbar(prefs_info *prf) {set_with_toolbar_and_display(DEFAULT_WITH_TOOLBAR);} +static void reflect_with_toolbar(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_toolbar(ss));} +static void save_with_toolbar(prefs_info *prf, FILE *fd) {rts_with_toolbar = with_toolbar(ss);} +static void toggle_with_toolbar(prefs_info *prf) {set_with_toolbar_and_display(GET_TOGGLE(prf->toggle));} -static bool find_edit_menu(void) -{ - return(XEN_DEFINED_P("make-stereofile")); /* a kludge... currently this is only defined in edit-menu.scm */ -} -static void save_edit_menu(prefs_info *prf, FILE *fd) -{ - include_edit_menu = GET_TOGGLE(prf->toggle); - if (include_edit_menu) - fprintf(fd, "(if (not (provided? 'snd-edit-menu.scm)) (load \"edit-menu.scm\"))\n"); /* ok for either case */ -} +/* ---------------- with-tooltips ---------------- */ +static bool rts_with_tooltips = DEFAULT_WITH_TOOLTIPS; -static void edit_menu_toggle(prefs_info *prf) +static const char *help_with_tooltips(prefs_info *prf) { - if ((GET_TOGGLE(prf->toggle)) && - (!(find_edit_menu()))) - load_file_with_path_and_extension("edit-menu"); + return(" If this is set, tooltips may be displayed. "); } +static void revert_with_tooltips(prefs_info *prf) {set_with_tooltips(rts_with_tooltips);} +static void clear_with_tooltips(prefs_info *prf) {set_with_tooltips(DEFAULT_WITH_TOOLTIPS);} +static void reflect_with_tooltips(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_tooltips(ss));} +static void save_with_tooltips(prefs_info *prf, FILE *fd) {rts_with_tooltips = with_tooltips(ss);} +static void toggle_with_tooltips(prefs_info *prf) {set_with_tooltips(GET_TOGGLE(prf->toggle));} -static void reflect_edit_menu(prefs_info *prf) {} -static void revert_edit_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_edit_menu);} -static void clear_edit_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - - -/* ---------------- marks menu ---------------- */ - -static bool include_marks_menu = false; - -static bool find_marks_menu(void) -{ - return(XEN_DEFINED_P("marks-menu")); -} -static void help_marks_menu(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option adds a top-level 'Marks' menu that includes such things as play between marks, \ -trim, crop, define selection via marks, etc", - WITH_WORD_WRAP); -} +#if USE_GTK +/* ---------------- with-menu-icons ---------------- */ +static bool rts_with_menu_icons = DEFAULT_WITH_MENU_ICONS; -static void save_marks_menu(prefs_info *prf, FILE *fd) +static const char *help_with_menu_icons(prefs_info *prf) { - include_marks_menu = GET_TOGGLE(prf->toggle); - if (include_marks_menu) - fprintf(fd, "(if (not (provided? 'snd-marks-menu.scm)) (load \"marks-menu.scm\"))\n"); + return(" If this is set, some menus include icons. "); } - -static void marks_menu_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_marks_menu()))) - load_file_with_path_and_extension("marks-menu"); -} - - -static void reflect_marks_menu(prefs_info *prf) {} -static void revert_marks_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_marks_menu);} -static void clear_marks_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - - -/* ---------------- icon box ---------------- */ - -static bool include_icon_box = false; - -static void help_icon_box(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option adds a top-level box full of various handy icons. Not implemented in Gtk yet.", - WITH_WORD_WRAP); -} - - -static bool find_icon_box(void) -{ - return(XEN_DEFINED_P("add-useful-icons")); -} - - -static void save_icon_box(prefs_info *prf, FILE *fd) -{ - include_icon_box = GET_TOGGLE(prf->toggle); - if (include_icon_box) - fprintf(fd, "(if (not (provided? 'snd-toolbar.scm)) (load \"toolbar.scm\"))\n"); -} - - -static void icon_box_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_icon_box()))) - load_file_with_path_and_extension("toolbar"); -} - - -static void reflect_icon_box(prefs_info *prf) {} -static void revert_icon_box(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_icon_box);} -static void clear_icon_box(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} +static void revert_with_menu_icons(prefs_info *prf) {set_with_menu_icons(rts_with_menu_icons);} +static void clear_with_menu_icons(prefs_info *prf) {set_with_menu_icons(DEFAULT_WITH_MENU_ICONS);} +static void reflect_with_menu_icons(prefs_info *prf) {SET_TOGGLE(prf->toggle, with_menu_icons(ss));} +static void save_with_menu_icons(prefs_info *prf, FILE *fd) {rts_with_menu_icons = with_menu_icons(ss);} +static void toggle_with_menu_icons(prefs_info *prf) {set_with_menu_icons(GET_TOGGLE(prf->toggle));} #endif -/* ---------------- reopen menu ---------------- */ - -static bool include_reopen_menu = false; - -static void help_reopen_menu(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option adds a top-level 'Reopen' menu. Previously opened sounds that are not currently open are listed \ -as menu items.", - WITH_WORD_WRAP); -} - - -static bool find_reopen_menu(void) -{ - return((XEN_DEFINED_P("including-reopen-menu")) && - XEN_TO_C_BOOLEAN(XEN_NAME_AS_C_STRING_TO_VALUE("including-reopen-menu"))); -} - - -static void save_reopen_menu(prefs_info *prf, FILE *fd) -{ - include_reopen_menu = GET_TOGGLE(prf->toggle); - if (include_reopen_menu) - prefs_function_save_0(fd, "with-reopen-menu", "extensions"); -} - - -static void reopen_menu_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_reopen_menu()))) - { - load_file_with_path_and_extension("extensions"); - prefs_function_call_0("with-reopen-menu"); - } -} - - -static void reflect_reopen_menu(prefs_info *prf) {} -static void revert_reopen_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_reopen_menu);} -static void clear_reopen_menu(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - - -#if USE_MOTIF -/* ---------------- mark-pane ---------------- */ - -static bool include_mark_pane = false; - -static void help_mark_pane(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option adds a pane to each channel window containing information about that channel's marks.", - WITH_WORD_WRAP); -} - - -static bool find_mark_pane(void) -{ - return((XEN_DEFINED_P("including-mark-pane")) && - XEN_TO_C_BOOLEAN(XEN_NAME_AS_C_STRING_TO_VALUE("including-mark-pane"))); -} - - -#if HAVE_SCHEME - #if USE_MOTIF - #define MARK_PANE_SOURCE "snd-motif" - #else - #define MARK_PANE_SOURCE "snd-gtk" - #endif -#else - #define MARK_PANE_SOURCE "snd-xm" -#endif - -static void mark_pane_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_mark_pane()))) - { - load_file_with_path_and_extension(MARK_PANE_SOURCE); - prefs_function_call_0("add-mark-pane"); - } -} - - -static void save_mark_pane(prefs_info *prf, FILE *fd) -{ - include_mark_pane = GET_TOGGLE(prf->toggle); - if (include_mark_pane) - prefs_function_save_0(fd, "add-mark-pane", MARK_PANE_SOURCE); -} - - -static void reflect_mark_pane(prefs_info *prf) {} -static void revert_mark_pane(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_mark_pane);} -static void clear_mark_pane(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} -#endif - - - -#if HAVE_SCHEME -/* ---------------- hidden controls dialog ---------------- */ - -static bool include_hidden_controls = false; - -static void help_hidden_controls(prefs_info *prf) -{ - snd_help(prf->var_name, - "This adds a 'Hidden Controls' option to the Option menu. The dialog \ -gives access to all the synthesis variables that aren't reflected in the standard \ -control panel: 'expand-hop' sets the hop size (per grain), 'expand-length' \ -sets the grain length, 'expand-ramp' sets the slope of the grain amplitude envelope, \ -'contrast-amp' sets the prescaler for the contrast effect, 'reverb-feedback' sets the feedback \ -amount in the reverberator (it sets all the comb filter scalers), and 'reverb-lowpass' sets \ -the lowpass filter coefficient in the reverberator.", - WITH_WORD_WRAP); -} - - -static bool find_hidden_controls(void) -{ - return((XEN_DEFINED_P("hidden-controls-dialog")) && - (XEN_NOT_FALSE_P(XEN_NAME_AS_C_STRING_TO_VALUE("hidden-controls-dialog")))); -} - - -static void save_hidden_controls(prefs_info *prf, FILE *fd) -{ - include_hidden_controls = GET_TOGGLE(prf->toggle); - if (include_hidden_controls) - { - fprintf(fd, "(if (not (provided? 'snd-snd-motif.scm)) (load \"snd-motif.scm\"))\n"); - fprintf(fd, "(make-hidden-controls-dialog)\n"); - } -} - - -static void hidden_controls_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_hidden_controls()))) - { - load_file_with_path_and_extension("snd-motif"); - prefs_function_call_0("make-hidden-controls-dialog"); - } -} - - -static void reflect_hidden_controls(prefs_info *prf) {} -static void revert_hidden_controls(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_hidden_controls);} -static void clear_hidden_controls(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - -#endif - - - -/* ---------------- smpte ---------------- */ - -static bool include_smpte = false; - -static void help_smpte(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option adds a label to the time domain graph showing the current SMPTE frame of the leftmost sample.", - WITH_WORD_WRAP); -} - - -static bool find_smpte(void) -{ -#if HAVE_SCHEME - return((XEN_DEFINED_P("smpte-is-on")) && - (!(XEN_FALSE_P(XEN_EVAL_C_STRING("(smpte-is-on)"))))); /* "member" of hook-list -> a list if successful */ -#endif - -#if HAVE_RUBY || HAVE_FORTH - return((XEN_DEFINED_P("smpte-is-on")) && - XEN_TO_C_BOOLEAN(XEN_EVAL_C_STRING(TO_PROC_NAME("smpte-is-on")))); /* "member" of hook-list -> true */ -#endif - return(false); -} - - -static void reflect_smpte(prefs_info *prf) {} -static void revert_smpte(prefs_info *prf) {SET_TOGGLE(prf->toggle, include_smpte);} -static void clear_smpte(prefs_info *prf) {SET_TOGGLE(prf->toggle, false);} - - -#if HAVE_SCHEME - #if USE_MOTIF - #define SMPTE_SOURCE "snd-motif" - #else - #define SMPTE_SOURCE "snd-gtk" - #endif -#else - #define SMPTE_SOURCE "snd-xm" -#endif - -static void smpte_toggle(prefs_info *prf) -{ - if ((GET_TOGGLE(prf->toggle)) && - (!(find_smpte()))) - load_file_with_path_and_extension(SMPTE_SOURCE); - if (find_smpte()) - prefs_function_call_1("show-smpte-label", C_TO_XEN_BOOLEAN(GET_TOGGLE(prf->toggle))); -} - - -static void save_smpte(prefs_info *prf, FILE *fd) -{ - include_smpte = GET_TOGGLE(prf->toggle); - if (include_smpte) - { -#if HAVE_SCHEME - fprintf(fd, "(if (provided? 'snd-motif)\n (if (not (provided? 'snd-snd-motif.scm))\n (load \"snd-motif.scm\"))\n (if (not (provided? 'snd-snd-gtk.scm))\n (load \"snd-gtk.scm\")))\n"); - fprintf(fd, "(show-smpte-label #t)\n"); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"snd-xm\"\n"); - fprintf(fd, "show_smpte_label(true)\n"); -#endif - -#if HAVE_FORTH - fprintf(fd, "require snd-xm\n"); - fprintf(fd, "#t show-smpte-label\n"); -#endif - } -} - - /* ---------------- remember-sound-state ---------------- */ -static int rts_remember_sound_state_choice = 0, remember_sound_state_choice = 0; /* 0=none, 1=local, 2=global+not local, 3=local+global */ - -static void help_remember_sound_state_choice(prefs_info *prf) -{ - snd_help(prf->var_name, - "This option causes Snd to save most of a sound's display state when it is closed, \ -and if that same sound is later re-opened, Snd restores the previous state. This only takes effect upon restarting Snd.", - WITH_WORD_WRAP); -} - - -static int find_remember_sound_state_choice(void) {return(XEN_TO_C_INT_OR_ELSE(prefs_variable_get("remembering-sound-state"), 0));} -static void revert_remember_sound_state(prefs_info *prf) {remember_sound_state_choice = rts_remember_sound_state_choice;} -static void clear_remember_sound_state(prefs_info *prf) {remember_sound_state_choice = 0;} - - -static void reflect_remember_sound_state_choice(prefs_info *prf) -{ - SET_TOGGLE(prf->toggle, remember_sound_state_choice & 1); - SET_TOGGLE(prf->toggle2, remember_sound_state_choice & 2); -} - -static void save_remember_sound_state_choice(prefs_info *prf, FILE *fd) -{ - rts_remember_sound_state_choice = remember_sound_state_choice; - if (remember_sound_state_choice != 0) - { -#if HAVE_SCHEME - fprintf(fd, "(if (not (provided? 'snd-extensions.scm)) (load \"extensions.scm\"))\n"); - fprintf(fd, "(remember-sound-state %d)\n", remember_sound_state_choice); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"extensions\"\n"); - if (remember_sound_state_choice & 2) - fprintf(fd, "remember_all_sound_properties\n"); - else fprintf(fd, "remember_sound_state\n"); -#endif - -#if HAVE_FORTH - fprintf(fd, "require extensions\n"); - fprintf(fd, "%d remember-sound-state\n", remember_sound_state_choice); -#endif - } -} - +static bool rts_remember_sound_state = DEFAULT_REMEMBER_SOUND_STATE; -static void remember_sound_state_1_choice(prefs_info *prf) +static const char *help_remember_sound_state(prefs_info *prf) { - if (GET_TOGGLE(prf->toggle)) - remember_sound_state_choice |= 1; - else remember_sound_state_choice &= 2; + return("\ + This option causes Snd to save most of a sound's display \n\ + state when it is closed, and if that same sound is later re-opened, \n\ + Snd restores the previous state. This only takes effect upon restarting Snd."); } - -static void remember_sound_state_2_choice(prefs_info *prf) -{ - if (GET_TOGGLE(prf->toggle2)) - remember_sound_state_choice |= 2; - else remember_sound_state_choice &= 1; -} +static void revert_remember_sound_state(prefs_info *prf) {set_remember_sound_state(rts_remember_sound_state);} +static void clear_remember_sound_state(prefs_info *prf) {set_remember_sound_state(DEFAULT_REMEMBER_SOUND_STATE);} +static void reflect_remember_sound_state(prefs_info *prf) {SET_TOGGLE(prf->toggle, remember_sound_state(ss));} +static void save_remember_sound_state(prefs_info *prf, FILE *fd) {rts_remember_sound_state = remember_sound_state(ss);} +static void toggle_remember_sound_state(prefs_info *prf) {set_remember_sound_state(GET_TOGGLE(prf->toggle));} @@ -4277,10 +3225,9 @@ static show_axes_t rts_show_axes = DEFAULT_SHOW_AXES; static const char *show_axes_choices[NUM_SHOW_AXES] = {"none", "X and Y", "just X", "X and Y unlabelled", "just X unlabelled", "bare X"}; - static void reflect_show_axes(prefs_info *prf) {SET_TEXT(prf->text, (char *)show_axes_choices[(int)show_axes(ss)]);} -static void revert_show_axes(prefs_info *prf) {in_set_show_axes(rts_show_axes);} -static void clear_show_axes(prefs_info *prf) {in_set_show_axes(DEFAULT_SHOW_AXES);} +static void revert_show_axes(prefs_info *prf) {set_show_axes(rts_show_axes);} +static void clear_show_axes(prefs_info *prf) {set_show_axes(DEFAULT_SHOW_AXES);} static void save_show_axes(prefs_info *prf, FILE *ignore) {rts_show_axes = show_axes(ss);} @@ -4291,7 +3238,7 @@ static void show_axes_from_menu(prefs_info *prf, char *value) for (i = 0; i < NUM_SHOW_AXES; i++) if (mus_strcmp(value, show_axes_choices[i])) { - in_set_show_axes((show_axes_t)i); + set_show_axes((show_axes_t)i); SET_TEXT(prf->text, value); return; } @@ -4319,7 +3266,7 @@ static void show_axes_from_text(prefs_info *prf) break; } if (curpos >= 0) - in_set_show_axes((show_axes_t)curpos); + set_show_axes((show_axes_t)curpos); else post_prefs_error("unknown axis choice", prf); } else post_prefs_error("need an axis choice", prf); @@ -4336,10 +3283,9 @@ static x_axis_style_t rts_x_axis_style = DEFAULT_X_AXIS_STYLE; static const char *x_axis_styles[NUM_X_AXIS_STYLES] = {"seconds", "samples", "% of total", "beats", "measures", "clock"}; - static void reflect_x_axis_style(prefs_info *prf) {SET_TEXT(prf->text, (char *)x_axis_styles[(int)x_axis_style(ss)]);} -static void revert_x_axis_style(prefs_info *prf) {in_set_x_axis_style(rts_x_axis_style);} -static void clear_x_axis_style(prefs_info *prf) {in_set_x_axis_style(DEFAULT_X_AXIS_STYLE);} +static void revert_x_axis_style(prefs_info *prf) {set_x_axis_style(rts_x_axis_style);} +static void clear_x_axis_style(prefs_info *prf) {set_x_axis_style(DEFAULT_X_AXIS_STYLE);} static void save_x_axis_style(prefs_info *prf, FILE *ignore) {rts_x_axis_style = x_axis_style(ss);} @@ -4350,7 +3296,7 @@ static void x_axis_style_from_menu(prefs_info *prf, char *value) for (i = 0; i < NUM_X_AXIS_STYLES; i++) if (mus_strcmp(value, x_axis_styles[i])) { - in_set_x_axis_style((x_axis_style_t)i); + set_x_axis_style((x_axis_style_t)i); SET_TEXT(prf->text, value); return; } @@ -4378,7 +3324,7 @@ static void x_axis_style_from_text(prefs_info *prf) break; } if (curpos >= 0) - in_set_x_axis_style((x_axis_style_t)curpos); + set_x_axis_style((x_axis_style_t)curpos); else post_prefs_error("unknown axis style", prf); } else post_prefs_error("need an axis style", prf); @@ -4404,8 +3350,8 @@ static void reflect_transform_type(prefs_info *prf) } -static void revert_transform_type(prefs_info *prf) {in_set_transform_type(rts_transform_type);} -static void clear_transform_type(prefs_info *prf) {in_set_transform_type(DEFAULT_TRANSFORM_TYPE);} +static void revert_transform_type(prefs_info *prf) {set_transform_type(rts_transform_type);} +static void clear_transform_type(prefs_info *prf) {set_transform_type(DEFAULT_TRANSFORM_TYPE);} static void save_transform_type(prefs_info *prf, FILE *ignore) {rts_transform_type = transform_type(ss);} @@ -4430,7 +3376,7 @@ static void transform_type_from_menu(prefs_info *prf, char *value) for (i = 0; i < NUM_BUILTIN_TRANSFORM_TYPES; i++) if (mus_strcmp(value, transform_types[i])) { - in_set_transform_type(i); + set_transform_type(i); SET_TEXT(prf->text, value); return; } @@ -4458,7 +3404,7 @@ static void transform_type_from_text(prefs_info *prf) break; } if (curpos >= 0) - in_set_transform_type(curpos); + set_transform_type(curpos); else post_prefs_error("unknown tranform", prf); } else post_prefs_error("no transform?", prf); @@ -4474,8 +3420,8 @@ static void transform_type_from_text(prefs_info *prf) static mus_fft_window_t rts_fft_window = DEFAULT_FFT_WINDOW; static void reflect_fft_window(prefs_info *prf) {SET_TEXT(prf->text, (char *)mus_fft_window_name(fft_window(ss)));} -static void revert_fft_window(prefs_info *prf) {in_set_fft_window(rts_fft_window);} -static void clear_fft_window(prefs_info *prf) {in_set_fft_window(DEFAULT_FFT_WINDOW);} +static void revert_fft_window(prefs_info *prf) {set_fft_window(rts_fft_window);} +static void clear_fft_window(prefs_info *prf) {set_fft_window(DEFAULT_FFT_WINDOW);} static void save_fft_window(prefs_info *prf, FILE *ignore) {rts_fft_window = fft_window(ss);} static list_completer_info *fft_window_completer_info = NULL; @@ -4502,7 +3448,7 @@ static void fft_window_from_menu(prefs_info *prf, char *value) for (i = 0; i < MUS_NUM_FFT_WINDOWS; i++) if (mus_strcmp(value, mus_fft_window_name((mus_fft_window_t)i))) { - in_set_fft_window((mus_fft_window_t)i); + set_fft_window((mus_fft_window_t)i); SET_TEXT(prf->text, value); return; } @@ -4530,7 +3476,7 @@ static void fft_window_from_text(prefs_info *prf) break; } if (curpos >= 0) - in_set_fft_window((mus_fft_window_t)curpos); + set_fft_window((mus_fft_window_t)curpos); else post_prefs_error("unknown window", prf); } else post_prefs_error("no window?", prf); @@ -4567,14 +3513,14 @@ static char *colormap_completer(widget_t w, const char *text, void *data) static void reflect_colormap(prefs_info *prf) {SET_TEXT(prf->text, colormap_name(color_map(ss)));} -static void clear_colormap(prefs_info *prf) {in_set_color_map(DEFAULT_COLOR_MAP);} +static void clear_colormap(prefs_info *prf) {set_color_map(DEFAULT_COLOR_MAP);} static void save_colormap(prefs_info *prf, FILE *ignore) {rts_colormap = color_map(ss);} static void revert_colormap(prefs_info *prf) { if (!(is_colormap(rts_colormap))) rts_colormap = DEFAULT_COLOR_MAP; - in_set_color_map(rts_colormap); + set_color_map(rts_colormap); } @@ -4600,7 +3546,7 @@ static void colormap_from_text(prefs_info *prf) break; } if (is_colormap(curpos)) - in_set_color_map(curpos); + set_color_map(curpos); else post_prefs_error("unknown colormap", prf); } else post_prefs_error("no colormap?", prf); @@ -4618,7 +3564,7 @@ static void colormap_from_menu(prefs_info *prf, char *value) for (i = 0; i < len; i++) if (mus_strcmp(value, colormap_name(i))) { - in_set_color_map(i); + set_color_map(i); SET_TEXT(prf->text, value); return; } @@ -4632,14 +3578,15 @@ static void colormap_from_menu(prefs_info *prf, char *value) static bool include_peak_envs = false, rts_peak_envs = false; static char *include_peak_env_directory = NULL, *rts_peak_env_directory = NULL; -static void help_peak_envs(prefs_info *prf) +static const char *help_peak_envs(prefs_info *prf) { - snd_help(prf->var_name, - "When a very large file is first opened, Snd scans all the data to build up an overall \ -representation of the sound. If you like to view the entire sound upon opening it, you can speed \ -up the process a lot by saving this initial representation. The data is called a 'peak-env' file \ -and it resides in the 'peak-env-dir'.", - WITH_WORD_WRAP); + return("\ + When a very large file is first opened, Snd scans \n\ + all the data to build up an overall representation of \n\ + the sound. If you like to view the entire sound upon \n\ + opening it, you can speed up the process a lot by saving \n\ + this initial representation. The data is called a 'peak-env' file \n\ + and it resides in the 'peak-env-dir'."); } @@ -4704,15 +3651,19 @@ static void peak_envs_text(prefs_info *prf) static char *rts_load_path = NULL; -static void help_load_path(prefs_info *prf) +static const char *help_load_path(prefs_info *prf) { - char *hlp, *temp = NULL; - hlp = mus_format("Much of Snd's functionality is loaded as needed from the Scheme, Ruby, or Forth \ -files found in the Snd tarball. You can run Snd without \ -these files, but there's no reason to! Just add the directory containing \ -them to the load path variable%s. " XEN_LANGUAGE_NAME " searches these \ -directories for any *." XEN_FILE_EXTENSION " files that it can't \ -find elsewhere. The current load path list is: \n\n%s\n", + static char *hlp = NULL; + char *temp = NULL; + if (hlp) free(hlp); + + hlp = mus_format("Much of Snd's functionality is loaded as needed \n\ +from the Scheme, Ruby, or Forth files found in the Snd tarball. \n\ +You can run Snd without these files, but there's no reason to! \n\ +Just add the directory containing them to the load path \n\ +variable %s. " XEN_LANGUAGE_NAME " searches these directories \n\ +for any *." XEN_FILE_EXTENSION " files that it can't find elsewhere. \n\ +The current load path list is: \n\n%s\n", #if HAVE_RUBY ", $LOAD_PATH", #else @@ -4723,15 +3674,14 @@ find elsewhere. The current load path list is: \n\n%s\n", #endif #endif temp = (char *)XEN_AS_STRING(XEN_LOAD_PATH)); - snd_help("load paths", hlp, WITH_WORD_WRAP); #if HAVE_SCHEME if (temp) free(temp); #endif - free(hlp); + return(hlp); } -static char *find_sources(void) /* returns full filename if found else null */ +static char *find_sources(void) /* returns directory name where it finds extensions.* */ { char *file = NULL; #define BASE_FILE "extensions." XEN_FILE_EXTENSION @@ -4758,22 +3708,17 @@ static char *find_sources(void) /* returns full filename if found else null */ file = fname; break; } - free(fname); } } #endif #if HAVE_RUBY - #if RB_FIND_FILE_TAKES_VALUE { XEN xfile; xfile = rb_find_file(C_TO_XEN_STRING(BASE_FILE)); if (XEN_STRING_P(xfile)) file = mus_expand_filename(XEN_TO_C_STRING(xfile)); } - #else - file = mus_expand_filename(rb_find_file(BASE_FILE)); - #endif #endif #if HAVE_FORTH @@ -4797,7 +3742,6 @@ static char *find_sources(void) /* returns full filename if found else null */ file = fname; break; } - free(fname); } } #endif @@ -4866,79 +3810,27 @@ static void load_path_text(prefs_info *prf) /* ---------------- initial bounds ---------------- */ -static mus_float_t rts_initial_beg = 0.0, rts_initial_dur = 0.1; -static bool rts_full_duration = false; -static bool include_duration = false; - -static bool full_duration(void) -{ - return(XEN_TO_C_BOOLEAN(prefs_variable_get("prefs-show-full-duration"))); -} - - -static mus_float_t initial_beg(void) -{ - return(XEN_TO_C_DOUBLE_OR_ELSE(prefs_variable_get("prefs-initial-beg"), 0.0)); -} - - -static mus_float_t initial_dur(void) -{ - return(XEN_TO_C_DOUBLE_OR_ELSE(prefs_variable_get("prefs-initial-dur"), 0.1)); -} - +static mus_float_t rts_initial_beg = DEFAULT_INITIAL_BEG, rts_initial_dur = DEFAULT_INITIAL_DUR; +static bool rts_full_duration = DEFAULT_SHOW_FULL_DURATION; -static void help_initial_bounds(prefs_info *prf) +static const char *help_initial_bounds(prefs_info *prf) { - snd_help(prf->var_name, - "Normally Snd displays just the first 0.1 seconds of a sound in its initial graph. This option \ -sets either new bounds for that display, or directs Snd to display the entire sound.", - WITH_WORD_WRAP); + return("\ + Normally Snd displays just the first 0.1 seconds of a \n\ + sound in its initial graph. This option sets either new \n\ + bounds for that display, or directs Snd to display the entire sound."); } static char *initial_bounds_to_string(void) { - return(mus_format("%.2f : %.2f", initial_beg(), initial_dur())); + return(mus_format("%.2f : %.2f", initial_beg(ss), initial_dur(ss))); } static void save_initial_bounds(prefs_info *prf, FILE *fd) { - char *str; rts_full_duration = GET_TOGGLE(prf->toggle); - str = GET_TEXT(prf->text); - if (str) - { - float a = 0.0, b = 0.0; - sscanf(str, "%f : %f", &a, &b); /* these can be doubles -- need conversion to fit all cases */ - rts_initial_beg = (mus_float_t)a; - rts_initial_dur = (mus_float_t)b; - free_TEXT(str); - } - else - { - rts_initial_beg = 0.0; - rts_initial_dur = 0.1; - } - if (include_duration) - { -#if HAVE_SCHEME - fprintf(fd, "(if (not (provided? 'snd-extensions.scm)) (load \"extensions.scm\"))\n"); - fprintf(fd, "(prefs-activate-initial-bounds %.2f %.2f %s)\n", rts_initial_beg, rts_initial_dur, (rts_full_duration) ? "#t" : "#f"); -#endif - -#if HAVE_RUBY - fprintf(fd, "require \"extensions\"\n"); - fprintf(fd, "prefs_activate_initial_bounds(%.2f, %.2f, %s)\n", rts_initial_beg, rts_initial_dur, (rts_full_duration) ? "true" : "false"); - -#endif - -#if HAVE_FORTH - fprintf(fd, "require extensions\n"); - fprintf(fd, "%.2f %.2f %s prefs-activate-initial-bounds\n", rts_initial_beg, rts_initial_dur, (rts_full_duration) ? "true" : "false"); -#endif - } } @@ -4949,32 +3841,29 @@ static void reflect_initial_bounds(prefs_info *prf) str = initial_bounds_to_string(); SET_TEXT(prf->text, str); free(str); - SET_TOGGLE(prf->toggle, full_duration()); + SET_TOGGLE(prf->toggle, show_full_duration(ss)); } static void revert_initial_bounds(prefs_info *prf) { - prefs_variable_set("prefs-initial-beg", C_TO_XEN_DOUBLE(rts_initial_beg)); - prefs_variable_set("prefs-initial-dur", C_TO_XEN_DOUBLE(rts_initial_dur)); - prefs_variable_set("prefs-show-full-duration", C_TO_XEN_BOOLEAN(rts_full_duration)); + set_initial_beg(rts_initial_beg); + set_initial_dur(rts_initial_dur); + set_show_full_duration(rts_full_duration); } static void clear_initial_bounds(prefs_info *prf) { - prefs_variable_set("prefs-initial-beg", C_TO_XEN_DOUBLE(0.0)); - prefs_variable_set("prefs-initial-dur", C_TO_XEN_DOUBLE(0.1)); - prefs_variable_set("prefs-show-full-duration", XEN_FALSE); + set_initial_beg(DEFAULT_INITIAL_BEG); + set_initial_dur(DEFAULT_INITIAL_DUR); + set_show_full_duration(DEFAULT_SHOW_FULL_DURATION); } static void initial_bounds_toggle(prefs_info *prf) { - include_duration = true; - if (!(XEN_DEFINED_P("prefs-show-full-duration"))) - load_file_with_path_and_extension("extensions"); - prefs_variable_set("prefs-show-full-duration", C_TO_XEN_BOOLEAN(GET_TOGGLE(prf->toggle))); + set_show_full_duration(GET_TOGGLE(prf->toggle)); } @@ -4982,15 +3871,11 @@ static void initial_bounds_text(prefs_info *prf) { float beg = 0.0, dur = 0.1; char *str; - include_duration = true; str = GET_TEXT(prf->text); sscanf(str, "%f : %f", &beg, &dur); - if (!(XEN_DEFINED_P("prefs-initial-beg"))) - load_file_with_path_and_extension("extensions"); - - prefs_variable_set("prefs-initial-beg", C_TO_XEN_DOUBLE(beg)); - prefs_variable_set("prefs-initial-dur", C_TO_XEN_DOUBLE(dur)); + set_initial_beg(beg); + set_initial_dur(dur); free_TEXT(str); } @@ -5070,13 +3955,9 @@ static void clear_key(prefs_info *prf, const char *name) /* -------- key: play all chans from cursor -------- */ -static void help_play_from_cursor(prefs_info *prf) +static const char *help_play_from_cursor(prefs_info *prf) { - snd_help("play from cursor", - "By default, C-q plays the current channel from the cursor, but one often wants to play the entire \ -sound; this option binds a key for that purpose, and also overrides the pause setting. The new binding does \ -not take effect until you type return in the text widget.", - WITH_WORD_WRAP); + return(" This option binds a key to play the entire sound. "); } @@ -5133,12 +4014,12 @@ static void clear_play_from_cursor(prefs_info *prf) /* -------- key: show all of sound -------- */ -static void help_show_all(prefs_info *prf) +static const char *help_show_all(prefs_info *prf) { - snd_help("show entire sound", - "This option binds a key to show all of the current sound in the current time domain window, \ -equivalent to moving the 'zoom' slider all the way to the right.", - WITH_WORD_WRAP); + return("\ + This option binds a key to show all of the current sound \n\ + in the current time domain window, equivalent to moving the \n\ + 'zoom' slider all the way to the right."); } @@ -5147,7 +4028,7 @@ static char *make_show_all_binding(char *key, bool ctrl, bool meta, bool cx) #if HAVE_SCHEME return(mus_format("(bind-key %s %d (lambda () \ (let ((old-sync (sync))) \ - (set! (sync) (1+ (max-sync))) \ + (set! (sync) (1+ (sync-max))) \ (set! (x-bounds) (list 0.0 (/ (frames) (srate)))) \ (set! (sync) old-sync))) %s \"show entire sound\" \"show-all\")\n", possibly_quote(key), @@ -5204,12 +4085,12 @@ static void clear_show_all(prefs_info *prf) /* -------- key: select all of sound -------- */ -static void help_select_all(prefs_info *prf) +static const char *help_select_all(prefs_info *prf) { - snd_help("select entire sound", - "This option binds a key to select all of the current sound. The 'Select all' Edit menu item \ -follows the 'sync' buttons when deciding which channels to select.", - WITH_WORD_WRAP); + return("\ + This option binds a key to select all of the current sound. \n\ + The 'Select all' Edit menu item follows the 'sync' buttons when \n\ + deciding which channels to select."); } @@ -5218,7 +4099,7 @@ static char *make_select_all_binding(char *key, bool ctrl, bool meta, bool cx) #if HAVE_SCHEME return(mus_format("(bind-key %s %d (lambda () \ (let ((old-sync (sync))) \ - (set! (sync) (1+ (max-sync))) \ + (set! (sync) (1+ (sync-max))) \ (select-all) \ (set! (sync) old-sync))) %s \"select entire sound\" \"select-all\")\n", possibly_quote(key), @@ -5275,11 +4156,11 @@ static void clear_select_all(prefs_info *prf) /* -------- key: undo all edits -------- */ -static void help_revert(prefs_info *prf) +static const char *help_revert(prefs_info *prf) { - snd_help("undo all edits (revert)", - "This option binds a key to undo any edits in the current sound, equivalent to the File:Revert menu item.", - WITH_WORD_WRAP); + return("\ + This option binds a key to undo any edits in the current sound, \n\ + equivalent to the File:Revert menu item."); } @@ -5336,11 +4217,11 @@ static void clear_revert_sound(prefs_info *prf) /* -------- key: exit -------- */ -static void help_exit(prefs_info *prf) +static const char *help_exit(prefs_info *prf) { - snd_help("exit from Snd", - "This option binds a key to exit from Snd, equivalent to the File:Exit menu item.", - WITH_WORD_WRAP); + return("\ + This option binds a key to exit from Snd, \n\ + equivalent to the File:Exit menu item."); } @@ -5397,11 +4278,11 @@ static void clear_exit(prefs_info *prf) /* -------- key: goto maxamp -------- */ -static void help_goto_maxamp(prefs_info *prf) +static const char *help_goto_maxamp(prefs_info *prf) { - snd_help("go to maxamp", - "This option binds a key to move the view (and cursor) to the position of the current channel's maximum sample.", - WITH_WORD_WRAP); + return("\ + This option binds a key to move the view (and cursor) to the \n\ + position of the current channel's maximum sample."); } @@ -5458,32 +4339,32 @@ static void clear_goto_maxamp(prefs_info *prf) /* -------- key: show selection -------- */ -static void help_show_selection(prefs_info *prf) +static const char *help_show_selection(prefs_info *prf) { - snd_help("show selection", - "This option binds a key to cause the current selection to fill the time domain graph.", - WITH_WORD_WRAP); + return("\ + This option binds a key to cause the current selection to \n\ + fill the time domain graph."); } static char *make_show_selection_binding(char *key, bool ctrl, bool meta, bool cx) { #if HAVE_SCHEME - return(mus_format("(if (not (provided? 'snd-selection.scm)) (load \"selection.scm\"))\n\(bind-key %s %d show-selection %s \"show selection\" \"show-selection\")\n", + return(mus_format("(bind-key %s %d show-selection %s \"show selection\" \"show-selection\")\n", possibly_quote(key), ((ctrl) ? 4 : 0) + ((meta) ? 8 : 0), (cx) ? "#t" : "#f")); #endif #if HAVE_RUBY - return(mus_format("require \"extensions\"\nbind_key(%s, %d, lambda do\n show_selection()\n end, %s, \"show selection\", \"show-selection\")\n", + return(mus_format("bind_key(%s, %d, lambda do\n show_selection()\n end, %s, \"show selection\", \"show-selection\")\n", possibly_quote(key), ((ctrl) ? 4 : 0) + ((meta) ? 8 : 0), (cx) ? "true" : "false")); #endif #if HAVE_FORTH - return(mus_format("require extensions\n%s %d ' show-selection %s \"show selection\" \"show-selection\" bind-key drop\n", + return(mus_format("%s %d ' show-selection %s \"show selection\" \"show-selection\" bind-key drop\n", possibly_quote(key), ((ctrl) ? 4 : 0) + ((meta) ? 8 : 0), (cx) ? "#t" : "#f")); @@ -5514,3 +4395,423 @@ static void clear_show_selection(prefs_info *prf) { clear_key(prf, "show-selection"); } + +static const char *help_show_controls(prefs_info *prf) +{ + return("\ + The control panel is the set of playback controls \n\ + under the sound graphs. It is normally hidden. "); +} + +static const char *help_selection_creates_region(prefs_info *prf) +{ + return("\ + This determines whether a region is created whenever \n\ + you make a selection. "); +} + +static const char *help_just_sounds(prefs_info *prf) +{ + return("\ + The various file dialogs can restrict the files \n\ + displayed to just sound files. "); +} + +static const char *help_temp_dir(prefs_info *prf) +{ + return("\ + Snd sometimes needs a place to write a temporary \n\ + file. This is the directory to use. "); +} + +static const char *help_save_dir(prefs_info *prf) +{ + return("\ + When you choose the Options: Save state item, \n\ + the saved settings are placed in a file in this directory. "); +} + +static const char *help_save_state_file(prefs_info *prf) +{ + return("\ + When you choose Options: Save state, the state \n\ + is saved in this file, in the save directory. "); +} + +static const char *help_html_program(prefs_info *prf) +{ + return("\ + The help dialog has links to the Snd documentation, \n\ + and this option gives the name of the HTML viewer to use. "); +} + +static const char *help_default_output_chans(prefs_info *prf) +{ + return("\ + This sets the default number of output channels \n\ + when a new sound is started. "); +} + +static const char *help_default_output_srate(prefs_info *prf) +{ + return("\ + This sets the default sampling rate when a new \n\ + sound is opened. "); +} + +static const char *help_default_output_header_type(prefs_info *prf) +{ + return("\ + This sets the default output header type (AIFC, etc) \n\ + when a new sound is opened. "); +} + +static const char *help_default_output_data_format(prefs_info *prf) +{ + return("\ + This sets the default data format (big-endian float, etc) \n\ + when a new sound is opened. "); +} + +static const char *help_verbose_cursor(prefs_info *prf) +{ + return("\ + If this is set, the cursor's position and the underlying \n\ + sample's value are displayed in the minibuffer as the cursor moves. "); +} + +static const char *help_with_tracking_cursor(prefs_info *prf) +{ + return("\ + If this is set, the cursor always tries to show where the playback \n\ + is in the sound as it is played. It is only an approximation. "); +} + +static const char *help_cursor_size(prefs_info *prf) +{ + return(" This sets the cursor size in pixels. "); +} + +static const char *help_cursor_style(prefs_info *prf) +{ + return(" This sets the cursor shape. "); +} + +static const char *help_tracking_cursor_style(prefs_info *prf) +{ + return(" This sets the tracking cursor shape. "); +} + +static const char *help_cursor_color(prefs_info *prf) +{ + return(" This is the cursor color. "); +} + +static const char *help_basic_color(prefs_info *prf) +{ + return(" This is the main background color used throughout Snd. "); +} + +static const char *help_highlight_color(prefs_info *prf) +{ + return(" This color is used for highlighted items. "); +} + +static const char *help_position_color(prefs_info *prf) +{ + return(" This is the color of the position-related sliders. "); +} + +static const char *help_zoom_color(prefs_info *prf) +{ + return(" This is the color of the zoom-related sliders. "); +} + +static const char *help_graph_style(prefs_info *prf) +{ + return("\ + This sets how sound data is displayed. Normally samples \n\ + are joined by lines, but you can also display them as isolated \n\ + dots, or as filled polygons, or as dots-on-stilts, as in the DSP \n\ + textbooks. "); +} + +static const char *help_dot_size(prefs_info *prf) +{ + return("\ + If the graph style uses dots, this sets the dot size. "); +} + +static const char *help_channel_style(prefs_info *prf) +{ + return("\ + When a sound has more than one channel, this chooses how \n\ + to lay them out: in separate windows, combined in one window \n\ + or superimposed on each other in a single graph. "); +} + +static const char *help_graphs_horizontal(prefs_info *prf) +{ + return("\ + This chooses whether sounds are layed out horizontally or vertically. "); +} + +static const char *help_show_y_zero(prefs_info *prf) +{ + return("\ + If this is set, each channel graph includes a line at y=0. "); +} + +static const char *help_show_grid(prefs_info *prf) +{ + return("\ + If this option is set, each channel graph has a grid, sort \n\ + of like engineering graph paper. "); +} + +static const char *help_grid_density(prefs_info *prf) +{ + return("\ + If grids are in use, this sets how close the lines are. "); +} + +static const char *help_show_axes(prefs_info *prf) +{ + return(" This chooses which axes to display. "); +} + +static const char *help_x_axis_style(prefs_info *prf) +{ + return(" This sets the x axis labelling. "); +} + +static const char *help_data_color(prefs_info *prf) +{ + return(" This is the waveform color in unselected graphs. "); +} + +static const char *help_graph_color(prefs_info *prf) +{ + return(" This is the background color in unselected graphs. "); +} + +static const char *help_selected_data_color(prefs_info *prf) +{ + return(" This is the waveform color in a selected graph. "); +} + +static const char *help_selected_graph_color(prefs_info *prf) +{ + return(" This is the background color in a selected graph. "); +} + +static const char *help_selection_color(prefs_info *prf) +{ + return(" This is the color used to show the current selection. "); +} + +static const char *help_axis_label_font(prefs_info *prf) +{ + return(" This is a font used to label axes. "); +} + +static const char *help_axis_numbers_font(prefs_info *prf) +{ + return(" This is the font used for axis numbers. "); +} + +static const char *help_peaks_font(prefs_info *prf) +{ + return(" This is the font used in the FFT peaks listing. "); +} + +static const char *help_bold_peaks_font(prefs_info *prf) +{ + return("\ + This is the font used in the FFT peaks list\n\ + to show a major peak. "); +} + +static const char *help_transform_graph_type(prefs_info *prf) +{ + return("\ + FFT results can be displayed as a waveform, a sonogram, \n\ + or a spectrogram. "); +} + +static const char *help_transform_type(prefs_info *prf) +{ + return("\ + This chooses the kind of transform displayed \n\ + in the fft graph. "); +} + +static const char *help_fft_window(prefs_info *prf) +{ + return(" This sets the fft data window. "); +} + +static const char *help_fft_window_beta(prefs_info *prf) +{ + return(" If the FFT window has an associated parameter, this sets it. "); +} + +static const char *help_colormap(prefs_info *prf) +{ + return(" If the FFT is being displayed as a sonogram or spectrogram,\n\ + this sets the colormap to use. "); +} + +static const char *help_fft_log_magnitude(prefs_info *prf) +{ + return(" If this option is set, the FFTs show the magnitude axis on a log scale. "); +} + +static const char *help_min_dB(prefs_info *prf) +{ + return("\ + If the FFT graphs are using a dB scale, this sets the\n\ + minimum dB value displayed. "); +} + +static const char *help_fft_log_frequency(prefs_info *prf) +{ + return(" If this is set, FFTs show the frequency axis on a log scale. "); +} + +static const char *help_transform_normalization(prefs_info *prf) +{ + return(" This chooses whether FFT data is normalized before display. "); +} + +static const char *help_mark_color(prefs_info *prf) +{ + return(" This is the mark color. "); +} + +static const char *help_mix_color(prefs_info *prf) +{ + return(" This is the color of the mix handle. "); +} + +static const char *help_sinc_width(prefs_info *prf) +{ + return("\ + If sampling rate conversion is needed, this sets \n\ + the width of the sinc used for low-pass filtering. "); +} + +static const char *help_show_listener(prefs_info *prf) +{ + return(" This option chooses whether to include the listener window. "); +} + +static const char *help_listener_prompt(prefs_info *prf) +{ + return(" This is the prompt displayed in the listener window. "); +} + +static const char *help_print_length(prefs_info *prf) +{ + return("\ + When a vector is printed in the listener, this sets\n\ + the maximum number of values displayed. "); +} + +static const char *help_listener_font(prefs_info *prf) +{ + return(" This is the font used in the listener. "); +} + +static const char *help_listener_color(prefs_info *prf) +{ + return(" This is the background color of the listener. "); +} + +static const char *help_dac_size(prefs_info *prf) +{ + return(" This is the DAC buffer size. "); +} + +static const char *help_dac_combines_channels(prefs_info *prf) +{ + return("\ + If the DAC has fewer output channels than the sound you\n\ + want to play, and this option is set, then the extra \n\ + channels are mixed into the existing ones. "); +} + + +static const char *help_view_files_directory(prefs_info *prf) +{ + return(" This directory is added to the View:files dialog's list. "); +} + +static const char *help_raw_chans(prefs_info *prf) +{ + return("\ + When a raw (no header) sound is opened, this sets the \n\ + default number of channels. "); +} + +static const char *help_raw_srate(prefs_info *prf) +{ + return("\ + When a raw (no header) sound is opened, this sets the \n\ + default sampling rate. "); +} + +static const char *help_raw_data_format(prefs_info *prf) +{ + return("\ + When a raw (no header) sound is opened, this sets the \n\ + default data format. "); +} + +static const char *help_tiny_font(prefs_info *prf) +{ + return(" When space is tight, Snd uses this font. "); +} + +static const char *help_fft_size(prefs_info *prf) +{ + return(" This is the default FFT size. "); +} + +static const char *help_transform_peaks(prefs_info *prf) +{ + return(" If this is set, FFTs include peak listings. "); +} + +static const char *help_mark_tag_size(prefs_info *prf) +{ + return(" This is the size of the upper tag on a mark. "); +} + +static const char *help_mix_tag_size(prefs_info *prf) +{ + return(" This sets the mix tag size. "); +} + +static const char *help_mix_waveforms(prefs_info *prf) +{ + return(" If this is set, mixes display their waveforms. "); +} + +static const char *help_speed_control(prefs_info *prf) +{ + return("\ + This chooses how the speed control in the control panel\n\ + divides up the speeds; as a continuous scale, by simple ratios, etc. "); +} + +static const char *help_listener_text_color(prefs_info *prf) +{ + return(" This is the listener text color. "); +} + +static const char *help_init_window_size(prefs_info *prf) +{ + return(" This sets Snd's size when it first comes up. "); +} + |