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: