search: wip: initial search matching

* match search buffer against scrollback content
* adjust view to ensure matched content is visible
* create selection on a successful match
* finalize selection when user presses enter (to "commit" the search)
* ctrl+r searches for the next match. Needs more work though.
This commit is contained in:
Daniel Eklöf 2019-08-27 19:33:19 +02:00
parent 61cabdac13
commit aee5045395
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 187 additions and 3 deletions

16
grid.h
View file

@ -7,12 +7,24 @@ void grid_swap_row(struct grid *grid, int row_a, int row_b, bool initialize);
struct row *grid_row_alloc(int cols, bool initialize);
void grid_row_free(struct row *row);
static inline int
grid_row_absolute(const struct grid *grid, int row_no)
{
return (grid->offset + row_no) & (grid->num_rows - 1);
}
static inline int
grid_row_absolute_in_view(const struct grid *grid, int row_no)
{
return (grid->view + row_no) & (grid->num_rows - 1);
}
static inline struct row *
_grid_row_maybe_alloc(struct grid *grid, int row_no, bool alloc_if_null)
{
assert(grid->offset >= 0);
int real_row = (grid->offset + row_no) & (grid->num_rows - 1);
int real_row = grid_row_absolute(grid, row_no);
struct row *row = grid->rows[real_row];
if (row == NULL && alloc_if_null) {
@ -41,7 +53,7 @@ grid_row_in_view(struct grid *grid, int row_no)
{
assert(grid->view >= 0);
int real_row = (grid->view + row_no) & (grid->num_rows - 1);
int real_row = grid_row_absolute_in_view(grid, row_no);
struct row *row = grid->rows[real_row];
assert(row != NULL);