Re: Scrolling in top(1)

2020-01-05 Thread Vadim Zhukov
5 января 2020 г. 22:37:05 GMT+02:00, Ted Unangst  пишет:
>Vadim Zhukov wrote:
>> Today I get really upset and angry due limitation of top(1): it shows
>> only hrrm, top processes (thank you, Chromium). Now here is a diff
>that
>> allows you to scroll process list by line or by half a screen.
>> 
>> I've used the '0' and '9' keys to scroll down and up, respectively.
>> Unfortunately, 'k' is already taken, so vi-like binding to 'j'/'k'
>keys
>> is not possible. And emacs-style 'v'-for-all looks like too complex.
>> Anyone, who wants to use up/down and page up/page down keys, be my
>guest
>> for converting command_chars in top.c to using multi-byte sequences,
>> or whatever is needed for proper handling of those keys.
>> 
>> Ideas, comments and (may I hope?) okays are welcome. :)
>
>One of each? It would be nice to extend this with some indication of
>where we
>are in the display (a first line that says skipping 19). I would have
>used
>,.<> as navigation keys, but no matter. And it seems to work great, so
>ok.

Yes, indication would be good and I thought about it, too. But implementing it 
in current top(1) code is not that straightforward, unfortunately, so I planned 
to do this separately, avoiding complication of the current diff. Thanks!
-- 
With best regards,
Vadim Zhukov



Re: Scrolling in top(1)

2020-01-05 Thread Ted Unangst
Vadim Zhukov wrote:
> Today I get really upset and angry due limitation of top(1): it shows
> only hrrm, top processes (thank you, Chromium). Now here is a diff that
> allows you to scroll process list by line or by half a screen.
> 
> I've used the '0' and '9' keys to scroll down and up, respectively.
> Unfortunately, 'k' is already taken, so vi-like binding to 'j'/'k' keys
> is not possible. And emacs-style 'v'-for-all looks like too complex.
> Anyone, who wants to use up/down and page up/page down keys, be my guest
> for converting command_chars in top.c to using multi-byte sequences,
> or whatever is needed for proper handling of those keys.
> 
> Ideas, comments and (may I hope?) okays are welcome. :)

One of each? It would be nice to extend this with some indication of where we
are in the display (a first line that says skipping 19). I would have used
,.<> as navigation keys, but no matter. And it seems to work great, so ok.



Scrolling in top(1)

2020-01-05 Thread Vadim Zhukov
Hi all.

Today I get really upset and angry due limitation of top(1): it shows
only hrrm, top processes (thank you, Chromium). Now here is a diff that
allows you to scroll process list by line or by half a screen.

I've used the '0' and '9' keys to scroll down and up, respectively.
Unfortunately, 'k' is already taken, so vi-like binding to 'j'/'k' keys
is not possible. And emacs-style 'v'-for-all looks like too complex.
Anyone, who wants to use up/down and page up/page down keys, be my guest
for converting command_chars in top.c to using multi-byte sequences,
or whatever is needed for proper handling of those keys.

Ideas, comments and (may I hope?) okays are welcome. :)

--
WBR,
  Vadim Zhukov


Index: machine.c
===
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.101
diff -u -p -r1.101 machine.c
--- machine.c   16 Dec 2019 19:21:17 -  1.101
+++ machine.c   5 Jan 2020 14:10:44 -
@@ -546,6 +546,14 @@ format_comm(struct kinfo_proc *kp)
return (buf);
 }
 
+void
+skip_next_process(struct handle *hndl)
+{
+   /* find and remember the next proc structure */
+   hndl->next_proc++;
+   hndl->remaining--;
+}
+
 char *
 format_next_process(struct handle *hndl, const char *(*get_userid)(uid_t, int),
 pid_t *pid)
Index: machine.h
===
RCS file: /cvs/src/usr.bin/top/machine.h,v
retrieving revision 1.27
diff -u -p -r1.27 machine.h
--- machine.h   8 Oct 2019 20:51:03 -   1.27
+++ machine.h   5 Jan 2020 14:10:44 -
@@ -90,6 +90,7 @@ extern void get_system_info(struct s
 extern struct handle
 *get_process_info(struct system_info *, struct process_select *,
 int (*) (const void *, const void *));
+extern void skip_next_process(struct handle *);
 extern char*format_next_process(struct handle *,
 const char *(*)(uid_t, int), pid_t *);
 extern uid_tproc_owner(pid_t);
Index: top.1
===
RCS file: /cvs/src/usr.bin/top/top.1,v
retrieving revision 1.71
diff -u -p -r1.71 top.1
--- top.1   28 Nov 2018 22:00:30 -  1.71
+++ top.1   5 Jan 2020 14:10:44 -
@@ -291,6 +291,10 @@ or any process highlighting put in place
 interactive command.
 .It 1
 Toggle the display of per CPU or combined CPU statistics.
+.It 9 | 0 
+Scroll up/down the process list by one line.
+.It \&( | \&) 
+Scroll up/down the process list by screen half.
 .It C
 Toggle the display of process command line arguments.
 .It d Ar count
Index: top.c
===
RCS file: /cvs/src/usr.bin/top/top.c,v
retrieving revision 1.101
diff -u -p -r1.101 top.c
--- top.c   8 Oct 2019 20:51:03 -   1.101
+++ top.c   5 Jan 2020 14:10:44 -
@@ -68,6 +68,7 @@ static void   reset_display(void);
 intrundisplay(void);
 
 static int max_topn;   /* maximum displayable processes */
+static int skip;   /* how many processes to skip (scroll) */
 
 extern int ncpu;
 extern int ncpuonline;
@@ -126,6 +127,10 @@ struct statics  statics;
 #define CMD_add21
 #define CMD_hl 22
 #define CMD_cpus   23
+#define CMD_down   24
+#define CMD_up 25
+#define CMD_pagedown   26
+#define CMD_pageup 27
 
 static void
 usage(void)
@@ -557,6 +562,15 @@ restart:
active_procs = topn;
if (active_procs > max_topn)
active_procs = max_topn;
+   /* determine how many process to skip, if asked to */
+   /*
+* this number is tweaked by user, but gets shrinked
+* when number of active processes lowers too much
+*/
+   if (skip + active_procs > system_info.p_active)
+   skip = system_info.p_active - active_procs;
+   for (i = skip; i > 0; i--)
+   skip_next_process(processes);
/* now show the top "n" processes. */
for (i = 0; i < active_procs; i++) {
pid_t pid;
@@ -618,7 +632,7 @@ rundisplay(void)
char ch, *iptr;
int change, i;
struct pollfd pfd[1];
-   static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P1";
+   static char command_chars[] = "\f qh?en#sdkriIuSopCHg+P109)(";
 
/*
 * assume valid command unless told
@@ -966,6 +980,21 @@ rundisplay(void)
combine_cpus = !combine_cpus;
max_topn = display_resize();
reset_display();
+   break;
+   case CMD_down:
+   skip++;
+   break;
+   case CMD_up: