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 <kirill@shutemov.name>

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2012-10-01 10:00:00 -05:00 committed by Craig Small
parent bb6cc9c159
commit edd8aae5ba

View File

@ -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
}