diff --git a/scripts/codemap.py b/scripts/codemap.py index 022f2ce4..1800c035 100755 --- a/scripts/codemap.py +++ b/scripts/codemap.py @@ -92,12 +92,36 @@ class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -116,18 +140,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() diff --git a/scripts/dbgbmap.py b/scripts/dbgbmap.py index f2a2f56e..13a2e437 100755 --- a/scripts/dbgbmap.py +++ b/scripts/dbgbmap.py @@ -3645,17 +3645,40 @@ else: else: self.add_watch(path, flags) -# TODO negative maxlen from terminal height? like -H nowadays? class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -3674,18 +3697,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() @@ -5030,7 +5045,7 @@ if __name__ == "__main__": nargs='?', type=lambda x: int(x, 0), const=0, - help="Show this many lines of history. 0 uses the terminal " + help="Show this many lines of history. <=0 uses the terminal " "height. Defaults to 1.") parser.add_argument( '-^', '--head', diff --git a/scripts/plot.py b/scripts/plot.py index b6ce6036..1b4b468d 100755 --- a/scripts/plot.py +++ b/scripts/plot.py @@ -175,12 +175,36 @@ class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -199,18 +223,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() diff --git a/scripts/tailpipe.py b/scripts/tailpipe.py index f5a07959..8e33afaa 100755 --- a/scripts/tailpipe.py +++ b/scripts/tailpipe.py @@ -38,12 +38,36 @@ class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -62,18 +86,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() @@ -191,7 +207,7 @@ if __name__ == "__main__": nargs='?', type=lambda x: int(x, 0), const=0, - help="Show this many lines of history. 0 uses the terminal " + help="Show this many lines of history. <=0 uses the terminal " "height. Defaults to 5.") parser.add_argument( '-c', '--cat', diff --git a/scripts/tracebd.py b/scripts/tracebd.py index c1b3ae58..38d3f431 100755 --- a/scripts/tracebd.py +++ b/scripts/tracebd.py @@ -145,17 +145,40 @@ def rbydaddr(s): return tuple(addr) -# TODO negative maxlen from terminal height? like -H nowadays? class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -174,18 +197,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() @@ -2764,7 +2779,7 @@ if __name__ == "__main__": nargs='?', type=lambda x: int(x, 0), const=0, - help="Show this many lines of history. 0 uses the terminal " + help="Show this many lines of history. <=0 uses the terminal " "height. Defaults to 1.") parser.add_argument( '-^', '--head', diff --git a/scripts/treemap.py b/scripts/treemap.py index 8f0d91a1..794a4f6d 100755 --- a/scripts/treemap.py +++ b/scripts/treemap.py @@ -85,12 +85,36 @@ class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -109,18 +133,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() diff --git a/scripts/watch.py b/scripts/watch.py index de540b14..8672a01b 100755 --- a/scripts/watch.py +++ b/scripts/watch.py @@ -76,12 +76,36 @@ class RingIO: def __init__(self, maxlen=None, head=False): self.maxlen = maxlen self.head = head - self.lines = co.deque(maxlen=maxlen) + self.lines = co.deque( + maxlen=max(maxlen, 0) if maxlen is not None else None) self.tail = io.StringIO() # trigger automatic sizing - if maxlen == 0: - self.resize(0) + self.resize(self.maxlen) + + @property + def width(self): + # just fetch this on demand, we don't actually use width + return shutil.get_terminal_size((80, 5))[0] + + @property + def height(self): + # calculate based on terminal height? + if self.maxlen is None or self.maxlen <= 0: + return max( + shutil.get_terminal_size((80, 5))[1] + + (self.maxlen or 0), + 0) + # limit to maxlen + else: + return self.maxlen + + def resize(self, maxlen): + self.maxlen = maxlen + if maxlen is not None and maxlen <= 0: + maxlen = self.height + if maxlen != self.lines.maxlen: + self.lines = co.deque(self.lines, maxlen=maxlen) def __len__(self): return len(self.lines) @@ -100,18 +124,10 @@ class RingIO: if lines[-1]: self.tail.write(lines[-1]) - def resize(self, maxlen): - self.maxlen = maxlen - if maxlen == 0: - maxlen = shutil.get_terminal_size((80, 5))[1] - if maxlen != self.lines.maxlen: - self.lines = co.deque(self.lines, maxlen=maxlen) - canvas_lines = 1 def draw(self): # did terminal size change? - if self.maxlen == 0: - self.resize(0) + self.resize(self.maxlen) # copy lines lines = self.lines.copy() @@ -200,9 +216,10 @@ def main(command, *, mpty, spty = pty.openpty() # forward terminal size - w, h = shutil.get_terminal_size((80, 5)) - if lines: - h = lines + if cat: + w, h = shutil.get_terminal_size((80, 5)) + else: + w, h = ring.width, ring.height fcntl.ioctl(spty, termios.TIOCSWINSZ, struct.pack('HHHH', h, w, 0, 0)) @@ -278,7 +295,7 @@ if __name__ == "__main__": nargs='?', type=lambda x: int(x, 0), const=0, - help="Show this many lines of history. 0 uses the terminal " + help="Show this many lines of history. <=0 uses the terminal " "height. Defaults to 0.") parser.add_argument( '-^', '--head', @@ -295,13 +312,14 @@ if __name__ == "__main__": parser.add_argument( '-k', '--keep-open', action='store_true', - help="Try to use inotify to wait for changes.") + help="Try to use inotify to wait for changes. Defaults to " + "guessing, or explicit paths can be provided with " + "-K/--keep-open-path.") parser.add_argument( '-K', '--keep-open-path', dest='keep_open_paths', action='append', - help="Use this path for inotify. Defaults to guessing. Implies " - "--keep-open.") + help="Use this path for inotify. Implies --keep-open.") parser.add_argument( '-b', '--buffer', action='store_true',