Add shift-arrow keys (probably only xterm) to adjust sel size
@@ -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);
