From 906b114c7651088d24d6cdca32b7f13db9b8a4cc Mon Sep 17 00:00:00 2001 From: Atte JEnsen Date: Fri, 7 Jun 2019 22:26:32 +0200 Subject: [PATCH] ctrl makes cursor jump according to ruler spacing --- tui_main.c | 57 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/tui_main.c b/tui_main.c index ac54d5b..7c9a5d8 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1248,7 +1248,7 @@ void ged_move_cursor_relative(Ged* a, Isz delta_y, Isz delta_x) { a->is_draw_dirty = true; } -Usz guarded_selection_axis_resize(Usz x, int delta) { +Usz guarded_selection_axis_resize(Usz x, Isz delta) { if (delta < 0) { if (delta > INT_MIN && (Usz)(-delta) < x) { x -= (Usz)(-delta); @@ -1259,7 +1259,7 @@ Usz guarded_selection_axis_resize(Usz x, int delta) { return x; } -void ged_modify_selection_size(Ged* a, int delta_y, int delta_x) { +void ged_modify_selection_size(Ged* a, Isz delta_y, Isz delta_x) { Usz cur_h = a->ged_cursor.h; Usz cur_w = a->ged_cursor.w; Usz new_h = guarded_selection_axis_resize(cur_h, delta_y); @@ -1278,39 +1278,40 @@ typedef enum { Ged_dir_right, } Ged_dir; -void ged_dir_input(Ged* a, Ged_dir dir) { +void ged_dir_input(Ged* a, Ged_dir dir, Isz step_length) { switch (a->input_mode) { case Ged_input_mode_normal: case Ged_input_mode_append: case Ged_input_mode_piano: switch (dir) { case Ged_dir_up: - ged_move_cursor_relative(a, -1, 0); + ged_move_cursor_relative(a, -step_length, 0); break; case Ged_dir_down: - ged_move_cursor_relative(a, 1, 0); + ged_move_cursor_relative(a, step_length, 0); break; case Ged_dir_left: - ged_move_cursor_relative(a, 0, -1); + ged_move_cursor_relative(a, 0, -step_length); break; case Ged_dir_right: - ged_move_cursor_relative(a, 0, 1); + ged_move_cursor_relative(a, 0, step_length); break; } break; case Ged_input_mode_selresize: + // AtteJensen: This code is never reached, or? switch (dir) { case Ged_dir_up: - ged_modify_selection_size(a, -1, 0); + ged_modify_selection_size(a, -step_length, 0); break; case Ged_dir_down: - ged_modify_selection_size(a, 1, 0); + ged_modify_selection_size(a, step_length, 0); break; case Ged_dir_left: - ged_modify_selection_size(a, 0, -1); + ged_modify_selection_size(a, 0, -step_length); break; case Ged_dir_right: - ged_modify_selection_size(a, 0, 1); + ged_modify_selection_size(a, 0, step_length); break; } } @@ -2335,21 +2336,21 @@ int main(int argc, char** argv) { switch (key) { case KEY_UP: case CTRL_PLUS('k'): - ged_dir_input(&ged_state, Ged_dir_up); + ged_dir_input(&ged_state, Ged_dir_up, 1); break; case CTRL_PLUS('j'): case KEY_DOWN: - ged_dir_input(&ged_state, Ged_dir_down); + ged_dir_input(&ged_state, Ged_dir_down, 1); break; case 127: // backspace in terminal.app, apparently case KEY_BACKSPACE: case CTRL_PLUS('h'): case KEY_LEFT: - ged_dir_input(&ged_state, Ged_dir_left); + ged_dir_input(&ged_state, Ged_dir_left, 1); break; case CTRL_PLUS('l'): case KEY_RIGHT: - ged_dir_input(&ged_state, Ged_dir_right); + ged_dir_input(&ged_state, Ged_dir_right, 1); break; case CTRL_PLUS('z'): case CTRL_PLUS('u'): @@ -2435,11 +2436,37 @@ int main(int argc, char** argv) { case 402: // shift-right ged_modify_selection_size(&ged_state, 0, 1); break; + case 567: // shift-control-up + ged_modify_selection_size(&ged_state, -(Isz)ged_state.ruler_spacing_y, 0); + break; + case 526: // shift-control-down + ged_modify_selection_size(&ged_state, (Isz)ged_state.ruler_spacing_y, 0); + break; + case 546: // shift-control-left + ged_modify_selection_size(&ged_state, 0, -(Isz)ged_state.ruler_spacing_x); + break; + case 561: // shift-control-right + ged_modify_selection_size(&ged_state, 0, (Isz)ged_state.ruler_spacing_x); + break; case 330: // delete? ged_input_character(&ged_state, '.'); break; + // Jump on control-arrow + case 566: //control-up + ged_dir_input(&ged_state, Ged_dir_up, (Isz)ged_state.ruler_spacing_y); + break; + case 525: //control-down + ged_dir_input(&ged_state, Ged_dir_down, (Isz)ged_state.ruler_spacing_y); + break; + case 545: //control-left + ged_dir_input(&ged_state, Ged_dir_left, (Isz)ged_state.ruler_spacing_x); + break; + case 560: //control-right + ged_dir_input(&ged_state, Ged_dir_right, (Isz)ged_state.ruler_spacing_x); + break; + case CTRL_PLUS('d'): case KEY_F(1): push_main_menu();