diff --git a/src/console.c b/src/console.c index 44d692a..eefd572 100644 --- a/src/console.c +++ b/src/console.c @@ -775,7 +775,8 @@ static void kmscon_buffer_draw(struct kmscon_buffer *buf, static void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x, unsigned int y, kmscon_symbol_t ch, - const struct font_char_attr *attr) + const struct font_char_attr *attr, + unsigned int flags) { struct line *line, **slot; int ret; @@ -816,7 +817,7 @@ static void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x, buf->scroll_fill = y + 1; } - if (x >= line->size) { + if (line->size < buf->size_x) { ret = resize_line(line, buf->size_x); if (ret) { log_warn("cannot resize line (%d); dropping input", ret); @@ -824,6 +825,9 @@ static void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x, } } + if ((flags & KMSCON_CONSOLE_INSERT) && x < (buf->size_x - 1)) + memmove(&line->cells[x + 1], &line->cells[x], + sizeof(struct cell) * (buf->size_x - 1 - x)); line->cells[x].ch = ch; memcpy(&line->cells[x].attr, attr, sizeof(*attr)); } @@ -1052,7 +1056,8 @@ void kmscon_console_draw(struct kmscon_console *con, struct font_screen *fscr) } void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch, - const struct font_char_attr *attr) + const struct font_char_attr *attr, + unsigned int flags) { unsigned int last; @@ -1074,7 +1079,8 @@ void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch, } } - kmscon_buffer_write(con->cells, con->cursor_x, con->cursor_y, ch, attr); + kmscon_buffer_write(con->cells, con->cursor_x, con->cursor_y, ch, attr, + flags); con->cursor_x++; } diff --git a/src/console.h b/src/console.h index 857d07c..8528b8d 100644 --- a/src/console.h +++ b/src/console.h @@ -44,6 +44,8 @@ struct kmscon_console; /* console objects */ +#define KMSCON_CONSOLE_INSERT 0x01 + int kmscon_console_new(struct kmscon_console **out); void kmscon_console_ref(struct kmscon_console *con); void kmscon_console_unref(struct kmscon_console *con); @@ -57,7 +59,8 @@ void kmscon_console_reset(struct kmscon_console *con); void kmscon_console_draw(struct kmscon_console *con, struct font_screen *fscr); void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch, - const struct font_char_attr *attr); + const struct font_char_attr *attr, + unsigned int flags); void kmscon_console_newline(struct kmscon_console *con); void kmscon_console_move_to(struct kmscon_console *con, unsigned int x, unsigned int y); diff --git a/src/vte.c b/src/vte.c index d29e2cc..e132b46 100644 --- a/src/vte.c +++ b/src/vte.c @@ -261,6 +261,18 @@ static void vte_write_debug(struct kmscon_vte *vte, const char *u8, size_t len, #define vte_write_raw(_vte, _u8, _len) \ vte_write_debug((_vte), (_u8), (_len), true, __FILE__, __LINE__) +/* write to console */ +static void write_console(struct kmscon_vte *vte, kmscon_symbol_t sym) +{ + unsigned int flags; + + flags = 0; + if (vte->flags & FLAG_INSERT_REPLACE_MODE) + flags |= KMSCON_CONSOLE_INSERT; + + kmscon_console_write(vte->con, sym, &vte->cattr, flags); +} + /* * Reset VTE state * This performs a soft reset of the VTE. That is, everything is reset to the @@ -361,7 +373,7 @@ static void do_execute(struct kmscon_vte *vte, uint32_t ctrl) break; case 0x1a: /* SUB */ /* Discard current escape sequence and show err-sym */ - kmscon_console_write(vte->con, 0xbf, &vte->cattr); + write_console(vte, 0xbf); break; case 0x1b: /* ESC */ /* Invokes an escape sequence */ @@ -1026,7 +1038,7 @@ static void do_action(struct kmscon_vte *vte, uint32_t data, int action) break; case ACTION_PRINT: sym = kmscon_symbol_make(vte_map(vte, data)); - kmscon_console_write(vte->con, sym, &vte->cattr); + write_console(vte, sym); break; case ACTION_EXECUTE: do_execute(vte, data);