From d706e6828062aa35505d3893fb3c04b84985aa29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 3 Jan 2020 23:29:45 +0100 Subject: [PATCH] selection: track selection type; normal or block selection --- input.c | 4 +++- search.c | 2 +- selection.c | 13 +++++++++---- selection.h | 3 ++- terminal.h | 3 +++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/input.c b/input.c index 7f81da8d..0d0f1e4f 100644 --- a/input.c +++ b/input.c @@ -581,7 +581,9 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, if (button == BTN_LEFT) { switch (wayl->mouse.count) { case 1: - selection_start(term, wayl->mouse.col, wayl->mouse.row); + selection_start( + term, wayl->mouse.col, wayl->mouse.row, + wayl->kbd.ctrl ? SELECTION_BLOCK : SELECTION_NORMAL); break; case 2: diff --git a/search.c b/search.c index 31d26c36..6eef411c 100644 --- a/search.c +++ b/search.c @@ -138,7 +138,7 @@ search_update_selection(struct terminal *term, assert(selection_row >= 0 && selection_row < term->grid->num_rows); - selection_start(term, start_col, selection_row); + selection_start(term, start_col, selection_row, SELECTION_NORMAL); } /* Update selection endpoint */ diff --git a/selection.c b/selection.c index 2da2ba03..6efe682c 100644 --- a/selection.c +++ b/selection.c @@ -126,14 +126,19 @@ extract_selection(const struct terminal *term) } void -selection_start(struct terminal *term, int col, int row) +selection_start(struct terminal *term, int col, int row, + enum selection_kind kind) { if (!selection_enabled(term)) return; selection_cancel(term); - LOG_DBG("selection started at %d,%d", row, col); + LOG_DBG("%s selection started at %d,%d", + kind == SELECTION_NORMAL ? "normal" : + kind == SELECTION_BLOCK ? "block" : "", + row, col); + term->selection.kind = kind; term->selection.start = (struct coord){col, term->grid->view + row}; term->selection.end = (struct coord){-1, -1}; } @@ -287,7 +292,7 @@ selection_mark_word(struct terminal *term, int col, int row, bool spaces_only, } } - selection_start(term, start.col, start.row); + selection_start(term, start.col, start.row, SELECTION_NORMAL); selection_update(term, end.col, end.row); selection_finalize(term, serial); } @@ -295,7 +300,7 @@ selection_mark_word(struct terminal *term, int col, int row, bool spaces_only, void selection_mark_row(struct terminal *term, int row, uint32_t serial) { - selection_start(term, 0, row); + selection_start(term, 0, row, SELECTION_NORMAL); selection_update(term, term->cols - 1, row); selection_finalize(term, serial); } diff --git a/selection.h b/selection.h index 0ead8f0e..bc690eb1 100644 --- a/selection.h +++ b/selection.h @@ -9,7 +9,8 @@ extern const struct wl_data_device_listener data_device_listener; extern const struct zwp_primary_selection_device_v1_listener primary_selection_device_listener; bool selection_enabled(const struct terminal *term); -void selection_start(struct terminal *term, int col, int row); +void selection_start( + struct terminal *term, int col, int row, enum selection_kind kind); void selection_update(struct terminal *term, int col, int row); void selection_finalize(struct terminal *term, uint32_t serial); void selection_cancel(struct terminal *term); diff --git a/terminal.h b/terminal.h index eb3b7f1e..e0b8d44a 100644 --- a/terminal.h +++ b/terminal.h @@ -157,6 +157,8 @@ enum mouse_reporting { enum cursor_style { CURSOR_BLOCK, CURSOR_UNDERLINE, CURSOR_BAR }; +enum selection_kind { SELECTION_NORMAL, SELECTION_BLOCK }; + struct ptmx_buffer { void *data; size_t len; @@ -248,6 +250,7 @@ struct terminal { const char *xcursor; struct { + enum selection_kind kind; struct coord start; struct coord end; } selection;