console: support INSERT mode
authorDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 29 May 2012 14:57:04 +0000 (16:57 +0200)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Tue, 29 May 2012 14:57:04 +0000 (16:57 +0200)
When INSERT mode is enabled, we move all following characters to the right
and drop all characters that are moved beyond the margin.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/console.c
src/console.h
src/vte.c

index 44d692a..eefd572 100644 (file)
@@ -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++;
 }
 
index 857d07c..8528b8d 100644 (file)
@@ -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);
index d29e2cc..e132b46 100644 (file)
--- 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);