From: Jim Warner Date: Mon, 1 Oct 2012 15:00:00 +0000 (-0500) Subject: top: avoid potential xterm state corruption X-Git-Tag: v3.3.4~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=edd8aae5bafaeb7c43c1733873cda614ec2cb0c9;p=procps-ng 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 --- 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 }