From f3a87cf634976a6d2a05c5dde19458f7a222e499 Mon Sep 17 00:00:00 2001 From: Jim Warner Date: Tue, 29 Jan 2013 00:00:00 -0600 Subject: [PATCH] top: normalize miscellaneous putp screen manipulations This commit standardizes the usage of several terminfo strings concerned with cursor position and visibility. Henceforth we will adopt the following informal rules: . Cap_home vs. Cap_clr_scr is preferred where possible . Cap_curs_huge will be used with prompts for line i/p . Cap_curs_huge will be used with help & color mapping . Cap_curs_hide will be in effect in any other context We've also added a missing Cap_clr_scr to the 2nd help screen whenever the SIGWINCH interrupt was recognized. This prevents a 'duplicated' row from appearing at the top of the display (when resizing from small to large) depending on an emulator's scrollback buffer contents. (everything is perfectly justified plus right margins) (are completely filled, but of course it must be luck) Signed-off-by: Jim Warner --- top/top.c | 47 +++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/top/top.c b/top/top.c index 92f5a3f9..9863702d 100644 --- a/top/top.c +++ b/top/top.c @@ -68,6 +68,9 @@ static struct termios Tty_original, // our inherited terminal definition Tty_raw; // for unsolicited input static int Ttychanged = 0; + /* Last established cursor state/shape */ +static const char *Cursor_state = ""; + /* Program name used in error messages and local 'rc' file name */ static char *Myname; @@ -581,6 +584,7 @@ static void sig_paused (int dont_care_sig) { putp(Cap_rmam); #endif if (keypad_xmit) putp(keypad_xmit); + putp(Cursor_state); Frames_resize = RESIZ_sig; (void)dont_care_sig; } // end: sig_paused @@ -680,11 +684,12 @@ static void capsmk (WIN_t *q) { /* * Show an error message (caller may include '\a' for sound) */ static void show_msg (const char *str) { - PUTT("%s%s %.*s %s%s" + PUTT("%s%s %.*s %s%s%s" , tg2(0, Msg_row) , Curwin->capclr_msg , Screen_cols - 2 , str + , Cap_curs_hide , Caps_off , Cap_clr_eol); fflush(stdout); @@ -1014,7 +1019,6 @@ static char *ioline (const char *prompt) { show_pmt(prompt); memset(buf, '\0', sizeof(buf)); ioch(1, buf, sizeof(buf)-1); - putp(Cap_curs_norm); if ((p = strpbrk(buf, ws))) *p = '\0'; // note: we DO produce a vaid 'string' @@ -1916,7 +1920,6 @@ static void fields_utility (void) { spewFI signify_that: putp(Cap_clr_scr); - putp(Cap_curs_hide); adj_geometry(); do { @@ -2765,7 +2768,6 @@ static int insp_view_choice (proc_t *obj) { signify_that: putp(Cap_clr_scr); - putp(Cap_curs_hide); adj_geometry(); for (;;) { @@ -2775,10 +2777,9 @@ signify_that: if (curlin >= Insp_nl) curlin = Insp_nl -1; if (curlin < 0) curlin = 0; - putp(Cap_home); - putp(Cap_curs_hide); makFS(buf) makHD(pid,cmd,usr) + putp(Cap_home); show_special(1, fmtmk(N_unq(INSP_hdrview_fmt) , pid, cmd, usr, (Insp_sel->fstr[0]) ? buf : " N/A ")); // nls_maybe insp_show_pgs(curcol, curlin, maxLN); @@ -2831,7 +2832,6 @@ signify_that: case '&': case '/': case 'n': - putp(Cap_curs_norm); insp_find_str(key, &curcol, &curlin); break; case '=': @@ -2878,16 +2878,16 @@ static void inspection_utility (int pid) { show_msg(fmtmk(N_fmt(YINSP_pidbad_fmt), pid)); return; } + // must re-hide cursor since the prompt for a pid made it huge + putp((Cursor_state = Cap_curs_hide)); signify_that: putp(Cap_clr_scr); - putp(Cap_curs_hide); adj_geometry(); key = INT_MAX; do { mkSEL(sels); putp(Cap_home); - putp(Cap_curs_hide); show_special(1, fmtmk(N_unq(INSP_hdrsels_fmt) , pid, p->cmd, p->euser, sels)); INSP_MKSL(0, " "); @@ -3583,14 +3583,13 @@ static void wins_colors (void) { return; } wins_clrhlp(w, 1); + putp((Cursor_state = Cap_curs_huge)); signify_that: putp(Cap_clr_scr); - putp(Cap_curs_hide); adj_geometry(); do { putp(Cap_home); - putp(Cap_curs_hide); // this string is well above ISO C89's minimum requirements! show_special(1, fmtmk(N_unq(COLOR_custom_fmt) , procps_version, w->grpname @@ -3654,8 +3653,6 @@ signify_that: if (key == kbdABORT) wins_clrhlp(w, 0); - putp(Cap_curs_norm); - putp(Cap_clr_scr); #undef kbdABORT #undef kbdAPPLY } // end: wins_colors @@ -3743,7 +3740,9 @@ static void wins_stage_2 (void) { Winstk[i].findstr = alloc_c(FNDBUFSIZ); Winstk[i].findlen = 0; } - if (Batch) { + if (!Batch) + putp((Cursor_state = Cap_curs_hide)); + else { OFFw(Curwin, View_SCROLL); signal(SIGHUP, SIG_IGN); // allow running under nohup } @@ -3867,9 +3866,9 @@ static void help_view (void) { WIN_t *w = Curwin; // avoid gcc bloat with a local copy char key = 1; + putp((Cursor_state = Cap_curs_huge)); signify_that: putp(Cap_clr_scr); - putp(Cap_curs_hide); adj_geometry(); show_special(1, fmtmk(N_unq(KEYS_helpbas_fmt) @@ -3898,17 +3897,15 @@ signify_that: , Winstk[2].rc.winname, Winstk[3].rc.winname)); putp(Cap_clr_eos); fflush(stdout); - if (Frames_resize || (key = iokey(0)) < 1) + if (Frames_resize || (key = iokey(0)) < 1) { adj_geometry(); - else w = win_select(key); + putp(Cap_clr_scr); + } else w = win_select(key); } while (key != kbd_ENTER && key != kbd_ESC); break; default: goto signify_that; } - - putp(Cap_curs_norm); - putp(Cap_clr_scr); } // end: help_view @@ -4498,6 +4495,7 @@ static void do_key (int ch) { }; int i; + putp((Cursor_state = Cap_curs_hide)); switch (ch) { case 0: // ignored (always) case kbd_ESC: // ignored (sometimes) @@ -4512,6 +4510,7 @@ static void do_key (int ch) { if (strchr(key_tab[i].keys, ch)) { key_tab[i].func(ch); Frames_resize = RESIZ_kbd; + putp((Cursor_state = Cap_curs_hide)); return; } }; @@ -5021,11 +5020,9 @@ static void frame_make (void) { int i, scrlins; // deal with potential signal(s) since the last time around... - if (Frames_resize) { - if (Frames_resize > RESIZ_kbd) - putp(Cap_clr_scr); + if (Frames_resize) zap_fieldstab(); - } + // whoa either first time or thread/task mode change, (re)prime the pump... if (Pseudo_row == PROC_XTRA) { procs_refresh(); @@ -5034,7 +5031,6 @@ static void frame_make (void) { } else putp(Batch ? "\n\n" : Cap_home); - putp(Cap_curs_hide); procs_refresh(); sysinfo_refresh(0); @@ -5067,7 +5063,6 @@ static void frame_make (void) { } if (VIZISw(w) && CHKw(w, View_SCROLL)) show_scroll(); else PUTT("%s%s", tg2(0, Msg_row), Cap_clr_eol); - putp(Cap_curs_norm); fflush(stdout); /* we'll deem any terminal not supporting tgoto as dumb and disable