diff --git a/tui_main.c b/tui_main.c index 3df70b7..ec304e5 100644 --- a/tui_main.c +++ b/tui_main.c @@ -1158,6 +1158,29 @@ void app_input_character(App_state* a, char c) { } } +Usz guarded_selection_axis_resize(Usz x, int delta) { + if (delta < 0) { + if (delta > INT_MIN && (Usz)(-delta) < x) { + x -= (Usz)(-delta); + } + } else if (x < SIZE_MAX - (Usz)delta) { + x += (Usz)delta; + } + return x; +} + +void app_modify_selection_size(App_state* a, int delta_y, int delta_x) { + Usz cur_h = a->tui_cursor.h; + Usz cur_w = a->tui_cursor.w; + Usz new_h = guarded_selection_axis_resize(cur_h, delta_y); + Usz new_w = guarded_selection_axis_resize(cur_w, delta_x); + if (cur_h != new_h || cur_w != new_w) { + a->tui_cursor.h = new_h; + a->tui_cursor.w = new_w; + a->is_draw_dirty = true; + } +} + typedef enum { App_input_cmd_undo, App_input_cmd_toggle_append_mode, @@ -1624,6 +1647,22 @@ int main(int argc, char** argv) { case 27: // Escape app_input_cmd(&app_state, App_input_cmd_deselect); break; + + // Selection size modification. These may not work in all terminals. (Only + // tested in xterm so far.) + case 337: // shift-up + app_modify_selection_size(&app_state, -1, 0); + break; + case 336: // shift-down + app_modify_selection_size(&app_state, 1, 0); + break; + case 393: // shift-left + app_modify_selection_size(&app_state, 0, -1); + break; + case 402: // shift-right + app_modify_selection_size(&app_state, 0, 1); + break; + case KEY_F(1): app_state.grid_scroll_x -= 1; app_state.is_draw_dirty = true; @@ -1664,7 +1703,6 @@ int main(int argc, char** argv) { if (key >= CHAR_MIN && key <= CHAR_MAX && is_valid_glyph((Glyph)key)) { app_input_character(&app_state, (char)key); } - break; #if 0 else { fprintf(stderr, "Unknown key number: %d\n", key);