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:
parent
01527f9f55
commit
785137264b
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
25
src/vte.c
25
src/vte.c
@ -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]);
|
||||
|
Loading…
x
Reference in New Issue
Block a user