Although the feature *might* be useful (just woken up, so haven't given
it too much thought), the bindings have some problems and need to be
reworked if we decide to get this in. Problems that I see from just a
few short tests (so there might be others):
- Entering sticky: H, which also enters help, which is annoying if I
  want sticky ^G.
- Clearing sticky: h, which also displays help, which if I come from
  ^G is not what I want and if I'm in help is confusing, because I want
  to get rid of it.

martijn@

On Sun, 2021-02-28 at 19:40 -0800, Anindya Mukherjee wrote:
> Hi,
> 
> I tend to keep systat(1) running in interactive mode, and find it very
> useful to have the help line displayed permanently, i.e., not disappear
> if a key is pressed or after a command is executed. The same goes for
> the Ctrl-G display. For example, it tells me what modes are adjacent to
> the currently active one when pressing left or right arrow keys.
> 
> The attached diff adds this feature. It is off by default. I noticed
> that the 'h' key was not documented in the man page, so I took the
> liberty of adding a line describing it.
> 
> Hope it is useful. Please have a look, thanks!
> 
> Regards,
> Anindya
> 
> Index: engine.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/engine.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 engine.c
> --- engine.c    6 Feb 2021 06:19:28 -0000       1.27
> +++ engine.c    1 Mar 2021 03:20:41 -0000
> @@ -70,6 +70,8 @@ volatile sig_atomic_t gotsig_alarm = 0;
>  int need_update = 0;
>  int need_sort = 0;
>  int separate_thousands = 0;
> +int viewmode = 0;
> +int sticky = 0;
>  
>  SCREEN *screen;
>  
> @@ -1139,7 +1141,9 @@ command_set(struct command *cmd, const c
>                         cmdbuf[0] = 0;
>                 }
>         }
> -       message_set(NULL);
> +
> +       if (!sticky)
> +               message_set(NULL);
>         curr_cmd = cmd;
>         need_update = 1;
>         return prev;
> @@ -1234,7 +1238,7 @@ keyboard(void)
>                                 return;
>  
>         if (curr_message != NULL) {
> -               if (ch > 0) {
> +               if (ch > 0 && !sticky) {
>                         message_set(NULL);
>                         need_update = 1;
>                 }
> @@ -1359,8 +1363,15 @@ engine_loop(int countmax)
>                 if (need_update) {
>                         erase();
>                         if (!averageonly ||
> -                           (averageonly && count == countmax - 1))
> +                           (averageonly && count == countmax - 1)) {
>                                 disp_update();
> +                               if (interactive && sticky) {
> +                                       if (viewmode)
> +                                               show_view();
> +                                       else
> +                                               show_help();
> +                               }
> +                       }
>                         end_page();
>                         need_update = 0;
>                         if (countmax && ++count >= countmax)
> Index: engine.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/engine.h,v
> retrieving revision 1.12
> diff -u -p -r1.12 engine.h
> --- engine.h    12 Jan 2020 20:51:08 -0000      1.12
> +++ engine.h    1 Mar 2021 03:20:41 -0000
> @@ -144,6 +144,8 @@ struct command *command_set(struct comma
>  const char *message_set(const char *msg);
>  
>  void foreach_view(void (*callback)(field_view *));
> +void show_help(void);
> +void show_view(void);
>  
>  extern int sortdir;
>  extern useconds_t udelay;
> @@ -160,6 +162,8 @@ extern int columns, lines;
>  extern int need_update;
>  extern int need_sort;
>  extern int separate_thousands;
> +extern int viewmode;
> +extern int sticky;
>  
>  extern volatile sig_atomic_t gotsig_close;
>  extern volatile sig_atomic_t gotsig_resize;
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/main.c,v
> retrieving revision 1.73
> diff -u -p -r1.73 main.c
> --- main.c      30 Jan 2021 08:44:42 -0000      1.73
> +++ main.c      1 Mar 2021 03:20:41 -0000
> @@ -285,6 +285,14 @@ cmd_compat(const char *buf)
>  
>         if (strcasecmp(buf, "help") == 0) {
>                 show_help();
> +               sticky = 0;
> +               need_update = 1;
> +               return;
> +       }
> +       if (strcasecmp(buf, "stickyhelp") == 0) {
> +               show_help();
> +               sticky = 1;
> +               viewmode = 0;
>                 need_update = 1;
>                 return;
>         }
> @@ -359,10 +367,18 @@ keyboard_callback(int ch)
>                 /* FALLTHROUGH */
>         case 'h':
>                 show_help();
> +               sticky = 0;
> +               need_update = 1;
> +               break;
> +       case 'H':
> +               show_help();
> +               sticky = 1;
> +               viewmode = 0;
>                 need_update = 1;
>                 break;
>         case CTRL_G:
>                 show_view();
> +               viewmode = 1;
>                 need_update = 1;
>                 break;
>         case 'l':
> Index: systat.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/systat/systat.1,v
> retrieving revision 1.119
> diff -u -p -r1.119 systat.1
> --- systat.1    22 Jun 2020 13:17:54 -0000      1.119
> +++ systat.1    1 Mar 2021 03:20:41 -0000
> @@ -175,6 +175,8 @@ line typed as a command.
>  While entering a command the
>  current character erase, word erase, and line kill characters
>  may be used.
> +.It Ic h
> +Print the names of the available views on the command line.
>  .It Ic o
>  Select the next ordering which sorts the rows according to a
>  combination of columns.
> @@ -190,6 +192,9 @@ Quit
>  Reverse the selected ordering if supported by the view.
>  .It Ic s
>  Change the screen refresh interval in seconds.
> +.It Ic H
> +Print the names of the available views on the command line.
> +The display becomes sticky. Pressing h clears the sticky state.
>  .It Ic \&,
>  Print numbers with thousand separators, where applicable.
>  .It Ic ^A | Aq Ic Home
> @@ -203,6 +208,7 @@ Select the next view.
>  .It Ic ^G
>  Print the name of the current
>  view being shown and the refresh interval.
> +The display does not clear if sticky help is active.
>  .It Ic ^L
>  Refresh the screen.
>  .It Ic ^N | Aq Ic down arrow
> @@ -230,6 +236,9 @@ Quit
>  .Nm .
>  (This may be abbreviated to
>  .Ic q . )
> +.It Ic stickyhelp
> +Print the names of the available views on the command line.
> +The display becomes sticky. The help command clears the sticky state.
>  .It Ic stop
>  Stop refreshing the screen.
>  .It Xo
> 


Reply via email to