ref: 795097f6f622e9b49a43620b4fffa151acc63a97
parent: c9fd5c81fc1381bba13de4954b07811b018ad0c9
author: cancel <cancel@cancel.fm>
date: Fri Jan 24 00:44:14 EST 2020
Clean up control flow for grid initialization
--- a/tui_main.c
+++ b/tui_main.c
@@ -3257,7 +3257,7 @@
int init_bpm = 120;
int init_seed = 1;
int init_grid_dim_y = 25, init_grid_dim_x = 57;
- bool should_autosize_grid = true;
+ bool explicit_initial_grid_size = false;
Tui t = {.file_name = NULL}; // Weird because of clang warning
t.undo_history_limit = 100;
@@ -3337,7 +3337,6 @@
break;
}
case Argopt_init_grid_size: {
- should_autosize_grid = false;
enum {
Max_dim_arg_val_y = ORCA_Y_MAX,
Max_dim_arg_val_x = ORCA_X_MAX,
@@ -3358,6 +3357,7 @@
Max_dim_arg_val_y, init_grid_dim_y);
exit(1);
}
+ explicit_initial_grid_size = true;
break;
}
case Argopt_osc_midi_bidule:
@@ -3387,7 +3387,6 @@
}
if (optind == argc - 1) {
- should_autosize_grid = false;
osoput(&t.file_name, argv[optind]);
} else if (optind < argc - 1) {
fprintf(stderr, "Expected only 1 file argument.\n");
@@ -3397,36 +3396,7 @@
qnav_init();
ged_init(&t.ged, (Usz)t.undo_history_limit, (Usz)init_bpm, (Usz)init_seed);
- if (osolen(t.file_name)) {
- Field_load_error fle = field_load_file(osoc(t.file_name), &t.ged.field);
- if (fle != Field_load_error_ok) {
- char const *errstr = field_load_error_string(fle);
- fprintf(stderr, "File load error: %s.\n", errstr);
- ged_deinit(&t.ged);
- qnav_deinit();
- osofree(t.file_name);
- exit(1);
- }
- mbuf_reusable_ensure_size(&t.ged.mbuf_r, t.ged.field.height,
- t.ged.field.width);
- } else {
- // Temp hacky stuff: we've crammed two code paths into the KEY_RESIZE event
- // case. One of them is for the initial setup for an automatic grid size.
- // The other is for actual resize events. We will factor this out into
- // procedures in the future, but until then, we've made a slight mess. In
- // the case where the user has explicitly specified a size, we'll allocate
- // the Field stuff here. If there's an automatic size, then we'll allocate
- // the field in the KEY_RESIZE handler. The reason we don't just allocate
- // it here and then again later is to avoid an extra allocation and memory
- // manipulation.
- if (!should_autosize_grid) {
- field_init_fill(&t.ged.field, (Usz)init_grid_dim_y, (Usz)init_grid_dim_x,
- '.');
- mbuf_reusable_ensure_size(&t.ged.mbuf_r, t.ged.field.height,
- t.ged.field.width);
- }
- }
- ged_set_midi_mode(&t.ged, &t.midi_mode);
+ ged_set_midi_mode(&t.ged, &t.midi_mode); // dumb
// Set up timer lib
stm_setup();
@@ -3482,20 +3452,42 @@
tui_adjust_term_size(&t, &cont_window);
+ bool grid_initialized = false;
+ if (osolen(t.file_name)) {
+ Field_load_error fle = field_load_file(osoc(t.file_name), &t.ged.field);
+ switch (fle) {
+ case Field_load_error_ok:
+ grid_initialized = true;
+ break;
+ case Field_load_error_cant_open_file: {
+ // Probably a new file, though TODO we should add an explicit
+ // differentiation between "file exists and can't open it" and "file
+ // doesn't seem to exist."
+ Qmsg *qm = qmsg_printf_push(NULL, "New file: %s", osoc(t.file_name));
+ qmsg_set_dismiss_mode(qm, Qmsg_dismiss_mode_passthrough);
+ break;
+ }
+ default:
+ qmsg_printf_push("File Load Error", "File load error:\n%s.",
+ field_load_error_string(fle));
+ break;
+ }
+ }
// If we haven't yet initialized the grid, because we were waiting for the
// terminal size, do it now.
- if (should_autosize_grid) {
+ if (!grid_initialized) {
Usz new_field_h, new_field_w;
- if (!tui_suggest_nice_grid_size(&t, t.ged.win_h, t.ged.win_w, &new_field_h,
+ if (explicit_initial_grid_size ||
+ !tui_suggest_nice_grid_size(&t, t.ged.win_h, t.ged.win_w, &new_field_h,
&new_field_w)) {
new_field_h = (Usz)init_grid_dim_y;
new_field_w = (Usz)init_grid_dim_x;
}
field_init_fill(&t.ged.field, (Usz)new_field_h, (Usz)new_field_w, '.');
- mbuf_reusable_ensure_size(&t.ged.mbuf_r, t.ged.field.height,
- t.ged.field.width);
- ged_make_cursor_visible(&t.ged);
}
+ mbuf_reusable_ensure_size(&t.ged.mbuf_r, t.ged.field.height,
+ t.ged.field.width);
+ ged_make_cursor_visible(&t.ged);
// Send initial BPM
send_num_message(t.ged.oosc_dev, "/orca/bpm", (I32)t.ged.bpm);
// Enter main loop. Process events as they arrive.