From edd8aae5bafaeb7c43c1733873cda614ec2cb0c9 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Mon, 1 Oct 2012 10:00:00 -0500 Subject: [PATCH] top: avoid potential xterm state corruption 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 Signed-off-by: Jim Warner --- top/top.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/top/top.c b/top/top.c index e5e4b3bb..0026ea3f 100644 --- 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 }