top: preserve current screen when receiving a SIGWINCH
Prior to this commit, top has always taken the easiest (safest?) approach when dealing with those troublesome SIGWINCH interrupts. Whenever the user was on a screen other than the main display, any signal received would force an immediate exit, returning to the main screen. With these changes, top will retain the user's current position regardless of what screen he/she was viewing. In support the following additional changes were made: * the initial help screen requires an explicit end key ` not 'any other key' formerly used to request an exit * the colors mapping screen instructions were improved * ^Z response was made immediate, eliminating the flag * the sigaction's SA_RESTART flag had to be eliminated * sigprocmask logic was normailize to the bare minimum * the POSIX.1-2004 async-signal safe functions used in ` the signal handlers were acknowledged and documented (everything is perfectly justified plus right margins) (are completely filled, but of course it must be luck) Reference(s): http://www.freelists.org/post/procps/unwanted-topinspect-window-enclosure-with-the-terminal-size-change Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
parent
5856919e83
commit
ba9092ad83
235
top/top.c
235
top/top.c
@ -123,6 +123,7 @@ static char Cap_clr_eol [CAPBUFSIZ] = "", // global and/or static vars
|
||||
Cap_curs_norm [CAPBUFSIZ] = "", // cost nothing but DO serve
|
||||
Cap_curs_huge [CAPBUFSIZ] = "", // to remind people of those
|
||||
Cap_curs_hide [CAPBUFSIZ] = "", // batch requirements!
|
||||
Cap_clr_eos [CAPBUFSIZ] = "",
|
||||
Cap_home [CAPBUFSIZ] = "",
|
||||
Cap_norm [CAPBUFSIZ] = "",
|
||||
Cap_reverse [CAPBUFSIZ] = "",
|
||||
@ -161,9 +162,6 @@ static WIN_t *Curwin;
|
||||
and/or that are simply more efficiently handled as globals
|
||||
[ 'Frames_...' (plural) stuff persists beyond 1 frame ]
|
||||
[ or are used in response to async signals received ! ] */
|
||||
// Frames_paused set by sig_paused(), unset by pause_pgm()
|
||||
static volatile int Frames_paused; // become a paused background job
|
||||
// Frames_resize set by do_key() & sig_resize(), unset by calibrate_fields()
|
||||
static volatile int Frames_resize; // time to rebuild all column headers
|
||||
static int Frames_libflags; // PROC_FILLxxx flags
|
||||
|
||||
@ -324,8 +322,8 @@ static const char *tg2 (int x, int y) {
|
||||
* Reset the tty, if necessary */
|
||||
static void at_eoj (void) {
|
||||
if (Ttychanged) {
|
||||
if (keypad_local) putp(keypad_local);
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original);
|
||||
if (keypad_local) putp(keypad_local);
|
||||
putp(tg2(0, Screen_rows));
|
||||
putp(Cap_curs_norm);
|
||||
#ifndef RMAN_IGNORED
|
||||
@ -335,7 +333,7 @@ static void at_eoj (void) {
|
||||
Ttychanged = 0;
|
||||
}
|
||||
fflush(stdout);
|
||||
} // end:
|
||||
} // end: at_eoj
|
||||
|
||||
|
||||
/*
|
||||
@ -526,32 +524,12 @@ static void library_err (const char *fmts, ...) {
|
||||
} // end: library_err
|
||||
|
||||
|
||||
/*
|
||||
* Called in response to Frames_paused (tku: sig_paused) */
|
||||
static void pause_pgm (void) {
|
||||
Frames_paused = 0;
|
||||
// reset terminal (maybe)
|
||||
if (Ttychanged) tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original);
|
||||
putp(tg2(0, Screen_rows));
|
||||
putp(Cap_curs_norm);
|
||||
#ifndef RMAN_IGNORED
|
||||
putp(Cap_smam);
|
||||
#endif
|
||||
fflush(stdout);
|
||||
raise(SIGSTOP);
|
||||
// later, after SIGCONT...
|
||||
if (Ttychanged) tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_raw);
|
||||
#ifndef RMAN_IGNORED
|
||||
putp(Cap_rmam);
|
||||
#endif
|
||||
} // end: pause_pgm
|
||||
|
||||
|
||||
/*
|
||||
* Catches all remaining signals not otherwise handled */
|
||||
static void sig_abexit (int sig) {
|
||||
sigset_t ss;
|
||||
|
||||
// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask, signal, raise
|
||||
sigfillset(&ss);
|
||||
sigprocmask(SIG_BLOCK, &ss, NULL);
|
||||
at_eoj(); // restore tty in preparation for exit
|
||||
@ -570,6 +548,7 @@ static void sig_endpgm (int dont_care_sig) NORETURN;
|
||||
static void sig_endpgm (int dont_care_sig) {
|
||||
sigset_t ss;
|
||||
|
||||
// POSIX.1-2004 async-signal-safe: sigfillset, sigprocmask
|
||||
sigfillset(&ss);
|
||||
sigprocmask(SIG_BLOCK, &ss, NULL);
|
||||
bye_bye(NULL);
|
||||
@ -581,8 +560,26 @@ static void sig_endpgm (int dont_care_sig) {
|
||||
* Catches:
|
||||
* SIGTSTP, SIGTTIN and SIGTTOU */
|
||||
static void sig_paused (int dont_care_sig) {
|
||||
// POSIX.1-2004 async-signal-safe: tcsetattr, tcdrain, raise
|
||||
if (-1 == tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_original))
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_set_fmt), strerror(errno)));
|
||||
if (keypad_local) putp(keypad_local);
|
||||
putp(tg2(0, Screen_rows));
|
||||
putp(Cap_curs_norm);
|
||||
#ifndef RMAN_IGNORED
|
||||
putp(Cap_smam);
|
||||
#endif
|
||||
tcdrain(STDOUT_FILENO);
|
||||
raise(SIGSTOP);
|
||||
// later, after SIGCONT...
|
||||
if (-1 == tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_raw))
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_set_fmt), strerror(errno)));
|
||||
#ifndef RMAN_IGNORED
|
||||
putp(Cap_rmam);
|
||||
#endif
|
||||
if (keypad_xmit) putp(keypad_xmit);
|
||||
Frames_resize = RESIZ_sig;
|
||||
(void)dont_care_sig;
|
||||
Frames_paused = 1;
|
||||
} // end: sig_paused
|
||||
|
||||
|
||||
@ -590,8 +587,10 @@ static void sig_paused (int dont_care_sig) {
|
||||
* Catches:
|
||||
* SIGCONT and SIGWINCH */
|
||||
static void sig_resize (int dont_care_sig) {
|
||||
// POSIX.1-2004 async-signal-safe: tcdrain
|
||||
tcdrain(STDOUT_FILENO);
|
||||
Frames_resize = RESIZ_sig;
|
||||
(void)dont_care_sig;
|
||||
Frames_resize = 2;
|
||||
} // end: sig_resize
|
||||
|
||||
/*###### Misc Color/Display support ####################################*/
|
||||
@ -612,6 +611,7 @@ static void capsmk (WIN_t *q) {
|
||||
// these are the unchangeable puppies, so we only do 'em once
|
||||
if (!capsdone) {
|
||||
STRLCPY(Cap_clr_eol, tIF(clr_eol))
|
||||
STRLCPY(Cap_clr_eos, tIF(clr_eos))
|
||||
STRLCPY(Cap_clr_scr, tIF(clear_screen))
|
||||
// due to the leading newline, the following must be used with care
|
||||
snprintf(Cap_nl_clreos, sizeof(Cap_nl_clreos), "\n%s", tIF(clr_eos));
|
||||
@ -876,7 +876,6 @@ static int chin (int ech, char *buf, unsigned cnt) {
|
||||
fd_set fs;
|
||||
int rc = -1;
|
||||
|
||||
fflush(stdout);
|
||||
#ifndef TERMIO_PROXY
|
||||
if (ech) {
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &Tty_tweaked);
|
||||
@ -956,7 +955,7 @@ static int keyin (int init) {
|
||||
STRLCPY(buf15, fmtmk("\033%s", tOk(key_right)));
|
||||
// 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 )
|
||||
// ( converse keypad_local issued at pause/pgm end, just in case )
|
||||
return 0;
|
||||
#undef tOk
|
||||
}
|
||||
@ -1027,7 +1026,8 @@ static char *linein (const char *prompt) {
|
||||
memset(buf, '\0', sizeof(buf));
|
||||
do {
|
||||
len = strlen(buf);
|
||||
switch (key = keyin(0)) {
|
||||
key = keyin(0);
|
||||
switch (key) {
|
||||
case kbd_ESC:
|
||||
buf[0] = '\0'; // fall through !
|
||||
case kbd_ENTER:
|
||||
@ -1063,7 +1063,7 @@ static char *linein (const char *prompt) {
|
||||
putp(fmtmk("%s%s%s", tg2(beg, Msg_row), Cap_clr_eol, buf));
|
||||
putp(tg2(beg+pos, Msg_row));
|
||||
fflush(stdout);
|
||||
} while (key && key != kbd_ENTER && key != kbd_ESC);
|
||||
} while (key != kbd_ENTER && key != kbd_ESC);
|
||||
|
||||
return buf;
|
||||
#undef sqzSTR
|
||||
@ -1590,9 +1590,11 @@ static void adj_geometry (void) {
|
||||
pseudo_max = Pseudo_size;
|
||||
Pseudo_screen = alloc_r(Pseudo_screen, pseudo_max);
|
||||
}
|
||||
// ensure each row is repainted and, if SIGWINCH, clear the screen
|
||||
// ensure each row is repainted (just in case)
|
||||
PSU_CLREOS(0);
|
||||
if (Frames_resize > 1) putp(Cap_clr_scr);
|
||||
|
||||
fflush(stdout);
|
||||
Frames_resize = RESIZ_clr;
|
||||
} // end: adj_geometry
|
||||
|
||||
|
||||
@ -1689,19 +1691,12 @@ static void build_headers (void) {
|
||||
* of each visible window's columns headers and the library flags
|
||||
* required for the openproc interface. */
|
||||
static void calibrate_fields (void) {
|
||||
sigset_t newss, oldss;
|
||||
FLG_t f;
|
||||
char *s;
|
||||
const char *h;
|
||||
WIN_t *w = Curwin;
|
||||
int i, varcolcnt, len;
|
||||
|
||||
// block SIGWINCH signals while we do our thing...
|
||||
sigemptyset(&newss);
|
||||
sigaddset(&newss, SIGWINCH);
|
||||
if (-1 == sigprocmask(SIG_BLOCK, &newss, &oldss))
|
||||
error_exit(fmtmk(N_fmt(FAIL_sigstop_fmt), strerror(errno)));
|
||||
|
||||
adj_geometry();
|
||||
|
||||
do {
|
||||
@ -1779,10 +1774,6 @@ static void calibrate_fields (void) {
|
||||
build_headers();
|
||||
if (CHKw(Curwin, View_SCROLL))
|
||||
updt_scroll_msg();
|
||||
|
||||
Frames_resize = 0;
|
||||
if (-1 == sigprocmask(SIG_SETMASK, &oldss, NULL))
|
||||
error_exit(fmtmk(N_fmt(FAIL_sigmask_fmt), strerror(errno)));
|
||||
} // end: calibrate_fields
|
||||
|
||||
|
||||
@ -1828,7 +1819,6 @@ static void display_fields (int focus, int extend) {
|
||||
int cmax = Screen_cols; // total data column width
|
||||
int rmax = Screen_rows - yRSVD; // total useable rows
|
||||
|
||||
fflush(stdout);
|
||||
i = (P_MAXPFLGS % mxCOL) ? 1 : 0;
|
||||
if (rmax < i + (P_MAXPFLGS / mxCOL)) error_exit("++rows"); // nls_maybe
|
||||
i = P_MAXPFLGS / rmax;
|
||||
@ -1839,16 +1829,16 @@ static void display_fields (int focus, int extend) {
|
||||
if (smax < 0) error_exit("++cols"); // nls_maybe
|
||||
|
||||
for (i = 0; i < P_MAXPFLGS; ++i) {
|
||||
char sbuf[xSUFX+1];
|
||||
int b = FLDviz(w, i);
|
||||
FLG_t f = FLDget(w, i);
|
||||
int b = FLDviz(w, i), x = (i / rmax) * cmax, y = (i % rmax) + yRSVD;
|
||||
const char *e = (i == focus && extend) ? w->capclr_hdr : "";
|
||||
FLG_t f = FLDget(w, i);
|
||||
char sbuf[xSUFX+1];
|
||||
|
||||
// prep sacrificial suffix
|
||||
snprintf(sbuf, sizeof(sbuf), "= %s", N_fld(f));
|
||||
|
||||
PUTT("%s%c%s%s %s%-7.7s%s%s%s %-*.*s%s"
|
||||
, tg2((i / rmax) * cmax, (i % rmax) + yRSVD)
|
||||
PUTT("%s%c%s%s %s%-7.7s%s%s%s %-*.*s%s%s"
|
||||
, tg2(x, y)
|
||||
, b ? '*' : ' '
|
||||
, b ? w->cap_bold : Cap_norm
|
||||
, e
|
||||
@ -1859,7 +1849,8 @@ static void display_fields (int focus, int extend) {
|
||||
, e
|
||||
, smax, smax
|
||||
, sbuf
|
||||
, Cap_norm);
|
||||
, Cap_norm
|
||||
, !x ? Cap_clr_eol : "");
|
||||
}
|
||||
|
||||
putp(Caps_off);
|
||||
@ -1890,17 +1881,26 @@ static void fields_utility (void) {
|
||||
int i, key;
|
||||
FLG_t f;
|
||||
|
||||
putp(Cap_clr_scr);
|
||||
spewFI
|
||||
signify_that:
|
||||
putp(Cap_clr_scr);
|
||||
putp(Cap_curs_hide);
|
||||
adj_geometry();
|
||||
|
||||
do {
|
||||
if (!h) h = N_col(f);
|
||||
display_fields(i, (p != NULL));
|
||||
putp(Cap_home);
|
||||
show_special(1, fmtmk(N_unq(FIELD_header_fmt)
|
||||
, w->grpname, CHKw(w, Show_FOREST) ? N_txt(FOREST_views_txt) : h));
|
||||
putp(Cap_nl_clreos);
|
||||
fflush(stdout);
|
||||
display_fields(i, (p != NULL));
|
||||
fflush(stdout);
|
||||
|
||||
switch (key = keyin(0)) {
|
||||
key = keyin(0);
|
||||
if (key < 1) goto signify_that;
|
||||
|
||||
switch (key) {
|
||||
case kbd_UP:
|
||||
if (i > 0) { --i; if (p) swapEM }
|
||||
break;
|
||||
@ -1942,7 +1942,7 @@ static void fields_utility (void) {
|
||||
default: // keep gcc happy
|
||||
break;
|
||||
}
|
||||
} while (key && key != 'q' && key != kbd_ESC);
|
||||
} while (key != 'q' && key != kbd_ESC);
|
||||
#undef unSCRL
|
||||
#undef swapEM
|
||||
#undef spewFI
|
||||
@ -2445,14 +2445,13 @@ static struct I_ent *Insp_sel; // currently selected Inspect entry
|
||||
putp(tg2(0, (Msg_row = 3))); \
|
||||
PUTT("%s%.*s", Curwin->capclr_hdr, Screen_cols -1 \
|
||||
, fmtmk("%-*.*s%s", _sz, _sz, txt, Cap_clr_eol)); \
|
||||
putp(Caps_off); }
|
||||
putp(Caps_off); fflush(stdout); }
|
||||
|
||||
// Our 'row length' macro, equivalent to a strlen() call
|
||||
#define INSP_RLEN(idx) (int)(Insp_p[idx +1] - Insp_p[idx] -1)
|
||||
|
||||
// Our 'busy' (wait please) macro
|
||||
#define INSP_BUSY { INSP_MKSL(0, N_txt(YINSP_workin_txt)); \
|
||||
fflush(stdout); }
|
||||
#define INSP_BUSY { INSP_MKSL(0, N_txt(YINSP_workin_txt)); }
|
||||
|
||||
|
||||
/*
|
||||
@ -2731,9 +2730,14 @@ static int insp_view_choice (proc_t *obj) {
|
||||
snprintf(dst, sizeof(dst), "%s", Insp_sel->fstr); \
|
||||
else snprintf(dst, sizeof(dst), "%.19s...", Insp_sel->fstr); }
|
||||
char buf[SMLBUFSIZ];
|
||||
int key, curlin, curcol;
|
||||
int key, curlin = 0, curcol = 0;
|
||||
|
||||
for (curlin = curcol = 0;;) {
|
||||
signify_that:
|
||||
putp(Cap_clr_scr);
|
||||
putp(Cap_curs_hide);
|
||||
adj_geometry();
|
||||
|
||||
for (;;) {
|
||||
char pid[6], cmd[9], usr[9];
|
||||
|
||||
if (curcol < 0) curcol = 0;
|
||||
@ -2747,17 +2751,19 @@ static int insp_view_choice (proc_t *obj) {
|
||||
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);
|
||||
fflush(stdout);
|
||||
/* fflush(stdin) didn't do the trick, so we'll just dip a little deeper
|
||||
lest repeated <Enter> keys produce immediate re-selection in caller */
|
||||
tcflush(STDIN_FILENO, TCIFLUSH);
|
||||
|
||||
key = keyin(0);
|
||||
if (key < 1) goto signify_that;
|
||||
|
||||
switch (key) {
|
||||
case kbd_ENTER: // must force new keyin()
|
||||
key = -1; // fall through !
|
||||
key = INT_MAX; // fall through !
|
||||
case kbd_ESC:
|
||||
case 'q':
|
||||
case 0:
|
||||
putp(Cap_clr_scr);
|
||||
return key;
|
||||
case kbd_LEFT:
|
||||
@ -2799,8 +2805,8 @@ static int insp_view_choice (proc_t *obj) {
|
||||
case '=':
|
||||
snprintf(buf, sizeof(buf), "%s: %s", Insp_sel->type, Insp_sel->fmts);
|
||||
INSP_MKSL(1, buf); // show an extended SL
|
||||
key = keyin(0);
|
||||
if (!key) return key; // oops, we got signaled
|
||||
if (keyin(0) < 1)
|
||||
goto signify_that;
|
||||
break;
|
||||
default: // keep gcc happy
|
||||
break;
|
||||
@ -2840,9 +2846,12 @@ static void inspection_utility (int pid) {
|
||||
show_msg(fmtmk(N_fmt(YINSP_pidbad_fmt), pid));
|
||||
return;
|
||||
}
|
||||
signify_that:
|
||||
putp(Cap_clr_scr);
|
||||
key = -1;
|
||||
putp(Cap_curs_hide);
|
||||
adj_geometry();
|
||||
|
||||
key = INT_MAX;
|
||||
do {
|
||||
mkSEL(sels);
|
||||
putp(Cap_home);
|
||||
@ -2851,9 +2860,10 @@ static void inspection_utility (int pid) {
|
||||
, pid, p->cmd, p->euser, sels));
|
||||
INSP_MKSL(0, " ");
|
||||
|
||||
if (-1 == key) key = keyin(0);
|
||||
if (key == INT_MAX) key = keyin(0);
|
||||
if (key < 1) goto signify_that;
|
||||
|
||||
switch (key) {
|
||||
case 0:
|
||||
case 'q':
|
||||
case kbd_ESC:
|
||||
break;
|
||||
@ -2861,13 +2871,13 @@ static void inspection_utility (int pid) {
|
||||
sel = 0; // fall through !
|
||||
case kbd_LEFT:
|
||||
if (--sel < 0) sel = Inspect.total -1;
|
||||
key = -1;
|
||||
key = INT_MAX;
|
||||
break;
|
||||
case kbd_HOME:
|
||||
sel = Inspect.total; // fall through !
|
||||
case kbd_RIGHT:
|
||||
if (++sel >= Inspect.total) sel = 0;
|
||||
key = -1;
|
||||
key = INT_MAX;
|
||||
break;
|
||||
case kbd_ENTER:
|
||||
INSP_BUSY;
|
||||
@ -2877,11 +2887,10 @@ static void inspection_utility (int pid) {
|
||||
free(Insp_buf);
|
||||
free(Insp_p);
|
||||
break;
|
||||
default: // keep gcc happy
|
||||
key = -1;
|
||||
break;
|
||||
default:
|
||||
goto signify_that;
|
||||
}
|
||||
} while (key && key != 'q' && key != kbd_ESC);
|
||||
} while (key != 'q' && key != kbd_ESC);
|
||||
|
||||
#undef mkSEL
|
||||
} // end: inspection_utility
|
||||
@ -2941,7 +2950,8 @@ static void before (char *me) {
|
||||
#endif
|
||||
// lastly, establish a robust signals environment
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_RESTART;
|
||||
// with user position perserved through SIGWINCH, we must avoid SA_RESTART
|
||||
sa.sa_flags = 0;
|
||||
for (i = SIGRTMAX; i; i--) {
|
||||
switch (i) {
|
||||
case SIGALRM: case SIGHUP: case SIGINT:
|
||||
@ -3145,7 +3155,6 @@ static void configs_read (void) {
|
||||
, &Rc.fixed_widest, &Rc.summ_mscale, &Rc.task_mscale, &Rc.zero_suppress);
|
||||
|
||||
try_inspect_entries:
|
||||
|
||||
// we'll start off Inspect stuff with 1 'potential' blank line
|
||||
// ( only realized if we end up with Inspect.total > 0 )
|
||||
for (i = 0, Inspect.raw = strdup("\n");;) {
|
||||
@ -3429,7 +3438,7 @@ static void whack_terminal (void) {
|
||||
tmptty.c_cc[VERASE] = *key_backspace;
|
||||
#ifndef TERMIO_PROXY
|
||||
if (-1 == tcsetattr(STDIN_FILENO, TCSAFLUSH, &tmptty))
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_mod_fmt), strerror(errno)));
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_set_fmt), strerror(errno)));
|
||||
tcgetattr(STDIN_FILENO, &Tty_tweaked);
|
||||
#endif
|
||||
// lastly, a nearly raw mode for unsolicited single keystrokes
|
||||
@ -3437,14 +3446,13 @@ static void whack_terminal (void) {
|
||||
tmptty.c_cc[VMIN] = 1;
|
||||
tmptty.c_cc[VTIME] = 0;
|
||||
if (-1 == tcsetattr(STDIN_FILENO, TCSAFLUSH, &tmptty))
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_raw_fmt), strerror(errno)));
|
||||
error_exit(fmtmk(N_fmt(FAIL_tty_set_fmt), strerror(errno)));
|
||||
tcgetattr(STDIN_FILENO, &Tty_raw);
|
||||
|
||||
#ifndef OFF_STDIOLBF
|
||||
// thanks anyway stdio, but we'll manage buffering at the frame level...
|
||||
setbuffer(stdout, Stdout_buf, sizeof(Stdout_buf));
|
||||
#endif
|
||||
|
||||
// and don't forget to ask keyin to initialize his tinfo_tab
|
||||
keyin(1);
|
||||
} // end: whack_terminal
|
||||
@ -3542,11 +3550,14 @@ static void wins_colors (void) {
|
||||
return;
|
||||
}
|
||||
wins_clrhlp(w, 1);
|
||||
signify_that:
|
||||
putp(Cap_clr_scr);
|
||||
putp(Cap_curs_huge);
|
||||
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
|
||||
@ -3554,8 +3565,12 @@ static void wins_colors (void) {
|
||||
, CHKw(w, Show_COLORS) ? N_txt(ON_word_only_txt) : N_txt(OFF_one_word_txt)
|
||||
, CHKw(w, Show_HIBOLD) ? N_txt(ON_word_only_txt) : N_txt(OFF_one_word_txt)
|
||||
, tgt, clr, w->grpname));
|
||||
putp(Cap_clr_eos);
|
||||
fflush(stdout);
|
||||
|
||||
key = keyin(0);
|
||||
if (key < 1) goto signify_that;
|
||||
|
||||
switch (key) {
|
||||
case 'S':
|
||||
pclr = &w->rc.summclr;
|
||||
@ -3597,15 +3612,16 @@ static void wins_colors (void) {
|
||||
clr = w->rc.taskclr, pclr = &w->rc.taskclr;
|
||||
tgt = 'T';
|
||||
break;
|
||||
default: // keep gcc happy
|
||||
break;
|
||||
default:
|
||||
break; // keep gcc happy
|
||||
}
|
||||
capsmk(w);
|
||||
} while (key && key != kbdAPPLY && key != kbdABORT);
|
||||
} while (key != kbdAPPLY && key != kbdABORT);
|
||||
|
||||
if (key == kbdABORT) wins_clrhlp(w, 0);
|
||||
|
||||
putp(Cap_curs_norm);
|
||||
putp(Cap_clr_scr);
|
||||
#undef kbdABORT
|
||||
#undef kbdAPPLY
|
||||
} // end: wins_colors
|
||||
@ -3807,10 +3823,12 @@ static void find_string (int ch) {
|
||||
|
||||
static void help_view (void) {
|
||||
WIN_t *w = Curwin; // avoid gcc bloat with a local copy
|
||||
int ch;
|
||||
char key = 1;
|
||||
|
||||
signify_that:
|
||||
putp(Cap_clr_scr);
|
||||
putp(Cap_curs_huge);
|
||||
putp(Cap_curs_hide);
|
||||
adj_geometry();
|
||||
|
||||
show_special(1, fmtmk(N_unq(KEYS_helpbas_fmt)
|
||||
, procps_version
|
||||
@ -3819,20 +3837,35 @@ static void help_view (void) {
|
||||
, Rc.delay_time
|
||||
, Secure_mode ? N_txt(ON_word_only_txt) : N_txt(OFF_one_word_txt)
|
||||
, Secure_mode ? "" : N_unq(KEYS_helpext_fmt)));
|
||||
putp(Cap_clr_eos);
|
||||
fflush(stdout);
|
||||
|
||||
ch = keyin(0);
|
||||
if (ch == '?' || ch == 'h' || ch == 'H') {
|
||||
do {
|
||||
putp(Cap_clr_scr);
|
||||
show_special(1, fmtmk(N_unq(WINDOWS_help_fmt)
|
||||
, w->grpname
|
||||
, Winstk[0].rc.winname, Winstk[1].rc.winname
|
||||
, Winstk[2].rc.winname, Winstk[3].rc.winname));
|
||||
if (0 < (ch = keyin(0))) w = win_select(ch);
|
||||
} while (ch && ch != kbd_ENTER && ch != kbd_ESC);
|
||||
key = keyin(0);
|
||||
if (key < 1) goto signify_that;
|
||||
|
||||
switch (key) {
|
||||
case kbd_ESC: case 'q':
|
||||
break;
|
||||
case '?': case 'h': case 'H':
|
||||
do {
|
||||
putp(Cap_home);
|
||||
show_special(1, fmtmk(N_unq(WINDOWS_help_fmt)
|
||||
, w->grpname
|
||||
, Winstk[0].rc.winname, Winstk[1].rc.winname
|
||||
, Winstk[2].rc.winname, Winstk[3].rc.winname));
|
||||
putp(Cap_clr_eos);
|
||||
fflush(stdout);
|
||||
key = keyin(0);
|
||||
if (key < 1) adj_geometry();
|
||||
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
|
||||
|
||||
|
||||
@ -4435,7 +4468,7 @@ 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_resize = 1;
|
||||
Frames_resize = RESIZ_kbd;
|
||||
return;
|
||||
}
|
||||
};
|
||||
@ -4944,10 +4977,12 @@ static void frame_make (void) {
|
||||
WIN_t *w = Curwin; // avoid gcc bloat with a local copy
|
||||
int i, scrlins;
|
||||
|
||||
// deal with potential signals since the last time around...
|
||||
if (Frames_paused) pause_pgm();
|
||||
if (Frames_resize) zap_fieldstab();
|
||||
|
||||
// deal with potential signal(s) since the last time around...
|
||||
if (Frames_resize) {
|
||||
if (Frames_resize > RESIZ_kbd)
|
||||
putp(Cap_clr_scr);
|
||||
zap_fieldstab();
|
||||
}
|
||||
// whoa either first time or thread/task mode change, (re)prime the pump...
|
||||
if (Pseudo_row == PROC_XTRA) {
|
||||
procs_refresh();
|
||||
|
10
top/top.h
10
top/top.h
@ -96,8 +96,8 @@ char *strcasestr(const char *haystack, const char *needle);
|
||||
|
||||
/* Length of time a message is displayed and the duration
|
||||
of a 'priming' wait during library startup (in microseconds) */
|
||||
#define MSG_USLEEP (useconds_t)1250000
|
||||
#define LIB_USLEEP (useconds_t)150000
|
||||
#define MSG_USLEEP 1250000
|
||||
#define LIB_USLEEP 150000
|
||||
|
||||
/* Specific process id monitoring support (command line only) */
|
||||
#define MONPIDMAX 20
|
||||
@ -197,6 +197,11 @@ enum scale_enum {
|
||||
SK_Kb, SK_Mb, SK_Gb, SK_Tb, SK_Pb, SK_Eb, SK_SENTINEL
|
||||
};
|
||||
|
||||
/* Used to manipulate (and document) the Frames_resize states */
|
||||
enum resize_states {
|
||||
RESIZ_clr, RESIZ_kbd, RESIZ_sig
|
||||
};
|
||||
|
||||
/* This typedef just ensures consistent 'process flags' handling */
|
||||
typedef unsigned char FLG_t;
|
||||
|
||||
@ -611,7 +616,6 @@ typedef struct WIN_t {
|
||||
//atic void bye_bye (const char *str);
|
||||
//atic void error_exit (const char *str);
|
||||
//atic void library_err (const char *fmts, ...);
|
||||
//atic void pause_pgm (void);
|
||||
//atic void sig_abexit (int sig);
|
||||
//atic void sig_endpgm (int dont_care_sig);
|
||||
//atic void sig_paused (int dont_care_sig);
|
||||
|
@ -303,8 +303,7 @@ static void build_norm_nlstab (void) {
|
||||
Norm_nlstab[FAIL_statget_txt] = _("failed /proc/stat read");
|
||||
Norm_nlstab[FOREST_modes_fmt] = _("Forest mode %s");
|
||||
Norm_nlstab[FAIL_tty_get_txt] = _("failed tty get");
|
||||
Norm_nlstab[FAIL_tty_mod_fmt] = _("failed Tty_tweaked set: %s");
|
||||
Norm_nlstab[FAIL_tty_raw_fmt] = _("failed Tty_raw set: %s");
|
||||
Norm_nlstab[FAIL_tty_set_fmt] = _("failed tty set: %s");
|
||||
Norm_nlstab[CHOOSE_group_txt] = _("Choose field group (1 - 4)");
|
||||
Norm_nlstab[DISABLED_cmd_txt] = _("Command disabled, 'A' mode required");
|
||||
Norm_nlstab[DISABLED_win_fmt] = _("Command disabled, activate %s with '-' or '_'");
|
||||
@ -333,8 +332,6 @@ static void build_norm_nlstab (void) {
|
||||
Norm_nlstab[FAIL_alloc_r_txt] = _("failed memory re-allocate");
|
||||
Norm_nlstab[BAD_numfloat_txt] = _("Unacceptable floating point");
|
||||
Norm_nlstab[BAD_username_txt] = _("Invalid user");
|
||||
Norm_nlstab[FAIL_sigstop_fmt] = _("failed sigprocmask, SIG_BLOCK: %s");
|
||||
Norm_nlstab[FAIL_sigmask_fmt] = _("failed sigprocmask, SIG_SETMASK: %s");
|
||||
Norm_nlstab[FOREST_views_txt] = _("forest view");
|
||||
Norm_nlstab[FAIL_widepid_txt] = _("failed pid maximum size test");
|
||||
Norm_nlstab[FAIL_widecpu_txt] = _("failed number of cpus test");
|
||||
@ -483,7 +480,7 @@ static void build_uniq_nlstab (void) {
|
||||
" q Quit\n"
|
||||
" ( commands shown with '.' require a ~1visible~2 task display ~1window~2 ) \n"
|
||||
"Press '~1h~2' or '~1?~2' for help with ~1Windows~2,\n"
|
||||
"any other key to continue ");
|
||||
"Type 'q' or <Esc> to continue ");
|
||||
|
||||
/* Translation Hint: As is true for the text above, the "keys" shown to the left and
|
||||
. also imbedded in the translatable text (along with escape seqs)
|
||||
@ -557,16 +554,16 @@ static void build_uniq_nlstab (void) {
|
||||
" available toggles: ~1B~2 =disable bold globally (~1%s~2),\n"
|
||||
" ~1z~2 =color/mono (~1%s~2), ~1b~2 =tasks \"bold\"/reverse (~1%s~2)\n"
|
||||
"\n"
|
||||
"Select ~1target~2 as upper case letter:\n"
|
||||
"1) Select a ~1target~2 as an upper case letter, ~1current target~2 is ~1 %c ~4:\n"
|
||||
" S~2 = Summary Data,~1 M~2 = Messages/Prompts,\n"
|
||||
" H~2 = Column Heads,~1 T~2 = Task Information\n"
|
||||
"Select ~1color~2 as number:\n"
|
||||
"2) Select a ~1color~2 as a number, ~1current color~2 is ~1 %d ~4:\n"
|
||||
" 0~2 = black,~1 1~2 = red, ~1 2~2 = green,~1 3~2 = yellow,\n"
|
||||
" 4~2 = blue, ~1 5~2 = magenta,~1 6~2 = cyan, ~1 7~2 = white\n"
|
||||
"\n"
|
||||
"Selected: ~1target~2 ~1 %c ~4; ~1color~2 ~1 %d ~4\n"
|
||||
" press 'q' to abort changes to window '~1%s~2'\n"
|
||||
" press 'a' or 'w' to commit & change another, <Enter> to commit and end ");
|
||||
"3) Then use these keys when finished:\n"
|
||||
" 'q' to abort changes to window '~1%s~2'\n"
|
||||
" 'a' or 'w' to commit & change another, <Enter> to commit and end ");
|
||||
|
||||
Uniq_nlstab[FIELD_header_fmt] = _(""
|
||||
"Fields Management~2 for window ~1%s~6, whose current sort field is ~1%s~2\n"
|
||||
|
@ -69,19 +69,18 @@ enum norm_nls {
|
||||
COLORS_nomap_txt, DELAY_badarg_txt, DELAY_change_fmt, DELAY_secure_txt,
|
||||
DISABLED_cmd_txt, DISABLED_win_fmt, EXIT_signals_fmt, FAIL_alloc_c_txt,
|
||||
FAIL_alloc_r_txt, FAIL_openlib_fmt, FAIL_rc_open_fmt, FAIL_re_nice_fmt,
|
||||
FAIL_sigmask_fmt, FAIL_signals_fmt, FAIL_sigstop_fmt, FAIL_statget_txt,
|
||||
FAIL_statopn_fmt, FAIL_tty_get_txt, FAIL_tty_mod_fmt, FAIL_tty_raw_fmt,
|
||||
FAIL_widecpu_txt, FAIL_widepid_txt, FIND_no_find_fmt, FIND_no_next_txt,
|
||||
FOREST_modes_fmt, FOREST_views_txt, GET_find_str_txt, GET_max_task_fmt,
|
||||
GET_nice_num_fmt, GET_pid2kill_fmt, GET_pid2nice_fmt, GET_sigs_num_fmt,
|
||||
GET_user_ids_txt, HELP_cmdline_fmt, HILIGHT_cant_txt, IRIX_curmode_fmt,
|
||||
LIMIT_exceed_fmt, MISSING_args_fmt, NAME_windows_fmt, NOT_onsecure_txt,
|
||||
NOT_smp_cpus_txt, OFF_one_word_txt, ON_word_only_txt, RC_bad_entry_fmt,
|
||||
RC_bad_files_fmt, SCROLL_coord_fmt, SELECT_clash_txt, THREADS_show_fmt,
|
||||
TIME_accumed_fmt, UNKNOWN_cmds_txt, UNKNOWN_opts_fmt, USAGE_abbrev_txt,
|
||||
WORD_allcpus_txt, WORD_another_txt, WORD_eachcpu_fmt, WORD_process_txt,
|
||||
WORD_threads_txt, WRITE_rcfile_fmt, WRONG_switch_fmt, XTRA_fixwide_fmt,
|
||||
XTRA_sortopt_fmt, XTRA_warncfg_txt,
|
||||
FAIL_signals_fmt, FAIL_statget_txt, FAIL_statopn_fmt, FAIL_tty_get_txt,
|
||||
FAIL_tty_set_fmt, FAIL_widecpu_txt, FAIL_widepid_txt, FIND_no_find_fmt,
|
||||
FIND_no_next_txt, FOREST_modes_fmt, FOREST_views_txt, GET_find_str_txt,
|
||||
GET_max_task_fmt, GET_nice_num_fmt, GET_pid2kill_fmt, GET_pid2nice_fmt,
|
||||
GET_sigs_num_fmt, GET_user_ids_txt, HELP_cmdline_fmt, HILIGHT_cant_txt,
|
||||
IRIX_curmode_fmt, LIMIT_exceed_fmt, MISSING_args_fmt, NAME_windows_fmt,
|
||||
NOT_onsecure_txt, NOT_smp_cpus_txt, OFF_one_word_txt, ON_word_only_txt,
|
||||
RC_bad_entry_fmt, RC_bad_files_fmt, SCROLL_coord_fmt, SELECT_clash_txt,
|
||||
THREADS_show_fmt, TIME_accumed_fmt, UNKNOWN_cmds_txt, UNKNOWN_opts_fmt,
|
||||
USAGE_abbrev_txt, WORD_allcpus_txt, WORD_another_txt, WORD_eachcpu_fmt,
|
||||
WORD_process_txt, WORD_threads_txt, WRITE_rcfile_fmt, WRONG_switch_fmt,
|
||||
XTRA_fixwide_fmt, XTRA_sortopt_fmt, XTRA_warncfg_txt,
|
||||
#ifndef INSP_OFFDEMO
|
||||
YINSP_demo01_txt, YINSP_demo02_txt, YINSP_demo03_txt, YINSP_deqfmt_txt,
|
||||
YINSP_deqtyp_txt, YINSP_dstory_txt,
|
||||
|
Loading…
Reference in New Issue
Block a user