vte/console: implement CSI mode L (insert line: IL)
The IL CSI ('L') is used to insert a given number of lines at the current
cursor position. All lines below are moved down.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
1 parent
6786555d17
commit
ff91998ad8
3 files changed
+43
No files matched your search
@@ -856,6 +856,41 @@ void kmscon_console_move_line_home(struct kmscon_console *con)
|
||||
con->cursor_x = 0;
|
||||
}
|
||||
|
||||
void kmscon_console_insert_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->margin_bottom - 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 + num],
|
||||
&con->lines[con->cursor_y],
|
||||
(max - num) * sizeof(struct line*));
|
||||
|
||||
memcpy(&con->lines[con->cursor_y],
|
||||
cache, num * sizeof(struct line*));
|
||||
}
|
||||
|
||||
con->cursor_x = 0;
|
||||
}
|
||||
|
||||
void kmscon_console_erase_cursor(struct kmscon_console *con)
|
||||
{
|
||||
unsigned int x;
|
||||
|
||||
@@ -84,6 +84,7 @@ void kmscon_console_move_left(struct kmscon_console *con, unsigned int num);
|
||||
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_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);
|
||||
|
||||
@@ -1092,6 +1092,13 @@ static void do_csi(struct kmscon_vte *vte, uint32_t data)
|
||||
/* device attributes */
|
||||
csi_dev_attr(vte);
|
||||
break;
|
||||
case 'L': /* IL */
|
||||
/* insert lines */
|
||||
num = vte->csi_argv[0];
|
||||
if (num <= 0)
|
||||
num = 1;
|
||||
kmscon_console_insert_lines(vte->con, num);
|
||||
break;
|
||||
default:
|
||||
log_debug("unhandled CSI sequence %c", data);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user