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:
parent
ff91998ad8
commit
6356dae1da
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user