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:
David Herrmann committed 2012-07-01 15:30:23 +02:00
1 parent 6786555d17
commit ff91998ad8
3 files changed
+43

No files matched your search

+35
View File
@@ -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;
+1
View File
@@ -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);
+7
View File
@@ -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);
}