Control+L should clear screen and redisplay prompt at the top
line. DPDK rdline library will not change anything on the screen when
fed with Control+L.  When prompt is lost after too many text written
to the terminal, users will press Control+L to clear screen and put
the prompt to the top line. This is expected behavior in bash(1) or
applications that are using readline(3). Updated to behave as users
expected.

Signed-off-by: Kerem Aksu <[email protected]>
---
 lib/cmdline/cmdline_rdline.c | 29 +++++++++++++++++++++++------
 lib/cmdline/cmdline_vt100.h  |  1 +
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/lib/cmdline/cmdline_rdline.c b/lib/cmdline/cmdline_rdline.c
index 3b8d435e98..95f519f123 100644
--- a/lib/cmdline/cmdline_rdline.c
+++ b/lib/cmdline/cmdline_rdline.c
@@ -182,9 +182,8 @@ display_right_buffer(struct rdline *rdl, int force)
                                  CIRBUF_GET_LEN(&rdl->right));
 }
 
-RTE_EXPORT_SYMBOL(rdline_redisplay)
-void
-rdline_redisplay(struct rdline *rdl)
+static void
+rdline_reprint(struct rdline *rdl, int clear_screen)
 {
        unsigned int i;
        char tmp;
@@ -192,7 +191,12 @@ rdline_redisplay(struct rdline *rdl)
        if (!rdl)
                return;
 
-       rdline_puts(rdl, vt100_home);
+       if (clear_screen) {
+               rdline_puts(rdl,  vt100_clear_screen);
+               rdline_puts(rdl,  vt100_homecursor);
+       } else {
+               rdline_puts(rdl,  vt100_home);
+       }
        for (i=0 ; i<rdl->prompt_size ; i++)
                rdl->write_char(rdl, rdl->prompt[i]);
        CIRBUF_FOREACH(&rdl->left, i, tmp) {
@@ -201,6 +205,19 @@ rdline_redisplay(struct rdline *rdl)
        display_right_buffer(rdl, 1);
 }
 
+RTE_EXPORT_SYMBOL(rdline_redisplay)
+void
+rdline_redisplay(struct rdline *rdl)
+{
+       rdline_reprint(rdl, 0);
+}
+
+static void
+rdline_clear_screen(struct rdline *rdl)
+{
+       rdline_reprint(rdl, 1);
+}
+
 RTE_EXPORT_SYMBOL(rdline_char_in)
 int
 rdline_char_in(struct rdline *rdl, char c)
@@ -382,9 +399,9 @@ rdline_char_in(struct rdline *rdl, char c)
                        rdline_newline(rdl, rdl->prompt);
                        break;
 
-               /* redisplay (helps when prompt is lost in other output) */
+               /* clear screen (helps when prompt is lost in other output) */
                case CMDLINE_KEY_CTRL_L:
-                       rdline_redisplay(rdl);
+                       rdline_clear_screen(rdl);
                        break;
 
                /* autocomplete */
diff --git a/lib/cmdline/cmdline_vt100.h b/lib/cmdline/cmdline_vt100.h
index be9ae8e1c9..5f11ebdb74 100644
--- a/lib/cmdline/cmdline_vt100.h
+++ b/lib/cmdline/cmdline_vt100.h
@@ -38,6 +38,7 @@ extern "C" {
 #endif
 #define vt100_word_left    "\033\142"
 #define vt100_word_right   "\033\146"
+#define vt100_homecursor   "\033[H"
 
 /* Result of parsing : it must be synchronized with
  * cmdline_vt100_commands[] in vt100.c */
-- 
2.34.1


-- 
Yasal Uyarı: *Bu elektronik posta bu linki kullanarak ulaşabileceğiniz 
koşullara tabidir:** **https://i2i-systems.com/email-disclaimer/ 
<http://i2i-systems.com/about-us/email-disclaimer/>*

Reply via email to