vte/console: implement CSI 'M' (DL: delete line)

The 'M' CSI mode is used to delete lines. This implements this mode
similar to the "INSERT LINES" CSI.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-07-01 15:35:28 +02:00
parent ff91998ad8
commit 6356dae1da
3 changed files with 43 additions and 0 deletions

View File

@ -891,6 +891,41 @@ void kmscon_console_insert_lines(struct kmscon_console *con, unsigned int num)
con->cursor_x = 0;
}
void kmscon_console_delete_lines(struct kmscon_console *con, unsigned int num)
{
unsigned int i, j, max;
if (!con || !num)
return;
if (con->cursor_y < con->margin_top ||
con->cursor_y > con->margin_bottom)
return;
max = con->margin_bottom - con->cursor_y + 1;
if (num > max)
num = max;
struct line *cache[num];
for (i = 0; i < num; ++i) {
cache[i] = con->lines[con->cursor_y + i];
for (j = 0; j < con->size_x; ++j)
cell_init(con, &cache[i]->cells[j]);
}
if (num < max) {
memmove(&con->lines[con->cursor_y],
&con->lines[con->cursor_y + num],
(max - num) * sizeof(struct line*));
memcpy(&con->lines[con->cursor_y + (max - num)],
cache, num * sizeof(struct line*));
}
con->cursor_x = 0;
}
void kmscon_console_erase_cursor(struct kmscon_console *con)
{
unsigned int x;

View File

@ -85,6 +85,7 @@ void kmscon_console_move_right(struct kmscon_console *con, unsigned int num);
void kmscon_console_move_line_end(struct kmscon_console *con);
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_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);

View File

@ -1099,6 +1099,13 @@ static void do_csi(struct kmscon_vte *vte, uint32_t data)
num = 1;
kmscon_console_insert_lines(vte->con, num);
break;
case 'M': /* DL */
/* delete lines */
num = vte->csi_argv[0];
if (num <= 0)
num = 1;
kmscon_console_delete_lines(vte->con, num);
break;
default:
log_debug("unhandled CSI sequence %c", data);
}