vte/console: implement protected erase

Protected erase means erasing parts of the screen but preventing protected
characters from being erase. Protecting a character is done by setting
character attributes similarly to colors and backgrounds. Both are reset
on hard erase, soft-reset or screen clearance.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-07-14 23:51:56 +02:00
parent 01527f9f55
commit 785137264b
3 changed files with 47 additions and 24 deletions

View File

@ -1100,7 +1100,8 @@ void kmscon_console_erase_chars(struct kmscon_console *con, unsigned int num)
false);
}
void kmscon_console_erase_cursor_to_end(struct kmscon_console *con)
void kmscon_console_erase_cursor_to_end(struct kmscon_console *con,
bool protect)
{
unsigned int x;
@ -1113,36 +1114,40 @@ void kmscon_console_erase_cursor_to_end(struct kmscon_console *con)
x = con->cursor_x;
console_erase_region(con, x, con->cursor_y, con->size_x - 1,
con->cursor_y, false);
con->cursor_y, protect);
}
void kmscon_console_erase_home_to_cursor(struct kmscon_console *con)
void kmscon_console_erase_home_to_cursor(struct kmscon_console *con,
bool protect)
{
if (!con)
return;
console_erase_region(con, 0, con->cursor_y, con->cursor_x,
con->cursor_y, false);
con->cursor_y, protect);
}
void kmscon_console_erase_current_line(struct kmscon_console *con)
void kmscon_console_erase_current_line(struct kmscon_console *con,
bool protect)
{
if (!con)
return;
console_erase_region(con, 0, con->cursor_y, con->size_x - 1,
con->cursor_y, false);
con->cursor_y, protect);
}
void kmscon_console_erase_screen_to_cursor(struct kmscon_console *con)
void kmscon_console_erase_screen_to_cursor(struct kmscon_console *con,
bool protect)
{
if (!con)
return;
console_erase_region(con, 0, 0, con->cursor_x, con->cursor_y, false);
console_erase_region(con, 0, 0, con->cursor_x, con->cursor_y, protect);
}
void kmscon_console_erase_cursor_to_screen(struct kmscon_console *con)
void kmscon_console_erase_cursor_to_screen(struct kmscon_console *con,
bool protect)
{
unsigned int x;
@ -1155,14 +1160,14 @@ void kmscon_console_erase_cursor_to_screen(struct kmscon_console *con)
x = con->cursor_x;
console_erase_region(con, x, con->cursor_y, con->size_x - 1,
con->size_y - 1, false);
con->size_y - 1, protect);
}
void kmscon_console_erase_screen(struct kmscon_console *con)
void kmscon_console_erase_screen(struct kmscon_console *con, bool protect)
{
if (!con)
return;
console_erase_region(con, 0, 0, con->size_x - 1, con->size_y - 1,
false);
protect);
}

View File

@ -97,11 +97,16 @@ 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_chars(struct kmscon_console *con, unsigned int num);
void kmscon_console_erase_cursor_to_end(struct kmscon_console *con);
void kmscon_console_erase_home_to_cursor(struct kmscon_console *con);
void kmscon_console_erase_current_line(struct kmscon_console *con);
void kmscon_console_erase_screen_to_cursor(struct kmscon_console *con);
void kmscon_console_erase_cursor_to_screen(struct kmscon_console *con);
void kmscon_console_erase_screen(struct kmscon_console *con);
void kmscon_console_erase_cursor_to_end(struct kmscon_console *con,
bool protect);
void kmscon_console_erase_home_to_cursor(struct kmscon_console *con,
bool protect);
void kmscon_console_erase_current_line(struct kmscon_console *con,
bool protect);
void kmscon_console_erase_screen_to_cursor(struct kmscon_console *con,
bool protect);
void kmscon_console_erase_cursor_to_screen(struct kmscon_console *con,
bool protect);
void kmscon_console_erase_screen(struct kmscon_console *con, bool protect);
#endif /* KMSCON_CONSOLE_H */

View File

@ -1236,6 +1236,7 @@ static void csi_dev_attr(struct kmscon_vte *vte)
static void do_csi(struct kmscon_vte *vte, uint32_t data)
{
int num, x, y, upper, lower;
bool protect;
if (vte->csi_argc < CSI_ARG_MAX)
vte->csi_argc++;
@ -1281,23 +1282,35 @@ static void do_csi(struct kmscon_vte *vte, uint32_t data)
kmscon_console_move_to(vte->con, y - 1, x - 1);
break;
case 'J':
if (vte->csi_flags & CSI_WHAT)
protect = true;
else
protect = false;
if (vte->csi_argv[0] <= 0)
kmscon_console_erase_cursor_to_screen(vte->con);
kmscon_console_erase_cursor_to_screen(vte->con,
protect);
else if (vte->csi_argv[0] == 1)
kmscon_console_erase_screen_to_cursor(vte->con);
kmscon_console_erase_screen_to_cursor(vte->con,
protect);
else if (vte->csi_argv[0] == 2)
kmscon_console_erase_screen(vte->con);
kmscon_console_erase_screen(vte->con, protect);
else
log_debug("unknown parameter to CSI-J: %d",
vte->csi_argv[0]);
break;
case 'K':
if (vte->csi_flags & CSI_WHAT)
protect = true;
else
protect = false;
if (vte->csi_argv[0] <= 0)
kmscon_console_erase_cursor_to_end(vte->con);
kmscon_console_erase_cursor_to_end(vte->con, protect);
else if (vte->csi_argv[0] == 1)
kmscon_console_erase_home_to_cursor(vte->con);
kmscon_console_erase_home_to_cursor(vte->con, protect);
else if (vte->csi_argv[0] == 2)
kmscon_console_erase_current_line(vte->con);
kmscon_console_erase_current_line(vte->con, protect);
else
log_debug("unknown parameter to CSI-K: %d",
vte->csi_argv[0]);