sled

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

чување 0996346b86aca8206f558927ef2d589f2a7f9b50
родитељ 62978e66ef8bf991ae3952914fe0e05558399822
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Mon, 21 Feb 2022 18:38:36 +0100

Center the screen on the line to go to

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

Diffstat:
Msled.c | 58+++++++++++++++++++++++++++++++++++++++-------------------
измењених датотека: 1, додавања: 39(+), брисања: 19(-)

diff --git a/sled.c b/sled.c @@ -133,20 +133,40 @@ go_to_line_callback(struct DrawState* state) lineno = strtoul(u8_input, NULL, 10); if (errno) strcpy(state->error, errors[ERR_INVALID_NUM]); - else if (lineno + 1 > state->rows_count) - move_bottom(state); + + if (lineno > state->rows_count - 1) + lineno = state->rows_count; else if (lineno < 1) - move_top(state); + lineno = 1; + state->row = lineno - 1; + + if ((state->rows_count - 1 < (state->maxy - 2) / 2) + || (lineno < (state->maxy - 2) / 2)) + state->first_shown_row = 0; + else if (lineno + (state->maxy - 2) / 2 < state->rows_count - 1) + state->first_shown_row = lineno - (state->maxy - 2) / 2; else - { - state->row = lineno - 1; - if (state->first_shown_row > state->row) - state->first_shown_row = state->row; - else if (state->first_shown_row + (state->maxy - 2) - < state->row) - state->first_shown_row - = state->row - (state->maxy - 2); - } + state->first_shown_row + = state->rows_count - (state->maxy - 2) - 1; + if (state->saved_column == -1) + state->saved_column = state->display_column; + size_t dlen + = display_length(state, state->buffer[state->row].text, + state->buffer[state->row].length); + if (dlen < state->saved_column) + state->display_column = dlen; + else + state->display_column = state->saved_column; + state->column = buffer_length(state, + state->buffer[state->row].text, state->display_column); + if (state->first_shown_column > state->display_column) + state->first_shown_column = state->display_column; + if (state->first_shown_column + state->maxx - 1 + < state->display_column) + state->first_shown_column + = state->display_column - state->maxx + 1; + state->display_column = display_length(state, + state->buffer[state->row].text, state->column); free(u8_input); if (!*state->error) *state->input = 0; @@ -182,7 +202,7 @@ int create_file(struct DrawState* state) { struct BufferLine* newchunk = NULL; - uint32_t* newtext = NULL; + uint32_t* newtext = NULL; newchunk = calloc(ALLOC_DELTA, sizeof(struct BufferLine)); if (!newchunk) @@ -192,8 +212,8 @@ create_file(struct DrawState* state) newtext = calloc(MAXBUFLINE, sizeof(uint32_t)); if (!newtext) return LOAD_ERR_CANT_ALLOC; - newchunk->length = 0; - newchunk->text = newtext; + newchunk->length = 0; + newchunk->text = newtext; state->buffer = newchunk; state->buffer_size = ALLOC_DELTA; state->rows_count = 1; @@ -287,8 +307,8 @@ load_file(struct DrawState* state, long* lineno, long* col) int save_file(struct DrawState* state) { - FILE* output = NULL; - char* buf = NULL; + FILE* output = NULL; + char* buf = NULL; #ifdef CREATE_BACKUPS char* backup_filename = NULL; #endif @@ -558,7 +578,7 @@ move_screen_middle(struct DrawState* state) { if (state->rows_count < state->maxy - 2) { - state->row = state->rows_count / 2; + state->row = state->rows_count / 2; state->first_shown_row = 0; } else @@ -773,7 +793,7 @@ move_screen_bottom(struct DrawState* state) { if (state->rows_count < state->maxy - 2) { - state->row = state->rows_count - 1; + state->row = state->rows_count - 1; state->first_shown_row = 0; } else