чување 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:
| M | sled.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