sled

Једноставни уређивач текста
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 6ded9c4a0779056b7a2bca3ad908b2766a708afc
родитељ 4756ed88700eec799ef812cdd5b64322eb5abc46
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu, 17 Feb 2022 21:06:34 +0100

Selection fix; insert_char refactor; update TODO

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
MTODO | 7++++---
Mdraw.c | 2+-
Msled.c | 61+++++++++++++++++++++++++++++++++++--------------------------
измењених датотека: 3, додавања: 40(+), брисања: 30(-)

diff --git a/TODO b/TODO @@ -6,17 +6,18 @@ [~] Selections! [x] Initial support for selections (DrawState.in_selection) - [ ] Selections modify behavior of eg. Delete key + [x] Selections modify behavior of eg. Delete key and inserting characters [ ] Copy/paste? + [ ] Add vi V + + [ ] Update manpage [ ] Allow creating files (error out if directory not writeable, only create file when saving) [ ] Add vi H/L - [ ] Update manpage - [ ] Write operation; create backup files < > Search? diff --git a/draw.c b/draw.c @@ -528,7 +528,7 @@ draw_screen(const struct DrawState* state) ssi = 0; sei = 0; - if (state->sel_start_row < state->sel_end_row) + if (state->sel_start_row <= state->sel_end_row) { ssr = state->sel_start_row; ssc = state->sel_start_col; diff --git a/sled.c b/sled.c @@ -618,39 +618,48 @@ move_page_down(struct DrawState* state) int insert_char(struct DrawState* state, uint32_t ch) { - struct BufferLine* buffer_line = &state->buffer[state->row]; - size_t len = buffer_line->length; - if (state->column < MAXBUFLINE - 1) - { - size_t i = len + 1; - int add_null = buffer_line->text[state->column] == 0; + struct BufferLine* buffer_line = NULL; + size_t i; + int add_null; + int len; + if (state->column >= MAXBUFLINE - 1) + return 1; + + if (SEL_NOT_EMPTY(state)) + { position_to_selection_start(state); erase_selection(state); clear_selection(state); - while (i < MAXBUFLINE - 2 && i > state->column) - { - buffer_line->text[i] = buffer_line->text[i - 1]; - i--; - } - buffer_line->text[state->column++] = ch; - buffer_line->length++; - if (state->column == MAXBUFLINE) - state->column = MAXBUFLINE - 1; + } + + buffer_line = &state->buffer[state->row]; + add_null = buffer_line->text[state->column] == 0; + len = buffer_line->length; + i = len + 1; + + while (i < MAXBUFLINE - 2 && i > state->column) + { + buffer_line->text[i] = buffer_line->text[i - 1]; + i--; + } + buffer_line->text[state->column++] = ch; + buffer_line->length++; + if (state->column == MAXBUFLINE) + state->column = MAXBUFLINE - 1; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); + if (state->display_column - state->first_shown_column > state->maxx - 1) + { + state->first_shown_column + = state->display_column - state->maxx + 1; state->display_column = display_length(state, state->buffer[state->row].text, state->column); - if (state->display_column - state->first_shown_column - > state->maxx - 1) - { - state->first_shown_column - = state->display_column - state->maxx + 1; - state->display_column = display_length(state, - state->buffer[state->row].text, state->column); - } - if (add_null) - buffer_line->text[state->column] = 0; } + if (add_null) + buffer_line->text[state->column] = 0; state->dirty = 1; + return 0; } @@ -1005,7 +1014,7 @@ erase_selection(struct DrawState* state) size_t ser = 0; size_t sec = 0; uint32_t* buf = NULL; - if (state->sel_start_row < state->sel_end_row) + if (state->sel_start_row <= state->sel_end_row) { ssr = state->sel_start_row; ssc = state->sel_start_col;