summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Wise <pabs3@bonedaddy.net>2016-08-04 18:53:37 +0800
committerPaul Wise <pabs3@bonedaddy.net>2016-08-04 19:05:49 +0800
commit877679bf74d1c84040f00eec2a42e2ace056e45e (patch)
treef42c255e36ef48ce09b6e2ca6777454d434bf6ac
parent529a74a28be43c04840d937c87a5ee3b81133852 (diff)
downloadiotop-877679bf74d1c84040f00eec2a42e2ace056e45e.tar.gz
Add a footer listing keyboard shortcuts
This makes the program more friendly to new users. Implements: https://bugs.launchpad.net/ubuntu/+source/iotop/+bug/1429645
-rw-r--r--iotop.83
-rw-r--r--iotop/ui.py66
2 files changed, 64 insertions, 5 deletions
diff --git a/iotop.8 b/iotop.8
index ca9263e..fae92fd 100644
--- a/iotop.8
+++ b/iotop.8
@@ -70,6 +70,9 @@ Add a timestamp on each line (implies \-\-batch). Each line will be prefixed by
.TP
\fB\-q\fR, \fB\-\-quiet\fR
suppress some lines of header (implies \-\-batch). This option can be specified up to three times to remove header lines.
+.TP
+\fB\-\-no\-help\fR
+Suppress the keyboard shortcuts help display.
.RS
.PD 0
.TP
diff --git a/iotop/ui.py b/iotop/ui.py
index a957bdd..f7ef654 100644
--- a/iotop/ui.py
+++ b/iotop/ui.py
@@ -29,6 +29,7 @@ import select
import signal
import sys
import time
+from collections import OrderedDict
from iotop.data import find_uids, TaskStatsNetlink, ProcessList, Stats
from iotop.data import ThreadInfo
@@ -202,12 +203,17 @@ class IOTopUI(object):
def adjust_sorting_key(self, delta):
orig_sorting_key = self.sorting_key
- self.sorting_key += delta
- self.sorting_key = max(0, self.sorting_key)
- self.sorting_key = min(len(IOTopUI.sorting_keys) - 1, self.sorting_key)
+ self.sorting_key = self.get_sorting_key(delta)
if orig_sorting_key != self.sorting_key:
self.sorting_reverse = IOTopUI.sorting_keys[self.sorting_key][1]
+ def get_sorting_key(self, delta):
+ new_sorting_key = self.sorting_key
+ new_sorting_key += delta
+ new_sorting_key = max(0, new_sorting_key)
+ new_sorting_key = min(len(IOTopUI.sorting_keys) - 1, new_sorting_key)
+ return new_sorting_key
+
# I wonder if switching to urwid for the display would be better here
def prompt_str(self, prompt, default=None, empty_is_cancel=True):
@@ -479,10 +485,47 @@ class IOTopUI(object):
status_msg = ('CONFIG_TASK_DELAY_ACCT not enabled in kernel, '
'cannot determine SWAPIN and IO %')
+ help_lines = []
+ help_attrs = []
+ if self.options.help:
+ prev = self.get_sorting_key(-1)
+ next = self.get_sorting_key(1)
+ help = OrderedDict([
+ ('keys', ''),
+ ('any', 'refresh'),
+ ('q', 'quit'),
+ ('i', 'ionice'),
+ ('o', 'all' if self.options.only else 'active'),
+ ('p', 'threads' if self.options.processes else 'procs'),
+ ('a', 'bandwidth' if self.options.accumulated else 'accum'),
+ ('sort', ''),
+ ('r', 'asc' if self.sorting_reverse else 'desc'),
+ ('left', titles[prev].strip()),
+ ('right', titles[next].strip()),
+ ('home', titles[0].strip()),
+ ('end', titles[-1].strip()),
+ ])
+ help_line = -1
+ for key, help in help.items():
+ if help:
+ help_item = [' ', key, ': ', help]
+ help_attr = [0, 0 if key == 'any' else curses.A_UNDERLINE, 0, 0]
+ else:
+ help_item = [' ', key, ':']
+ help_attr = [0, 0, 0]
+ if not help_lines or not help or len(''.join(help_lines[help_line]) + ''.join(help_item)) > self.width:
+ help_lines.append(help_item)
+ help_attrs.append(help_attr)
+ help_line += 1
+ else:
+ help_lines[help_line] += help_item
+ help_attrs[help_line] += help_attr
+
len_summary = len(summary)
len_titles = int(bool(titles))
len_status_msg = int(bool(status_msg))
- max_lines = self.height - len_summary - len_titles - len_status_msg
+ len_help = len(help_lines)
+ max_lines = self.height - len_summary - len_titles - len_status_msg - len_help
if max_lines < 5:
titles = []
len_titles = 0
@@ -492,7 +535,11 @@ class IOTopUI(object):
if max_lines < 7:
status_msg = None
len_status_msg = 0
- max_lines = self.height - len_summary - len_titles - len_status_msg
+ if max_lines < 8:
+ help_lines = []
+ help_attrs = []
+ len_help = 0
+ max_lines = self.height - len_summary - len_titles - len_status_msg - len_help
num_lines = min(len(lines), max_lines)
for i, s in enumerate(summary):
@@ -526,6 +573,13 @@ class IOTopUI(object):
print_line(lines[i].encode('utf-8'))
except curses.error:
pass
+ for ln in range(len_help):
+ line = self.height - len_status_msg - len_help + ln
+ self.win.hline(line, 0, ord(' ') | curses.A_REVERSE, self.width)
+ pos = 0
+ for i in range(len(help_lines[ln])):
+ self.win.insstr(line, pos, help_lines[ln][i], curses.A_REVERSE | help_attrs[ln][i])
+ pos += len(help_lines[ln][i])
if status_msg:
self.win.insstr(self.height - 1, 0, status_msg,
curses.A_BOLD)
@@ -648,6 +702,8 @@ def main():
help='suppress some lines of header (implies --batch)')
parser.add_option('--profile', action='store_true', dest='profile',
default=False, help=optparse.SUPPRESS_HELP)
+ parser.add_option('--no-help', action='store_false', dest='help', default=True,
+ help='suppress listing of shortcuts')
options, args = parser.parse_args()
if args: