From f45992086c565422502d5960dc5be6d1d4fb2695 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Wed, 15 Jun 2022 00:00:00 -0500 Subject: [PATCH] top: turn off the 'Ctrl' bottom window after some keys <=== port of newlib d66c1f39 ______________________________ original newlib message To complete the implementation of this new feature, we must address the problem created by any commands which offer their own full replacement displays. Should that 'Ctrl' bottom window be active, a return from any such command leaves that lower portion of a terminal blank. While we could issue a 'TAGGED_TOSS' macro right after invoking any of those 4 (currently) affected commands, it is wrong to make them aware of this 'tagged' stuff. So, I'll opt for a more generalized solution whereby a notice regarding a corrupted screen is broadcast. Then the logic already aware of 'tagging' can deal with it. Signed-off-by: Jim Warner --- top/top.c | 20 +++++++++++++++++--- top/top.h | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/top/top.c b/top/top.c index d6125004..20536a69 100644 --- a/top/top.c +++ b/top/top.c @@ -5391,6 +5391,8 @@ static void keys_global (int ch) { case '?': case 'h': help_view(); + // signal that we just corrupted entire screen + Frames_signal = BREAK_screen; mkVIZrow1 break; case 'B': @@ -5415,6 +5417,8 @@ static void keys_global (int ch) { break; case 'f': fields_utility(); + // signal that we just corrupted entire screen + Frames_signal = BREAK_screen; break; case 'g': win_select(0); @@ -5492,12 +5496,18 @@ static void keys_global (int ch) { pid = get_int(fmtmk(N_fmt(YINSP_pidsee_fmt), def)); if (pid > GET_NUM_ESC) { if (pid == GET_NUM_NOT) pid = def; - if (pid) inspection_utility(pid); + if (pid) { + inspection_utility(pid); + // signal that we just corrupted entire screen + Frames_signal = BREAK_screen; + } } } break; case 'Z': wins_colors(); + // signal that we just corrupted entire screen + Frames_signal = BREAK_screen; mkVIZrow1 break; case '0': @@ -6387,6 +6397,7 @@ static void do_key (int ch) { }; int i; + Frames_signal = BREAK_off; switch (ch) { case 0: // ignored (always) case kbd_ESC: // ignored (sometimes) @@ -6402,7 +6413,8 @@ static void do_key (int ch) { for (i = 0; i < MAXTBL(key_tab); ++i) if (strchr(key_tab[i].keys, ch)) { key_tab[i].func(ch); - Frames_signal = BREAK_kbd; + if (Frames_signal == BREAK_off) + Frames_signal = BREAK_kbd; goto all_done; } }; @@ -6939,7 +6951,9 @@ static void frame_make (void) { // deal with potential signal(s) since the last time around... if (Frames_signal) { - if (Frames_signal == BREAK_sig) TAGGED_TOSS; + if (Frames_signal == BREAK_sig + || (Frames_signal == BREAK_screen)) + TAGGED_TOSS; zap_fieldstab(); } diff --git a/top/top.h b/top/top.h index a7a1caa8..1d8632bb 100644 --- a/top/top.h +++ b/top/top.h @@ -242,7 +242,7 @@ enum scale_enum { /* Used to manipulate (and document) the Frames_signal states */ enum resize_states { - BREAK_off = 0, BREAK_kbd, BREAK_sig, BREAK_autox + BREAK_off = 0, BREAK_kbd, BREAK_sig, BREAK_autox, BREAK_screen }; /* This typedef just ensures consistent 'process flags' handling */