]> granicus.if.org Git - procps-ng/commitdiff
top: avoid potential xterm state corruption
authorJim Warner <james.warner@comcast.net>
Mon, 1 Oct 2012 15:00:00 +0000 (10:00 -0500)
committerCraig Small <csmall@enc.com.au>
Thu, 11 Oct 2012 10:10:44 +0000 (21:10 +1100)
To support the cursor navigation keys, after saving
the termios structure top issues 'smkx/keypad_xmit'
during startup.  However, some terminals appear to
treat that directive as persistent which leaves a
corrupted tty state after top exit.

This commit reverses the above terminal directive
via 'rmkx/keypad_local' just prior to restoring the
saved termios structure at program end.

For discovering this bug, and providing the 'rmkx'
clue to its solution, thanks to:
  Kirill A. Shutemov <kirill@shutemov.name>

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c

index e5e4b3bb6a5b487979d9ab9c62eaf877f0f9bbd0..0026ea3f4fc73a0ad7152d0b3f4b12429ca9dc86 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -312,6 +312,7 @@ static const char *tg2 (int x, int y) {
 static void bye_bye (const char *str) NORETURN;
 static void bye_bye (const char *str) {
    if (Ttychanged) {
+      if (keypad_local) putp(keypad_local);
       tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original);
       putp(tg2(0, Screen_rows));
       putp(Cap_curs_norm);
@@ -923,6 +924,7 @@ static int keyin (int init) {
       STRLCPY(buf15, fmtmk("\033%s", tOk(key_left)));
       // next is critical so returned results match bound terminfo keys
       putp(tOk(keypad_xmit));
+      // ( see the converse keypad_local at program end, just in case )
       return 0;
     #undef tOk
    }