From 785137264ba6c2369e7dd3eb59ce12ad755c33fa Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 14 Jul 2012 23:51:56 +0200 Subject: [PATCH] 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 --- src/console.c | 29 +++++++++++++++++------------ src/console.h | 17 +++++++++++------ src/vte.c | 25 +++++++++++++++++++------ 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/console.c b/src/console.c index f40c72e..ec391ee 100644 --- a/src/console.c +++ b/src/console.c @@ -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); } diff --git a/src/console.h b/src/console.h index 454d806..c7df266 100644 --- a/src/console.h +++ b/src/console.h @@ -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 */ diff --git a/src/vte.c b/src/vte.c index ac8254a..3ff39e6 100644 --- a/src/vte.c +++ b/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]);