summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2012-09-18 15:31:35 -0400
committerRay Strode <rstrode@redhat.com>2012-09-18 15:31:35 -0400
commitefc7c11775323fd9b75f94c20896b6d7b1929ad1 (patch)
tree652ff72edac694e3647bb54379a020a5f0f80253
parent67c654a702561bf4021bc18cb7e8c63a45c4d465 (diff)
text-progress-bar: Try to be more defensive about text leaksfix-text-spew
We try to prevent text from showing through in the text splash, by disable dmesg to screen and by redirecting console messages to a log file. Still, occasionally a kernel message may leak through. This commit tries to harden against that by moving the cursor up to home when we aren't using it.
-rw-r--r--src/libply-splash-core/ply-text-display.c43
-rw-r--r--src/libply-splash-core/ply-text-display.h6
-rw-r--r--src/libply-splash-core/ply-text-progress-bar.c11
3 files changed, 60 insertions, 0 deletions
diff --git a/src/libply-splash-core/ply-text-display.c b/src/libply-splash-core/ply-text-display.c
index 7cabd98f..fcaff22e 100644
--- a/src/libply-splash-core/ply-text-display.c
+++ b/src/libply-splash-core/ply-text-display.c
@@ -58,6 +58,10 @@
#define MOVE_CURSOR_SEQUENCE "\033[%d;%df"
#endif
+#ifndef SET_TOP_AND_BOTTOM_MARGINS_SEQUENCE
+#define SET_TOP_AND_BOTTOM_MARGINS_SEQUENCE "\033[%d;%dr"
+#endif
+
#ifndef HIDE_CURSOR_SEQUENCE
#define HIDE_CURSOR_SEQUENCE "\033[?25l"
#endif
@@ -70,6 +74,14 @@
#define COLOR_SEQUENCE_FORMAT "\033[%dm"
#endif
+#ifndef ENABLE_WRAPPING_SEQUENCE
+#define ENABLE_WRAPPING_SEQUENCE "\033[?7h"
+#endif
+
+#ifndef DISABLE_WRAPPING_SEQUENCE
+#define DISABLE_WRAPPING_SEQUENCE "\033[?7l"
+#endif
+
#ifndef PAUSE_SEQUENCE
#define PAUSE_SEQUENCE "\023"
#endif
@@ -148,6 +160,37 @@ ply_text_display_set_cursor_position (ply_text_display_t *display,
}
void
+ply_text_display_set_scrollable_area (ply_text_display_t *display,
+ int top_row,
+ int bottom_row)
+{
+ int number_of_rows;
+
+ number_of_rows = ply_text_display_get_number_of_rows (display);
+
+ top_row = CLAMP (top_row, 0, bottom_row);
+ bottom_row = CLAMP (bottom_row, top_row, number_of_rows - 1);
+
+ ply_terminal_write (display->terminal,
+ SET_TOP_AND_BOTTOM_MARGINS_SEQUENCE,
+ top_row, bottom_row);
+}
+
+void
+ply_text_display_enable_wrapping (ply_text_display_t *display)
+{
+ ply_terminal_write (display->terminal,
+ ENABLE_WRAPPING_SEQUENCE);
+}
+
+void
+ply_text_display_disable_wrapping (ply_text_display_t *display)
+{
+ ply_terminal_write (display->terminal,
+ DISABLE_WRAPPING_SEQUENCE);
+}
+
+void
ply_text_display_clear_screen (ply_text_display_t *display)
{
if (ply_is_tracing ())
diff --git a/src/libply-splash-core/ply-text-display.h b/src/libply-splash-core/ply-text-display.h
index 3fd7dab2..7f1e20b7 100644
--- a/src/libply-splash-core/ply-text-display.h
+++ b/src/libply-splash-core/ply-text-display.h
@@ -54,6 +54,12 @@ int ply_text_display_get_number_of_columns (ply_text_display_t *display);
void ply_text_display_set_cursor_position (ply_text_display_t *display,
int column,
int row);
+void ply_text_display_set_scrollable_area (ply_text_display_t *display,
+ int top_row,
+ int bottom_row);
+void ply_text_display_enable_wrapping (ply_text_display_t *display);
+void ply_text_display_disable_wrapping (ply_text_display_t *display);
+
__attribute__((__format__ (__printf__, 2, 3)))
void ply_text_display_write (ply_text_display_t *display,
const char *format,
diff --git a/src/libply-splash-core/ply-text-progress-bar.c b/src/libply-splash-core/ply-text-progress-bar.c
index bf4b3781..852f016b 100644
--- a/src/libply-splash-core/ply-text-progress-bar.c
+++ b/src/libply-splash-core/ply-text-progress-bar.c
@@ -184,6 +184,8 @@ ply_text_progress_bar_draw (ply_text_progress_bar_t *progress_bar)
width = progress_bar->number_of_columns - 2 - strlen (os_string);
+ ply_text_display_disable_wrapping (progress_bar->display);
+ ply_text_display_set_scrollable_area (progress_bar->display, 0, progress_bar->row);
ply_text_display_set_cursor_position (progress_bar->display,
progress_bar->column,
progress_bar->row);
@@ -210,6 +212,7 @@ ply_text_progress_bar_draw (ply_text_progress_bar_t *progress_bar)
ply_text_display_write (progress_bar->display, "%c", ' ');
}
+ ply_text_display_set_cursor_position (progress_bar->display, 0, 0);
ply_text_display_set_background_color (progress_bar->display,
PLY_TERMINAL_COLOR_BLACK);
@@ -230,10 +233,18 @@ ply_text_progress_bar_draw (ply_text_progress_bar_t *progress_bar)
progress_bar->row);
ply_text_display_write (progress_bar->display, "%s", os_string);
+ ply_text_display_set_cursor_position (progress_bar->display, 0, 0);
ply_text_display_set_foreground_color (progress_bar->display,
PLY_TERMINAL_COLOR_DEFAULT);
}
+
+ ply_text_display_set_background_color (progress_bar->display,
+ PLY_TERMINAL_COLOR_DEFAULT);
+
+ ply_text_display_set_scrollable_area (progress_bar->display, 0, progress_bar->row - 1);
+ ply_text_display_set_cursor_position (progress_bar->display, 0, 0);
+ ply_text_display_enable_wrapping (progress_bar->display);
}
void