con->cursor_x = 0;
}
+void kmscon_console_insert_chars(struct kmscon_console *con, unsigned int num)
+{
+ struct cell *cells;
+ unsigned int max, mv, i;
+
+ if (!con || !num || !con->size_y || !con->size_x)
+ return;
+
+ if (con->cursor_x >= con->size_x)
+ con->cursor_x = con->size_x - 1;
+ if (con->cursor_y >= con->size_y)
+ con->cursor_y = con->size_y - 1;
+
+ max = con->size_x - con->cursor_x;
+ if (num > max)
+ num = max;
+ mv = max - num;
+
+ cells = con->lines[con->cursor_y]->cells;
+ if (mv)
+ memmove(&cells[con->cursor_x + num],
+ &cells[con->cursor_x],
+ mv * sizeof(*cells));
+
+ for (i = 0; i < num; ++i) {
+ cell_init(con, &cells[con->cursor_x + i]);
+ }
+}
+
+void kmscon_console_delete_chars(struct kmscon_console *con, unsigned int num)
+{
+ struct cell *cells;
+ unsigned int max, mv, i;
+
+ if (!con || !num || !con->size_y || !con->size_x)
+ return;
+
+ if (con->cursor_x >= con->size_x)
+ con->cursor_x = con->size_x - 1;
+ if (con->cursor_y >= con->size_y)
+ con->cursor_y = con->size_y - 1;
+
+ max = con->size_x - con->cursor_x;
+ if (num > max)
+ num = max;
+ mv = max - num;
+
+ cells = con->lines[con->cursor_y]->cells;
+ if (mv)
+ memmove(&cells[con->cursor_x],
+ &cells[con->cursor_x + num],
+ mv * sizeof(*cells));
+
+ for (i = 0; i < num; ++i) {
+ cell_init(con, &cells[con->cursor_x + mv + i]);
+ }
+}
+
void kmscon_console_erase_cursor(struct kmscon_console *con)
{
unsigned int x;
void kmscon_console_move_line_home(struct kmscon_console *con);
void kmscon_console_insert_lines(struct kmscon_console *con, unsigned int num);
void kmscon_console_delete_lines(struct kmscon_console *con, unsigned int num);
+void kmscon_console_insert_chars(struct kmscon_console *con, unsigned int num);
+void kmscon_console_delete_chars(struct kmscon_console *con, unsigned int num);
void kmscon_console_erase_cursor(struct kmscon_console *con);
void kmscon_console_erase_cursor_to_end(struct kmscon_console *con);
void kmscon_console_erase_home_to_cursor(struct kmscon_console *con);
else
log_debug("invalid parameter %d to TBC CSI", num);
break;
+ case '@': /* ICH */
+ /* insert characters */
+ num = vte->csi_argv[0];
+ if (num <= 0)
+ num = 1;
+ kmscon_console_insert_chars(vte->con, num);
+ break;
+ case 'P': /* DCH */
+ /* delete characters */
+ num = vte->csi_argv[0];
+ if (num <= 0)
+ num = 1;
+ kmscon_console_delete_chars(vte->con, num);
+ break;
default:
log_debug("unhandled CSI sequence %c", data);
}