чување 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:
| M | TODO | | | 7 | ++++--- |
| M | draw.c | | | 2 | +- |
| M | sled.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;