// top.h - Header file:         show Linux processes
//
// Copyright (c) 2002, by:      James C. Warner
//    All rights reserved.      8921 Hilloway Road
//                              Eden Prairie, Minnesota 55347 USA
//                             <warnerjc@worldnet.att.net>
//
// This file may be used subject to the terms and conditions of the
// GNU Library General Public License Version 2, or any later version
// at your option, as published by the Free Software Foundation.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Library General Public License for more details.
// 
// For their contributions to this program, the author wishes to thank:
//    Albert D. Cahalan, <albert@users.sf.net>
//    Craig Small, <csmall@small.dropbear.id.au>
//
// Changes by Albert Cahalan, 2002, 2004.

#ifndef _Itop
#define _Itop

// Defines intended to be experimented with ------------------------
//#define CASEUP_HEXES    // show any hex values in upper case
//#define CASEUP_SCALE    // show scaled time/num suffix upper case
//#define CASEUP_SUMMK    // show memory summary kilobytes with 'K'
//#define SORT_SUPRESS    // *attempt* to reduce qsort overhead
//#define WARN_NOT_SMP    // restrict '1' & 'I' commands to true smp

// Development/Debugging defines -----------------------------------
//#define ATEOJ_REPORT    // report a bunch of stuff, at end-of-job
//#define PRETEND2_5_X    // pretend we're linux 2.5.x (for IO-wait)
//#define PRETENDNOCAP    // use a terminal without essential caps
//#define STDOUT_IOLBF    // disable our own stdout _IOFBF override

#ifdef PRETEND2_5_X
#define linux_version_code LINUX_VERSION(2,5,43)
#endif

/*######  Some Miscellaneous constants  ##################################*/

// The default delay twix updates
#define DEF_DELAY  3.0

// The length of time a 'message' is displayed
#define MSG_SLEEP  2

// The default value for the 'k' (kill) request
#define DEF_SIGNAL  SIGTERM

// Specific process id monitoring support (command line only)
#define MONPIDMAX  20

// Power-of-two sizes lead to trouble; the largest power of
// two factor should be the cache line size. It'll mean the
// array indexing math gets slower, but cache aliasing is
// avoided.
#define CACHE_TWEAK_FACTOR 64

// Miscellaneous buffer sizes with liberal values -- mostly
// just to pinpoint source code usage/dependancies
#define SCREENMAX ( 512 + CACHE_TWEAK_FACTOR)
// the above might seem pretty stingy, until you consider that with every
// one of top's fields displayed we're talking a 160 byte column header --
// so that will provide for all fields plus a 350+ byte command line
#define WINNAMSIZ     4
#define CAPTABMAX     9
#define PFLAGSSIZ    32
#define CAPBUFSIZ    32
#define CLRBUFSIZ    64
#define GETBUFSIZ    32
#define TNYBUFSIZ    32
#define SMLBUFSIZ ( 256 + CACHE_TWEAK_FACTOR)
#define OURPATHSZ (1024 + CACHE_TWEAK_FACTOR)
#define MEDBUFSIZ (1024 + CACHE_TWEAK_FACTOR)
#define BIGBUFSIZ (2048 + CACHE_TWEAK_FACTOR)
#define USRNAMSIZ  GETBUFSIZ
#define ROWBUFSIZ  SCREENMAX + CLRBUFSIZ


/*######  Some Miscellaneous Macro definitions  ##########################*/

// Yield table size as 'int'
#define MAXTBL(t)  (int)(sizeof(t) / sizeof(t[0]))

// Used as return arguments in *some* of the sort callbacks
#define SORT_lt  ( Frame_srtflg > 0 ?  1 : -1 )
#define SORT_gt  ( Frame_srtflg > 0 ? -1 :  1 )
#define SORT_eq  0

// Used to create *most* of the sort callback functions
#define SCB_NUM1(f,n) \
   static int sort_ ## f (const proc_t **P, const proc_t **Q) { \
      if (        (*P)->n < (*Q)->n  ) return SORT_lt; \
      if (likely( (*P)->n > (*Q)->n )) return SORT_gt; \
      return SORT_eq; }
#define SCB_NUM2(f,n1,n2) \
   static int sort_ ## f (const proc_t **P, const proc_t **Q) { \
      if (        ((*P)->n1 - (*P)->n2) < ((*Q)->n1 - (*Q)->n2)  ) return SORT_lt; \
      if (likely( ((*P)->n1 - (*P)->n2) > ((*Q)->n1 - (*Q)->n2) )) return SORT_gt; \
      return SORT_eq; }
#define SCB_NUMx(f,n) \
   static int sort_ ## f (const proc_t **P, const proc_t **Q) { \
      return Frame_srtflg * ( (*Q)->n - (*P)->n ); }
#define SCB_STRx(f,s) \
   static int sort_ ## f (const proc_t **P, const proc_t **Q) { \
      return Frame_srtflg * strcmp((*Q)->s, (*P)->s); }

// The following two macros are used to 'inline' those portions of the
// display process requiring formatting, while protecting against any
// potential embedded 'millesecond delay' escape sequences.

// PUTT - Put to Tty (used in many places)
// - for temporary, possibly interactive, 'replacement' output
// - may contain ANY valid terminfo escape sequences
// - need NOT represent an entire screen row
#define PUTT(fmt,arg...) do { \
      char _str[ROWBUFSIZ]; \
      snprintf(_str, sizeof(_str), fmt, ## arg); \
      putp(_str); \
   } while (0)

// PUFF - Put for Frame (used in only 3 places)
// - for more permanent frame-oriented 'update' output
// - may NOT contain cursor motion terminfo escapes
// - assumed to represent a complete screen ROW
// - subject to optimization, thus MAY be discarded

// The evil version   (53892 byte stripped top, oddly enough)
#define _PUFF(fmt,arg...)                               \
do {                                                     \
   char _str[ROWBUFSIZ];                                   \
   int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg);   \
   putp ( Batch ? _str :                                   \
   ({                                                 \
      char *restrict const _pse = &Pseudo_scrn[Pseudo_row++ * Pseudo_cols];  \
      memcmp(_pse, _str, _len) ? memcpy(_pse, _str, _len) : "\n";  \
   })                                \
   );                   \
} while (0)

// The good version  (53876 byte stripped top)
#define PUFF(fmt,arg...)                               \
do {                                                     \
   char _str[ROWBUFSIZ];                                   \
   char *_ptr;                                               \
   int _len = 1 + snprintf(_str, sizeof(_str), fmt, ## arg);   \
   if (Batch) _ptr = _str;                                   \
   else {                                                 \
      _ptr = &Pseudo_scrn[Pseudo_row++ * Pseudo_cols];  \
      if (memcmp(_ptr, _str, _len)) {                \
         memcpy(_ptr, _str, _len);                \
      } else {                                 \
         _ptr = "\n";                       \
      }                                 \
   }                                \
   putp(_ptr);                   \
} while (0)


/*------  Special Macros (debug and/or informative)  ---------------------*/

// Orderly end, with any sort of message - see fmtmk
#define debug_END(s) { \
           static void std_err (const char *); \
           fputs(Cap_clr_scr, stdout); \
           std_err(s); \
        }

// A poor man's breakpoint, if he's too lazy to learn gdb
#define its_YOUR_fault { *((char *)0) = '!'; }


/*######  Some Typedef's and Enum's  #####################################*/

// This typedef just ensures consistent 'process flags' handling
typedef unsigned FLG_t;

// These typedefs attempt to ensure consistent 'ticks' handling
typedef unsigned long long TIC_t;
typedef          long long SIC_t;

// Sort support, callback funtion signature
typedef int (*QFP_t)(const void *, const void *);

// This structure consolidates the information that's used
// in a variety of display roles.
typedef struct FLD_t {
   const char    keys [4];      // order: New-on New-off Old-on Old-off
   // misaligned on 64-bit, but part of a table -- oh well
   const char   *head;          // name for col heads + toggle/reorder fields
   const char   *fmts;          // sprintf format string for field display
   const int     width;         // field width, if applicable
   const int     scale;         // scale_num type, if applicable
   const QFP_t   sort;          // sort function
   const char   *desc;          // description for toggle/reorder fields
   const int     lflg;          // PROC_FILLxxx flag(s) needed by this field
} FLD_t;

// This structure stores one piece of critical 'history'
// information from one frame to the next -- we don't calc
// and save data that goes unused
typedef struct HST_t {
   TIC_t tics;
   int   pid;
} HST_t;

// This structure stores a frame's cpu tics used in history
// calculations.  It exists primarily for SMP support but serves
// all environments.
typedef struct CPU_t {
   TIC_t u, n, s, i, w, x, y, z; // as represented in /proc/stat
   TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav, z_sav; // in the order of our display
   unsigned id;  // the CPU ID number
} CPU_t;

// These 2 types support rcfile compatibility
typedef struct RCW_t {  // the 'window' portion of an rcfile
   FLG_t  sortindx;             // sort field, represented as a procflag
   int    winflags,             // 'view', 'show' and 'sort' mode flags
          maxtasks,             // user requested maximum, 0 equals all
          summclr,                      // color num used in summ info
          msgsclr,                      //        "       in msgs/pmts
          headclr,                      //        "       in cols head
          taskclr;                      //        "       in task rows
   char   winname [WINNAMSIZ],          // window name, user changeable
          fieldscur [PFLAGSSIZ];        // fields displayed and ordered
} RCW_t;

typedef struct RCF_t {  // the complete rcfile (new style)
   int    mode_altscr;          // 'A' - Alt display mode (multi task windows)
   int    mode_irixps;          // 'I' - Irix vs. Solaris mode (SMP-only)
   float  delay_time;           // 'd' or 's' - How long to sleep twixt updates
   int    win_index;            // Curwin, as index
   RCW_t  win [4];              // a 'WIN_t.rc' for each of the 4 windows
} RCF_t;

// The scaling 'type' used with scale_num() -- this is how
// the passed number is interpreted should scaling be necessary
enum scale_num {
   SK_no, SK_Kb, SK_Mb, SK_Gb, SK_Tb
};

// Flags for each possible field
enum pflag {
   EU_PID, EU_PPD, EU_URR, EU_UID, EU_URE, EU_GRP, EU_TTY,
   EU_PRI, EU_NCE,
   EU_CPN, EU_CPU, EU_TME, EU_TM2,
   EU_MEM, EU_VRT, EU_SWP, EU_RES, EU_COD, EU_DAT, EU_SHR,
   EU_FLT, EU_DRT,
   EU_STA, EU_CMD, EU_WCH, EU_FLG
};


///////////////////////////////////////////////////////////////////////////
// Special Section: multiple windows/field groups  -------------
// (kind of a header within a header:  constants, macros & types)

#define GROUPSMAX  4            // the max number of simultaneous windows
#define GRPNAMSIZ  WINNAMSIZ+2  // window's name + number as in: '#:...'

#define Flags_TOG  1            // these are used to direct wins_reflag
#define Flags_SET  2
#define Flags_OFF  3

// The Persistent 'Mode' flags!
// These are preserved in the rc file, as a single integer and the
// letter shown is the corresponding 'command' toggle

// 'View_' flags affect the summary (minimum), taken from 'Curwin'
#define View_CPUSUM  0x8000     // '1' - show combined cpu stats (vs. each)
#define View_LOADAV  0x4000     // 'l' - display load avg and uptime summary
#define View_STATES  0x2000     // 't' - display task/cpu(s) states summary
#define View_MEMORY  0x1000     // 'm' - display memory summary
#define View_NOBOLD  0x0001     // 'B' - disable 'bold' attribute globally

// 'Show_' & 'Qsrt_' flags are for task display in a visible window
#define Show_THREADS 0x10000    // 'H' - show threads in each task
#define Show_COLORS  0x0800     // 'z' - show in color (vs. mono)
#define Show_HIBOLD  0x0400     // 'b' - rows and/or cols bold (vs. reverse)
#define Show_HICOLS  0x0200     // 'x' - show sort column highlighted
#define Show_HIROWS  0x0100     // 'y' - show running tasks highlighted
#define Show_CMDLIN  0x0080     // 'c' - show cmdline vs. name
#define Show_CTIMES  0x0040     // 'S' - show times as cumulative
#define Show_IDLEPS  0x0020     // 'i' - show idle processes (all tasks)
#define Qsrt_NORMAL  0x0010     // 'R' - reversed column sort (high to low)

// these flag(s) have no command as such - they're for internal use
#define VISIBLE_tsk  0x0008     // tasks are showable when in 'Mode_altscr'
#define NEWFRAM_cwo  0x0004     // new frame (if anyone cares) - in Curwin
#define EQUWINS_cwo  0x0002     // rebalance tasks next frame (off 'i'/ 'n')
                                // ...set in Curwin, but impacts all windows

// Current-window-only flags -- always turned off at end-of-window!
#define FLGSOFF_cwo  EQUWINS_cwo | NEWFRAM_cwo

// Default flags if there's no rcfile to provide user customizations
#define DEF_WINFLGS ( \
   View_LOADAV | View_STATES | View_CPUSUM | View_MEMORY | View_NOBOLD | \
   Show_HIBOLD | Show_HIROWS | Show_IDLEPS | Qsrt_NORMAL | \
   VISIBLE_tsk \
)

        // Used to test/manipulate the window flags
#define CHKw(q,f)   (int)((q)->rc.winflags & (f))
#define TOGw(q,f)   (q)->rc.winflags ^=  (f)
#define SETw(q,f)   (q)->rc.winflags |=  (f)
#define OFFw(q,f)   (q)->rc.winflags &= ~(f)
#define VIZCHKc     (!Rc.mode_altscr || Curwin->rc.winflags & VISIBLE_tsk) \
                        ? 1 : win_warn()
#define VIZTOGc(f)  (!Rc.mode_altscr || Curwin->rc.winflags & VISIBLE_tsk) \
                        ? TOGw(Curwin, f) : win_warn()

// This structure stores configurable information for each window.
// By expending a little effort in its creation and user requested
// maintainence, the only real additional per frame cost of having
// windows is an extra sort -- but that's just on ptrs!
typedef struct WIN_t {
   struct WIN_t *next,                  // next window in window stack
                *prev;                  // prior window in window stack
   char       *captab [CAPTABMAX];      // captab needed by show_special
   int         winnum,                  // window's num (array pos + 1)
               winlines;                // task window's rows (volatile)
   FLG_t       procflags [PFLAGSSIZ];   // fieldscur subset, as enum
   int         maxpflgs,        // number of procflags (upcase fieldscur)
               maxcmdln;        // max length of a process' command line
   int         len_rownorm,     // lengths of the corresponding terminfo
               len_rowhigh;     // strings to avoid repeated strlen calls
   RCW_t       rc;              // stuff that gets saved in the rcfile
   char        capclr_sum [CLRBUFSIZ],  // terminfo strings built from
               capclr_msg [CLRBUFSIZ],  //    above clrs (& rebuilt too),
               capclr_pmt [CLRBUFSIZ],  //    but NO recurring costs !!!
               capclr_hdr [CLRBUFSIZ],     // note: sum, msg and pmt strs
               capclr_rowhigh [CLRBUFSIZ], //    are only used when this
               capclr_rownorm [CLRBUFSIZ]; //    window is the 'Curwin'!
   char        cap_bold [CAPBUFSIZ];    // support for View_NOBOLD toggle
   char        grpname   [GRPNAMSIZ],   // window number:name, printable
               columnhdr [SCREENMAX],   // column headings for procflags
               colusrnam [USRNAMSIZ];   // if selected by the 'u' command
} WIN_t;


/*######  Display Support *Data*  ########################################*/

// Configuration files support
#define SYS_RCFILESPEC  "/etc/toprc"
#define RCF_EYECATCHER  "RCfile for "
#define RCF_DEPRECATED  "Id:a, "

// The default fields displayed and their order,
#define DEF_FIELDS  "AEHIOQTWKNMbcdfgjplrsuvyzX"
// Pre-configured field groupss
#define JOB_FIELDS  "ABcefgjlrstuvyzMKNHIWOPQDX"
#define MEM_FIELDS  "ANOPQRSTUVbcdefgjlmyzWHIKX"
#define USR_FIELDS  "ABDECGfhijlopqrstuvyzMKNWX"
// Used by fields_sort, placed here for peace-of-mind
#define NUL_FIELDS  "abcdefghijklmnopqrstuvwxyz"


// The default values for the local config file
#define DEF_RCFILE { \
   0, 1, DEF_DELAY, 0, { \
   { EU_CPU, DEF_WINFLGS, 0, \
      COLOR_RED, COLOR_RED, COLOR_YELLOW, COLOR_RED, \
      "Def", DEF_FIELDS }, \
   { EU_PID, DEF_WINFLGS, 0, \
      COLOR_CYAN, COLOR_CYAN, COLOR_WHITE, COLOR_CYAN, \
      "Job", JOB_FIELDS }, \
   { EU_MEM, DEF_WINFLGS, 0, \
      COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLUE, COLOR_MAGENTA, \
      "Mem", MEM_FIELDS }, \
   { EU_URE, DEF_WINFLGS, 0, \
      COLOR_YELLOW, COLOR_YELLOW, COLOR_GREEN, COLOR_YELLOW, \
      "Usr", USR_FIELDS } \
   } }


// Summary Lines specially formatted string(s) --
// see 'show_special' for syntax details + other cautions.
#define LOADAV_line  "%s -%s\n"
#define LOADAV_line_alt  "%s\06 -%s\n"
#define STATES_line1  "Tasks:\03" \
   " %3u \02total,\03 %3u \02running,\03 %3u \02sleeping,\03 %3u \02stopped,\03 %3u \02zombie\03\n"
#define STATES_line2x4  "%s\03" \
   " %#5.1f%% \02user,\03 %#5.1f%% \02system,\03 %#5.1f%% \02nice,\03 %#5.1f%% \02idle\03\n"
#define STATES_line2x5  "%s\03" \
   " %#5.1f%% \02user,\03 %#5.1f%% \02system,\03 %#5.1f%% \02nice,\03 %#5.1f%% \02idle,\03 %#5.1f%% \02IO-wait\03\n"
#define STATES_line2x6  "%s\03" \
   " %#4.1f%% \02us,\03 %#4.1f%% \02sy,\03 %#4.1f%% \02ni,\03 %#4.1f%% \02id,\03 %#4.1f%% \02wa,\03 %#4.1f%% \02hi,\03 %#4.1f%% \02si\03\n"
#define STATES_line2x7  "%s\03" \
   "%#5.1f%%\02us,\03%#5.1f%%\02sy,\03%#5.1f%%\02ni,\03%#5.1f%%\02id,\03%#5.1f%%\02wa,\03%#5.1f%%\02hi,\03%#5.1f%%\02si,\03%#5.1f%%\02st\03\n"
#ifdef CASEUP_SUMMK
#define MEMORY_line1  "Mem: \03" \
   " %8luK \02total,\03 %8luK \02used,\03 %8luK \02free,\03 %8luK \02buffers\03\n"
#define MEMORY_line2  "Swap:\03" \
   " %8luK \02total,\03 %8luK \02used,\03 %8luK \02free,\03 %8luK \02cached\03\n"
#else
#define MEMORY_line1  "Mem: \03" \
   " %8luk \02total,\03 %8luk \02used,\03 %8luk \02free,\03 %8luk \02buffers\03\n"
#define MEMORY_line2  "Swap:\03" \
   " %8luk \02total,\03 %8luk \02used,\03 %8luk \02free,\03 %8luk \02cached\03\n"
#endif

// Keyboard Help specially formatted string(s) --
// see 'show_special' for syntax details + other cautions.
#define KEYS_help \
   "Help for Interactive Commands\02 - %s\n" \
   "Window \01%s\06: \01Cumulative mode \03%s\02.  \01System\06: \01Delay \03%.1f secs\02; \01Secure mode \03%s\02.\n" \
   "\n" \
   "  Z\05,\01B\05       Global: '\01Z\02' change color mappings; '\01B\02' disable/enable bold\n" \
   "  l,t,m     Toggle Summaries: '\01l\02' load avg; '\01t\02' task/cpu stats; '\01m\02' mem info\n" \
   "  1,I       Toggle SMP view: '\0011\02' single/separate states; '\01I\02' Irix/Solaris mode\n" \
   "\n" \
   "  f,o     . Fields/Columns: '\01f\02' add or remove; '\01o\02' change display order\n" \
   "  F or O  . Select sort field\n" \
   "  <,>     . Move sort field: '\01<\02' next col left; '\01>\02' next col right\n" \
   "  R,H     . Toggle: '\01R\02' normal/reverse sort; '\01H\02' show threads\n" \
   "  c,i,S   . Toggle: '\01c\02' cmd name/line; '\01i\02' idle tasks; '\01S\02' cumulative time\n" \
   "  x\05,\01y\05     . Toggle highlights: '\01x\02' sort field; '\01y\02' running tasks\n" \
   "  z\05,\01b\05     . Toggle: '\01z\02' color/mono; '\01b\02' bold/reverse (only if 'x' or 'y')\n" \
   "  u       . Show specific user only\n" \
   "  n or #  . Set maximum tasks displayed\n" \
   "\n" \
   "%s" \
   "  W         Write configuration file\n" \
   "  q         Quit\n" \
   "          ( commands shown with '.' require a \01visible\02 task display \01window\02 ) \n" \
   "Press '\01h\02' or '\01?\02' for help with \01Windows\02,\n" \
   "any other key to continue " \
   ""

// This guy goes into the help text (maybe)
#define KEYS_help_unsecured \
   "  k,r       Manipulate tasks: '\01k\02' kill; '\01r\02' renice\n" \
   "  d or s    Set update interval\n" \
   ""

// Fields Reorder/Toggle specially formatted string(s) --
// see 'show_special' for syntax details + other cautions
// note: the leading newline below serves really dumb terminals;
//       if there's no 'cursor_home', the screen will be a mess
//       but this part will still be functional.
#define FIELDS_current \
   "\n%sCurrent Fields\02: \01 %s \04 for window \01%s\06\n%s " \
   ""

// Some extra explanatory text which accompanies the Fields display.
// note: the newlines cannot actually be used, they just serve as
// substring delimiters for the 'display_fields' routine.
#define FIELDS_xtra \
   "Flags field:\n" \
   "  0x00000001  PF_ALIGNWARN\n" \
   "  0x00000002  PF_STARTING\n" \
   "  0x00000004  PF_EXITING\n" \
   "  0x00000040  PF_FORKNOEXEC\n" \
   "  0x00000100  PF_SUPERPRIV\n" \
   "  0x00000200  PF_DUMPCORE\n" \
   "  0x00000400  PF_SIGNALED\n" \
   "  0x00000800  PF_MEMALLOC\n" \
   "  0x00002000  PF_FREE_PAGES (2.5)\n" \
   "  0x00008000  debug flag (2.5)\n" \
   "  0x00024000  special threads (2.5)\n" \
   "  0x001D0000  special states (2.5)\n" \
   "  0x00100000  PF_USEDFPU (thru 2.4)\n" \
   ""
/* no room, sacrificed this one:  'Killed for out-of-memory' */
/* "  0x00001000  PF_MEMDIE (2.5)\n" ....................... */

// Sort Select specially formatted string(s) --
// see 'show_special' for syntax details + other cautions
// note: the leading newline below serves really dumb terminals;
//       if there's no 'cursor_home', the screen will be a mess
//       but this part will still be functional.
#define SORT_fields \
   "\n%sCurrent Sort Field\02: \01 %c \04 for window \01%s\06\n%s " \
   ""

// Some extra explanatory text which accompanies the Sort display.
// note: the newlines cannot actually be used, they just serve as
//       substring delimiters for the 'display_fields' routine.
#define SORT_xtra \
   "Note1:\n" \
   "  If a selected sort field can't be\n" \
   "  shown due to screen width or your\n" \
   "  field order, the '<' and '>' keys\n" \
   "  will be unavailable until a field\n" \
   "  within viewable range is chosen.\n" \
   "\n" \
   "Note2:\n" \
   "  Field sorting uses internal values,\n" \
   "  not those in column display.  Thus,\n" \
   "  the TTY & WCHAN fields will violate\n" \
   "  strict ASCII collating sequence.\n" \
   "  (shame on you if WCHAN is chosen)\n" \
   ""

// Colors Help specially formatted string(s) --
// see 'show_special' for syntax details + other cautions.
#define COLOR_help \
   "Help for color mapping\02 - %s\n" \
   "current window: \01%s\06\n" \
   "\n" \
   "   color - 04:25:44 up 8 days, 50 min,  7 users,  load average:\n" \
   "   Tasks:\03  64 \02total,\03   2 \03running,\03  62 \02sleeping,\03   0 \02stopped,\03\n" \
   "   Cpu(s):\03  76.5%% \02user,\03  11.2%% \02system,\03   0.0%% \02nice,\03  12.3%% \02idle\03\n" \
   "   \01 Nasty Message! \04  -or-  \01Input Prompt\05\n" \
   "   \01  PID TTY     PR  NI %%CPU    TIME+   VIRT SWAP STA Command  \06\n" \
   "   17284 \10pts/2  \07  8   0  0.0   0:00.75  1380    0 S   /bin/bash \10\n" \
   "   \01 8601 pts/1    7 -10  0.4   0:00.03   916    0 R < color -b \07\n" \
   "   11005 \10?      \07  9   0  0.0   0:02.50  2852 1008 S   amor -ses \10\n" \
   "   available toggles: \01B\02 =disable bold globally (\01%s\02),\n" \
   "       \01z\02 =color/mono (\01%s\02), \01b\02 =tasks \"bold\"/reverse (\01%s\02)\n" \
   "\n" \
   "Select \01target\02 as upper case letter:\n" \
   "   S\02 = Summary Data,\01  M\02 = Messages/Prompts,\n" \
   "   H\02 = Column Heads,\01  T\02 = Task Information\n" \
   "Select \01color\02 as number:\n" \
   "   0\02 = black,\01  1\02 = red,    \01  2\02 = green,\01  3\02 = yellow,\n" \
   "   4\02 = blue, \01  5\02 = magenta,\01  6\02 = cyan, \01  7\02 = white\n" \
   "\n" \
   "Selected: \01target\02 \01 %c \04; \01color\02 \01 %d \04\n" \
   "   press 'q' to abort changes to window '\01%s\02'\n" \
   "   press 'a' or 'w' to commit & change another, <Enter> to commit and end " \
   ""

// Windows/Field Group Help specially formatted string(s) --
// see 'show_special' for syntax details + other cautions.
#define WINDOWS_help \
   "Help for Windows / Field Groups\02 - \"Current Window\" = \01 %s \06\n" \
   "\n" \
   ". Use multiple \01windows\02, each with separate config opts (color,fields,sort,etc)\n" \
   ". The 'current' window controls the \01Summary Area\02 and responds to your \01Commands\02\n" \
   "  . that window's \01task display\02 can be turned \01Off\02 & \01On\02, growing/shrinking others\n" \
   "  . with \01NO\02 task display, some commands will be \01disabled\02 ('i','R','n','c', etc)\n" \
   "    until a \01different window\02 has been activated, making it the 'current' window\n" \
   ". You \01change\02 the 'current' window by: \01 1\02) cycling forward/backward;\01 2\02) choosing\n" \
   "  a specific field group; or\01 3\02) exiting the color mapping screen\n" \
   ". Commands \01available anytime   -------------\02\n" \
   "    A       . Alternate display mode toggle, show \01Single\02 / \01Multiple\02 windows\n" \
   "    G       . Choose another field group and make it 'current', or change now\n" \
   "              by selecting a number from: \01 1\02 =%s;\01 2\02 =%s;\01 3\02 =%s; or\01 4\02 =%s\n" \
   ". Commands \01requiring\02 '\01A\02' mode\01  -------------\02\n" \
   "    g       . Change the \01Name\05 of the 'current' window/field group\n" \
   " \01*\04  a , w   . Cycle through all four windows:  '\01a\05' Forward; '\01w\05' Backward\n" \
   " \01*\04  - , _   . Show/Hide:  '\01-\05' \01Current\02 window; '\01_\05' all \01Visible\02/\01Invisible\02\n" \
   "  The screen will be divided evenly between task displays.  But you can make\n" \
   "  some \01larger\02 or \01smaller\02, using '\01n\02' and '\01i\02' commands.  Then later you could:\n" \
   " \01*\04  = , +   . Rebalance tasks:  '\01=\05' \01Current\02 window; '\01+\05' \01Every\02 window\n" \
   "              (this also forces the \01current\02 or \01every\02 window to become visible)\n" \
   "\n" \
   "In '\01A\02' mode, '\01*\04' keys are your \01essential\02 commands.  Please try the '\01a\02' and '\01w\02'\n" \
   "commands plus the 'G' sub-commands NOW.  Press <Enter> to make 'Current' " \
   ""


/*######  For Piece of mind  #############################################*/

        /* just sanity check(s)... */
#if USRNAMSIZ < GETBUFSIZ
# error "Jeeze, USRNAMSIZ Must NOT be less than GETBUFSIZ !"
#endif



#endif /* _Itop */
