diff --git a/tui_main.c b/tui_main.c index b5b55f0..f3f7754 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1938,7 +1938,6 @@ void push_main_menu(void) { qmenu_add_spacer(qm); #ifdef FEAT_PORTMIDI qmenu_add_choice(qm, Main_menu_choose_portmidi_output, "MIDI Output..."); - qmenu_add_spacer(qm); #endif qmenu_add_choice(qm, Main_menu_cosmetics, "Appearance..."); qmenu_add_choice(qm, Main_menu_controls, "Controls..."); @@ -2362,6 +2361,8 @@ void try_send_to_gui_clipboard(Ged const *a, bool *io_use_gui_clipboard) { typedef struct { oso *portmidi_output_device; + int softmargin_y, softmargin_x; + bool has_softmargins : 1; } Prefs; void prefs_init(Prefs *p) { memset(p, 0, sizeof(Prefs)); } @@ -2372,6 +2373,7 @@ typedef enum { } Prefs_load_error; static char const *confkey_portmidi_output_device = "portmidi_output_device"; +static char const *confkey_margins = "margins"; ORCA_FORCE_NO_INLINE Prefs_load_error prefs_load_from_conf_file(Prefs *p) { @@ -2390,6 +2392,14 @@ Prefs_load_error prefs_load_from_conf_file(Prefs *p) { case Conf_read_left_and_right: { if (strcmp(confkey_portmidi_output_device, left) == 0) { osoput(&p->portmidi_output_device, right); + } else if (strcmp(confkey_margins, left) == 0) { + int softmargin_y, softmargin_x; + if (read_nxn_or_n(right, &softmargin_x, &softmargin_y) && + softmargin_y >= 0 && softmargin_x >= 0) { + p->softmargin_y = softmargin_y; + p->softmargin_x = softmargin_x; + p->has_softmargins = true; + } } continue; } @@ -2430,7 +2440,9 @@ typedef enum { Prefs_save_unknown_error, } Prefs_save_error; -Prefs_save_error save_prefs_to_disk(Midi_mode const *midi_mode) { +Prefs_save_error save_prefs_to_disk(Midi_mode const *midi_mode, + int softmargin_y, int softmargin_x, + bool softmargins_touched_by_user) { Conf_save save; Conf_save_start_error starterr = conf_save_start(&save); switch (starterr) { @@ -2458,6 +2470,7 @@ Prefs_save_error save_prefs_to_disk(Midi_mode const *midi_mode) { Midi_output_pref_portmidi, #endif } midi_output_pref = Midi_output_pref_none; + bool needs_write_margins = softmargins_touched_by_user; Prefs_save_error error; oso *midi_output_device_name = NULL; switch (midi_mode->any.type) { @@ -2501,6 +2514,14 @@ Prefs_save_error save_prefs_to_disk(Midi_mode const *midi_mode) { continue; } #endif + if (strcmp(confkey_margins, left) == 0) { + if (!needs_write_margins) + continue; + needs_write_margins = false; + fprintf(save.tempfile, "%s = %dx%d\n", confkey_margins, softmargin_x, + softmargin_y); + continue; + } put_conf_pair(save.tempfile, left, right); continue; case Conf_read_irrelevant: @@ -2529,6 +2550,11 @@ done_reading_existing: break; #endif } + if (needs_write_margins) { + needs_write_margins = false; + fprintf(save.tempfile, "%s = %dx%d\n", confkey_margins, softmargin_x, + softmargin_y); // TODO redundant + } need_cancel_save = false; Conf_save_commit_error comerr = conf_save_commit(&save); error = Prefs_save_unknown_error; @@ -2553,8 +2579,11 @@ cleanup: return error; } -void save_prefs_with_error_message(Midi_mode const *midi_mode) { - Prefs_save_error err = save_prefs_to_disk(midi_mode); +void save_prefs_with_error_message(Midi_mode const *midi_mode, int softmargin_y, + int softmargin_x, + bool softmargins_touched_by_user) { + Prefs_save_error err = save_prefs_to_disk( + midi_mode, softmargin_y, softmargin_x, softmargins_touched_by_user); char const *msg = "Unknown"; switch (err) { case Prefs_save_ok: @@ -2662,6 +2691,7 @@ int main(int argc, char **argv) { int init_grid_dim_y = 25; int init_grid_dim_x = 57; bool use_gui_cboard = true; + bool softmargins_touched_by_user = false; Midi_mode midi_mode; midi_mode_init_null(&midi_mode); int softmargin_y = 1, softmargin_x = 2; @@ -2889,6 +2919,11 @@ int main(int argc, char **argv) { prefs_init(&prefs); Prefs_load_error prefserr = prefs_load_from_conf_file(&prefs); if (prefserr == Prefs_load_ok) { + if (prefs.has_softmargins) { + softmargins_touched_by_user = true; + softmargin_y = prefs.softmargin_y; + softmargin_x = prefs.softmargin_x; + } #ifdef FEAT_PORTMIDI if (midi_mode.any.type == Midi_mode_type_null && osolen(prefs.portmidi_output_device)) { @@ -3287,7 +3322,9 @@ int main(int argc, char **argv) { "Error setting PortMidi output device:\n%s", Pm_GetErrorText(pme)); } else { - save_prefs_with_error_message(&midi_mode); + save_prefs_with_error_message(&midi_mode, softmargin_y, + softmargin_x, + softmargins_touched_by_user); } } break; #endif @@ -3391,14 +3428,23 @@ int main(int argc, char **argv) { oso *tmpstr = NULL; if (qform_get_text_line(qf, Soft_margins_text_line_id, &tmpstr) && osolen(tmpstr) > 0) { + bool do_save = false; int newy, newx; - if (sscanf(osoc(tmpstr), "%dx%d", &newx, &newy) == 2 && - newy >= 0 && newx >= 0) { + if (read_nxn_or_n(osoc(tmpstr), &newx, &newy) && newy >= 0 && + newx >= 0 && + (newy != softmargin_y || newx != softmargin_x)) { + softmargins_touched_by_user = true; softmargin_y = newy; softmargin_x = newx; ungetch(KEY_RESIZE); // kinda lame but whatever + do_save = true; } qnav_stack_pop(); + // Might push message, so gotta pop old guy first + if (do_save) + save_prefs_with_error_message(&midi_mode, softmargin_y, + softmargin_x, + softmargins_touched_by_user); } osofree(tmpstr); } break;