sled

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

чување 4756ed88700eec799ef812cdd5b64322eb5abc46
родитељ 8f53b28ad2d2bcdac2f1a9b6660dfe6ba827d6e6
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Thu, 17 Feb 2022 18:53:32 +0100

Add binding: Enter -> insert_line, fix erase_selection

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

Diffstat:
Mconfig.def.h | 6++++--
Mconfig.h | 6++++--
Adelete.selection | 42++++++++++++++++++++++++++++++++++++++++++
Msled.c | 26++++++++++++++++----------
измењених датотека: 4, додавања: 66(+), брисања: 14(-)

diff --git a/config.def.h b/config.def.h @@ -23,6 +23,7 @@ int erase_forward(struct DrawState* state); int erase_to_end(struct DrawState* state); int erase_to_start(struct DrawState* state); int exit_program(struct DrawState* state); +int insert_line(struct DrawState* state); int insert_space(struct DrawState* state); int insert_tab(struct DrawState* state); int move_bottom(struct DrawState* state); @@ -94,10 +95,11 @@ static const struct Key global_keys[] = { static const struct Key insert_keys[] = { { .ev = { .key = TB_KEY_CTRL_C }, .callback = enter_command_mode }, + { .ev = { .key = TB_KEY_ENTER }, + .callback = insert_line }, { .ev = { .key = TB_KEY_SPACE }, .callback = insert_space }, - { .ev = { .key = TB_KEY_TAB }, - .callback = insert_tab } + { .ev = { .key = TB_KEY_TAB }, .callback = insert_tab } }; /* Only when in command mode */ diff --git a/config.h b/config.h @@ -23,6 +23,7 @@ int erase_forward(struct DrawState* state); int erase_to_end(struct DrawState* state); int erase_to_start(struct DrawState* state); int exit_program(struct DrawState* state); +int insert_line(struct DrawState* state); int insert_space(struct DrawState* state); int insert_tab(struct DrawState* state); int move_bottom(struct DrawState* state); @@ -94,10 +95,11 @@ static const struct Key global_keys[] = { static const struct Key insert_keys[] = { { .ev = { .key = TB_KEY_CTRL_C }, .callback = enter_command_mode }, + { .ev = { .key = TB_KEY_ENTER }, + .callback = insert_line }, { .ev = { .key = TB_KEY_SPACE }, .callback = insert_space }, - { .ev = { .key = TB_KEY_TAB }, - .callback = insert_tab } + { .ev = { .key = TB_KEY_TAB }, .callback = insert_tab } }; /* Only when in command mode */ diff --git a/delete.selection b/delete.selection @@ -0,0 +1,42 @@ + 0 + 1 + 2 ser - ssr = 9 - 5 = 4 + 3 + 4 + 5 --> ssr = 5 <::: row = 0 + 6 ssr+1 = 6 <-:--+ row = 1 + 7 ssr+2 = 7 : | ... + 8 ssr+3 = 8 : | + 9 --> ser = 9 ::: | ssr+4 = 9 row = 4 + 10 ser+1 = 10 ---+ <-----+ ssr+5 = 10 row = 5 + 11 | + 12 | + 13 | + 14 ser+5 = 14 ---+ + 15 rows_count -= 4 X + 16 == 15 X rows_count - (ser - ssr) = + 17 X = 19 - 4 = 15 + 18 X + --> rows_count = 19 + + + + + + + + + + + + + + + + + + + + + + diff --git a/sled.c b/sled.c @@ -60,7 +60,6 @@ struct BufferLine* load_info(struct DrawState* state); struct DrawState* load_msgstr(struct DrawState* state); int load_file(struct DrawState* dstate, long* lineno, long* col); int save_file(struct DrawState* state); -struct DrawState* insert_line(struct DrawState* state); struct DrawState* join_lines(struct DrawState* state, size_t first_line, int forward); int toggle_selection(struct DrawState* state); @@ -798,20 +797,20 @@ erase_to_end(struct DrawState* state) return 0; } -struct DrawState* +int insert_line(struct DrawState* state) { state->rows_count++; struct BufferLine* newbuf = realloc(state->buffer, state->rows_count * sizeof(struct BufferLine)); if (!newbuf) - return NULL; + return 1; state->buffer = newbuf; init_bufferline(&state->buffer[state->rows_count - 1]); uint32_t* newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) - return NULL; + return 1; state->buffer[state->rows_count - 1].text = newtext; for (size_t i = state->rows_count - 1; i > state->row + 1; i--) { @@ -828,12 +827,11 @@ insert_line(struct DrawState* state) = u32_strlen(state->buffer[state->row].text); state->row++; - if (state->row - > state->first_shown_row + (state->maxy - 1) / 2) // TODO - state->first_shown_row = state->row - (state->maxy - 1) / 2; + if (state->row > state->first_shown_row + (state->maxy - 2)) + state->first_shown_row = state->row - state->maxy + 2; move_start(state); state->dirty = 1; - return state; + return 0; } struct DrawState* @@ -1033,7 +1031,7 @@ erase_selection(struct DrawState* state) if (ssr != ser) { - for (size_t row = 0; row < state->rows_count - ser - 1; + for (size_t row = 0; ser + row + 1 < state->rows_count; row++) { u32_strcpy(state->buffer[ssr + row + 1].text, @@ -1041,8 +1039,16 @@ erase_selection(struct DrawState* state) state->buffer[ssr + row + 1].length = state->buffer[ser + row + 1].length; } + for (size_t row = state->rows_count - (ser - ssr); + row < state->rows_count; row++) + { + *state->buffer[row].text = 0; + state->buffer[row].length = 0; + } + state->rows_count -= ser - ssr; } free(buf); + state->dirty = 1; } return 0; } @@ -1103,7 +1109,7 @@ handle_editbox_key_event(struct tb_event* ev, struct DrawState* state) move_end(state); else if (ev->key == TB_KEY_ENTER) { - if (!insert_line(state)) + if (insert_line(state)) { strcpy(state->error, errors[ERR_CANT_ALLOC]); state->running = 0;