diff --git a/lib/_emerge/JobStatusDisplay.py b/lib/_emerge/JobStatusDisplay.py index 57495c5ae5..dd009c1689 100644 --- a/lib/_emerge/JobStatusDisplay.py +++ b/lib/_emerge/JobStatusDisplay.py @@ -65,11 +65,7 @@ def __init__(self, quiet=False, xterm_titles=True): if not isinstance(v, str): self._term_codes[k] = v.decode(encoding, "replace") - if self._isatty: - width = portage.output.get_term_size()[1] - else: - width = self.max_display_width - self._set_width(width) + self.sigwinch() def _set_width(self, width): if width == getattr(self, "width", None): @@ -79,6 +75,13 @@ def _set_width(self, width): object.__setattr__(self, "width", width) object.__setattr__(self, "_jobs_column_width", width - 32) + def sigwinch(self): + if self._isatty: + width = portage.output.get_term_size()[1] + else: + width = self.max_display_width + self._set_width(width) + @property def out(self): """Use a lazy reference to sys.stdout, in case the API consumer has diff --git a/lib/_emerge/Scheduler.py b/lib/_emerge/Scheduler.py index fea151d5d1..96843c96ee 100644 --- a/lib/_emerge/Scheduler.py +++ b/lib/_emerge/Scheduler.py @@ -1177,6 +1177,9 @@ def sighandler(signum, frame): ) signal.siginterrupt(signal.SIGCONT, False) + earlier_sigwinch_handler = signal.signal( + signal.SIGWINCH, self._sigwinch_handler + ) try: rval = self._merge() finally: @@ -1194,6 +1197,11 @@ def sighandler(signum, frame): else: signal.signal(signal.SIGCONT, signal.SIG_DFL) + if earlier_sigwinch_handler is not None: + signal.signal(signal.SIGWINCH, earlier_sigwinch_handler) + else: + signal.signal(signal.SIGWINCH, signal.SIG_DFL) + self._termination_check() if received_signal: sys.exit(received_signal[0]) @@ -1909,6 +1917,9 @@ def _schedule_merge_wakeup(self, future): def _sigcont_handler(self, signum, frame): self._sigcont_time = time.time() + def _sigwinch_handler(self, signum, frame): + self._status_display.sigwinch() + def _job_delay(self): """ @rtype: bool diff --git a/lib/portage/output.py b/lib/portage/output.py index 4408705c45..7457111f6d 100644 --- a/lib/portage/output.py +++ b/lib/portage/output.py @@ -522,16 +522,8 @@ def get_term_size(fd=None): fd = sys.stdout if not hasattr(fd, "isatty") or not fd.isatty(): return (0, 0) - try: - import curses - - try: - curses.setupterm(term=os.environ.get("TERM", "unknown"), fd=fd.fileno()) - return curses.tigetnum("lines"), curses.tigetnum("cols") - except curses.error: - pass - except ImportError: - pass + + # Do not use curses because it returns stale values after terminal resize. try: proc = subprocess.Popen(["stty", "size"], stdout=subprocess.PIPE, stderr=fd)