чување 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:
измењених датотека: 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;