top: turn off the 'Ctrl' bottom window after some keys
authorJim Warner <james.warner@comcast.net>
Tue, 3 May 2022 05:00:00 +0000 (00:00 -0500)
committerCraig Small <csmall@dropbear.xyz>
Tue, 3 May 2022 09:21:21 +0000 (19:21 +1000)
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 <james.warner@comcast.net>
top/top.c
top/top.h

index f4160b935948f880b31ffac873f39dbd35e730c5..d475aaa483a932e071c86d36bc2eff73f9d1c8a9 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -5187,6 +5187,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':
@@ -5211,6 +5213,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);
@@ -5288,12 +5292,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':
@@ -6240,6 +6250,7 @@ static void do_key (int ch) {
    };
    int i;
 
+   Frames_signal = BREAK_off;
    switch (ch) {
       case 0:                // ignored (always)
       case kbd_ESC:          // ignored (sometimes)
@@ -6255,7 +6266,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;
             }
    };
@@ -6812,7 +6824,9 @@ static void frame_make (void) {
    /* deal with potential signal(s) since the last time around
       plus any input which may change 'tasks_refresh' needs... */
    if (Frames_signal) {
-      if (Frames_signal == BREAK_sig) TAGGED_TOSS;
+      if (Frames_signal == BREAK_sig
+      || (Frames_signal == BREAK_screen))
+         TAGGED_TOSS;
       zap_fieldstab();
    }
 
index 212d7275576355baed5fd3e03dfb6748768b53b9..49c0949f3549d0b245967bde0a51aa580e717635 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -229,7 +229,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 */