|
@ -520,7 +520,8 @@ void app_draw(App_state* a, WINDOW* win) { |
|
|
field_resize_raw_if_necessary(&a->scratch_field, a->field.height, |
|
|
field_resize_raw_if_necessary(&a->scratch_field, a->field.height, |
|
|
a->field.width); |
|
|
a->field.width); |
|
|
field_copy(&a->field, &a->scratch_field); |
|
|
field_copy(&a->field, &a->scratch_field); |
|
|
markmap_reusable_ensure_size(&a->markmap_r, a->field.height, a->field.width); |
|
|
markmap_reusable_ensure_size(&a->markmap_r, a->field.height, |
|
|
|
|
|
a->field.width); |
|
|
orca_run(a->scratch_field.buffer, a->markmap_r.buffer, a->field.height, |
|
|
orca_run(a->scratch_field.buffer, a->markmap_r.buffer, a->field.height, |
|
|
a->field.width, a->tick_num, &a->bank, &a->scratch_oevent_list, |
|
|
a->field.width, a->tick_num, &a->bank, &a->scratch_oevent_list, |
|
|
a->piano_bits); |
|
|
a->piano_bits); |
|
@ -582,46 +583,61 @@ void app_add_piano_bits_for_character(App_state* a, char c) { |
|
|
a->piano_bits |= added_bits; |
|
|
a->piano_bits |= added_bits; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void app_input_character(App_state* a, char c) { |
|
|
|
|
|
bool ok = c >= '!' && c <= '~'; |
|
|
|
|
|
if (!ok) |
|
|
|
|
|
return; |
|
|
|
|
|
switch (a->input_mode) { |
|
|
|
|
|
case Tui_input_mode_normal: |
|
|
|
|
|
case Tui_input_mode_append: |
|
|
|
|
|
app_write_character(a, c); |
|
|
|
|
|
break; |
|
|
|
|
|
case Tui_input_mode_piano: |
|
|
|
|
|
app_add_piano_bits_for_character(a, c); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
typedef enum { |
|
|
typedef enum { |
|
|
App_input_event_undo, |
|
|
App_input_cmd_undo, |
|
|
App_input_event_toggle_append_mode, |
|
|
App_input_cmd_toggle_append_mode, |
|
|
App_input_event_toggle_piano_mode, |
|
|
App_input_cmd_toggle_piano_mode, |
|
|
App_input_event_step_forward, |
|
|
App_input_cmd_step_forward, |
|
|
App_input_event_toggle_show_event_list, |
|
|
App_input_cmd_toggle_show_event_list, |
|
|
App_input_event_toggle_play_pause, |
|
|
App_input_cmd_toggle_play_pause, |
|
|
App_input_event_shrink_ruler_y, |
|
|
App_input_cmd_shrink_ruler_y, |
|
|
App_input_event_grow_ruler_y, |
|
|
App_input_cmd_grow_ruler_y, |
|
|
App_input_event_shrink_ruler_x, |
|
|
App_input_cmd_shrink_ruler_x, |
|
|
App_input_event_grow_ruler_x, |
|
|
App_input_cmd_grow_ruler_x, |
|
|
App_input_event_shrink_field_y, |
|
|
App_input_cmd_shrink_field_y, |
|
|
App_input_event_grow_field_y, |
|
|
App_input_cmd_grow_field_y, |
|
|
App_input_event_shrink_field_x, |
|
|
App_input_cmd_shrink_field_x, |
|
|
App_input_event_grow_field_x, |
|
|
App_input_cmd_grow_field_x, |
|
|
} App_input_event; |
|
|
} App_input_cmd; |
|
|
|
|
|
|
|
|
void app_input_event(App_state* a, App_input_event ev) { |
|
|
void app_input_cmd(App_state* a, App_input_cmd ev) { |
|
|
switch (ev) { |
|
|
switch (ev) { |
|
|
case App_input_event_undo: |
|
|
case App_input_cmd_undo: |
|
|
if (undo_history_count(&a->undo_hist) > 0) { |
|
|
if (undo_history_count(&a->undo_hist) > 0) { |
|
|
undo_history_pop(&a->undo_hist, &a->field, &a->tick_num); |
|
|
undo_history_pop(&a->undo_hist, &a->field, &a->tick_num); |
|
|
a->needs_remarking = true; |
|
|
a->needs_remarking = true; |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case App_input_event_toggle_append_mode: |
|
|
case App_input_cmd_toggle_append_mode: |
|
|
if (a->input_mode == Tui_input_mode_append) { |
|
|
if (a->input_mode == Tui_input_mode_append) { |
|
|
a->input_mode = Tui_input_mode_normal; |
|
|
a->input_mode = Tui_input_mode_normal; |
|
|
} else { |
|
|
} else { |
|
|
a->input_mode = Tui_input_mode_append; |
|
|
a->input_mode = Tui_input_mode_append; |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case App_input_event_toggle_piano_mode: |
|
|
case App_input_cmd_toggle_piano_mode: |
|
|
if (a->input_mode == Tui_input_mode_piano) { |
|
|
if (a->input_mode == Tui_input_mode_piano) { |
|
|
a->input_mode = Tui_input_mode_normal; |
|
|
a->input_mode = Tui_input_mode_normal; |
|
|
} else { |
|
|
} else { |
|
|
a->input_mode = Tui_input_mode_piano; |
|
|
a->input_mode = Tui_input_mode_piano; |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case App_input_event_step_forward: |
|
|
case App_input_cmd_step_forward: |
|
|
undo_history_push(&a->undo_hist, &a->field, a->tick_num); |
|
|
undo_history_push(&a->undo_hist, &a->field, a->tick_num); |
|
|
orca_run(a->field.buffer, a->markmap_r.buffer, a->field.height, |
|
|
orca_run(a->field.buffer, a->markmap_r.buffer, a->field.height, |
|
|
a->field.width, a->tick_num, &a->bank, &a->oevent_list, |
|
|
a->field.width, a->tick_num, &a->bank, &a->oevent_list, |
|
@ -630,7 +646,7 @@ void app_input_event(App_state* a, App_input_event ev) { |
|
|
a->piano_bits = ORCA_PIANO_BITS_NONE; |
|
|
a->piano_bits = ORCA_PIANO_BITS_NONE; |
|
|
a->needs_remarking = true; |
|
|
a->needs_remarking = true; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_toggle_play_pause: |
|
|
case App_input_cmd_toggle_play_pause: |
|
|
if (a->is_playing) { |
|
|
if (a->is_playing) { |
|
|
a->is_playing = false; |
|
|
a->is_playing = false; |
|
|
nodelay(stdscr, FALSE); |
|
|
nodelay(stdscr, FALSE); |
|
@ -639,35 +655,35 @@ void app_input_event(App_state* a, App_input_event ev) { |
|
|
nodelay(stdscr, TRUE); |
|
|
nodelay(stdscr, TRUE); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case App_input_event_toggle_show_event_list: |
|
|
case App_input_cmd_toggle_show_event_list: |
|
|
a->draw_event_list = !a->draw_event_list; |
|
|
a->draw_event_list = !a->draw_event_list; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_shrink_ruler_y: |
|
|
case App_input_cmd_shrink_ruler_y: |
|
|
if (a->ruler_spacing_y > 4) |
|
|
if (a->ruler_spacing_y > 4) |
|
|
--a->ruler_spacing_y; |
|
|
--a->ruler_spacing_y; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_grow_ruler_y: |
|
|
case App_input_cmd_grow_ruler_y: |
|
|
if (a->ruler_spacing_y < 16) |
|
|
if (a->ruler_spacing_y < 16) |
|
|
++a->ruler_spacing_y; |
|
|
++a->ruler_spacing_y; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_shrink_ruler_x: |
|
|
case App_input_cmd_shrink_ruler_x: |
|
|
if (a->ruler_spacing_x > 4) |
|
|
if (a->ruler_spacing_x > 4) |
|
|
--a->ruler_spacing_x; |
|
|
--a->ruler_spacing_x; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_grow_ruler_x: |
|
|
case App_input_cmd_grow_ruler_x: |
|
|
if (a->ruler_spacing_x < 16) |
|
|
if (a->ruler_spacing_x < 16) |
|
|
++a->ruler_spacing_x; |
|
|
++a->ruler_spacing_x; |
|
|
break; |
|
|
break; |
|
|
case App_input_event_shrink_field_y: |
|
|
case App_input_cmd_shrink_field_y: |
|
|
app_resize_grid_relative(a, -1, 0); |
|
|
app_resize_grid_relative(a, -1, 0); |
|
|
break; |
|
|
break; |
|
|
case App_input_event_grow_field_y: |
|
|
case App_input_cmd_grow_field_y: |
|
|
app_resize_grid_relative(a, 1, 0); |
|
|
app_resize_grid_relative(a, 1, 0); |
|
|
break; |
|
|
break; |
|
|
case App_input_event_shrink_field_x: |
|
|
case App_input_cmd_shrink_field_x: |
|
|
app_resize_grid_relative(a, 0, -1); |
|
|
app_resize_grid_relative(a, 0, -1); |
|
|
break; |
|
|
break; |
|
|
case App_input_event_grow_field_x: |
|
|
case App_input_cmd_grow_field_x: |
|
|
app_resize_grid_relative(a, 0, 1); |
|
|
app_resize_grid_relative(a, 0, 1); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
@ -864,62 +880,53 @@ int main(int argc, char** argv) { |
|
|
app_move_cursor_relative(&app_state, 0, 1); |
|
|
app_move_cursor_relative(&app_state, 0, 1); |
|
|
break; |
|
|
break; |
|
|
case AND_CTRL('u'): |
|
|
case AND_CTRL('u'): |
|
|
app_input_event(&app_state, App_input_event_undo); |
|
|
app_input_cmd(&app_state, App_input_cmd_undo); |
|
|
break; |
|
|
break; |
|
|
case '[': |
|
|
case '[': |
|
|
app_input_event(&app_state, App_input_event_shrink_ruler_x); |
|
|
app_input_cmd(&app_state, App_input_cmd_shrink_ruler_x); |
|
|
break; |
|
|
break; |
|
|
case ']': |
|
|
case ']': |
|
|
app_input_event(&app_state, App_input_event_grow_ruler_x); |
|
|
app_input_cmd(&app_state, App_input_cmd_grow_ruler_x); |
|
|
break; |
|
|
break; |
|
|
case '{': |
|
|
case '{': |
|
|
app_input_event(&app_state, App_input_event_shrink_ruler_y); |
|
|
app_input_cmd(&app_state, App_input_cmd_shrink_ruler_y); |
|
|
break; |
|
|
break; |
|
|
case '}': |
|
|
case '}': |
|
|
app_input_event(&app_state, App_input_event_grow_ruler_y); |
|
|
app_input_cmd(&app_state, App_input_cmd_grow_ruler_y); |
|
|
break; |
|
|
break; |
|
|
case '(': |
|
|
case '(': |
|
|
app_input_event(&app_state, App_input_event_shrink_field_x); |
|
|
app_input_cmd(&app_state, App_input_cmd_shrink_field_x); |
|
|
break; |
|
|
break; |
|
|
case ')': |
|
|
case ')': |
|
|
app_input_event(&app_state, App_input_event_grow_field_x); |
|
|
app_input_cmd(&app_state, App_input_cmd_grow_field_x); |
|
|
break; |
|
|
break; |
|
|
case '_': |
|
|
case '_': |
|
|
app_input_event(&app_state, App_input_event_shrink_field_y); |
|
|
app_input_cmd(&app_state, App_input_cmd_shrink_field_y); |
|
|
break; |
|
|
break; |
|
|
case '+': |
|
|
case '+': |
|
|
app_input_event(&app_state, App_input_event_grow_field_y); |
|
|
app_input_cmd(&app_state, App_input_cmd_grow_field_y); |
|
|
break; |
|
|
break; |
|
|
case '\r': |
|
|
case '\r': |
|
|
case KEY_ENTER: |
|
|
case KEY_ENTER: |
|
|
app_input_event(&app_state, App_input_event_toggle_append_mode); |
|
|
app_input_cmd(&app_state, App_input_cmd_toggle_append_mode); |
|
|
break; |
|
|
break; |
|
|
case '/': |
|
|
case '/': |
|
|
app_input_event(&app_state, App_input_event_toggle_piano_mode); |
|
|
app_input_cmd(&app_state, App_input_cmd_toggle_piano_mode); |
|
|
break; |
|
|
break; |
|
|
case AND_CTRL('f'): { |
|
|
case AND_CTRL('f'): { |
|
|
app_input_event(&app_state, App_input_event_step_forward); |
|
|
app_input_cmd(&app_state, App_input_cmd_step_forward); |
|
|
} break; |
|
|
} break; |
|
|
case AND_CTRL('e'): |
|
|
case AND_CTRL('e'): |
|
|
app_input_event(&app_state, App_input_event_toggle_show_event_list); |
|
|
app_input_cmd(&app_state, App_input_cmd_toggle_show_event_list); |
|
|
break; |
|
|
break; |
|
|
case ' ': |
|
|
case ' ': |
|
|
app_input_event(&app_state, App_input_event_toggle_play_pause); |
|
|
app_input_cmd(&app_state, App_input_cmd_toggle_play_pause); |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
switch (app_state.input_mode) { |
|
|
if (key >= '!' && key <= '~') { |
|
|
case Tui_input_mode_normal: |
|
|
app_input_character(&app_state, (char)key); |
|
|
case Tui_input_mode_append: { |
|
|
|
|
|
if (key >= '!' && key <= '~') { |
|
|
|
|
|
app_write_character(&app_state, (char)key); |
|
|
|
|
|
} |
|
|
|
|
|
} break; |
|
|
|
|
|
case Tui_input_mode_piano: { |
|
|
|
|
|
if (key >= '!' && key <= '~') { |
|
|
|
|
|
app_add_piano_bits_for_character(&app_state, (char)key); |
|
|
|
|
|
} |
|
|
|
|
|
} break; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
break; |
|
|
#if 0 |
|
|
#if 0 |
|
|
else { |
|
|
else { |
|
|
fprintf(stderr, "Unknown key number: %d\n", key); |
|
|
fprintf(stderr, "Unknown key number: %d\n", key); |
|
|