diff --git a/kittens/diff/render.py b/kittens/diff/render.py index cb7420af8..af4b0f2bc 100644 --- a/kittens/diff/render.py +++ b/kittens/diff/render.py @@ -9,7 +9,7 @@ from math import ceil from kitty.fast_data_types import truncate_point_for_length, wcswidth -from ..tui.images import can_display_images, screen_size +from ..tui.images import can_display_images from .collect import ( Segment, data_for_path, highlights_for_path, is_image, lines_for_path, path_name_map, sanitize @@ -371,12 +371,11 @@ def rename_lines(path, other_path, args, columns, margin_size): class Image: - def __init__(self, image_id, width, height, margin_size): + def __init__(self, image_id, width, height, margin_size, screen_size): self.image_id = image_id self.width, self.height = width, height - ss = screen_size() - self.rows = int(ceil(self.height / ss.cell_height)) - self.columns = int(ceil(self.width / ss.cell_width)) + self.rows = int(ceil(self.height / screen_size.cell_height)) + self.columns = int(ceil(self.width / screen_size.cell_width)) self.margin_size = margin_size @@ -400,7 +399,7 @@ def render_image(path, is_left, available_cols, margin_size, image_manager): lnum += 1 try: - image_id, width, height = image_manager.send_image(path, available_cols - margin_size, screen_size().rows - 2) + image_id, width, height = image_manager.send_image(path, available_cols - margin_size, image_manager.screen_size.rows - 2) except Exception as e: yield from yield_split(_('Failed to render image, with error:')) yield from yield_split(' '.join(str(e).splitlines())) @@ -409,7 +408,7 @@ def render_image(path, is_left, available_cols, margin_size, image_manager): width, height, human_readable(len(data_for_path(path)))) yield from yield_split(meta) bg_line = m + fmt(' ' * available_cols) - img = Image(image_id, width, height, margin_size) + img = Image(image_id, width, height, margin_size, image_manager.screen_size) for r in range(img.rows): yield bg_line, Reference(path, LineRef(lnum)), ImagePlacement(img, r) lnum += 1 diff --git a/kittens/tui/images.py b/kittens/tui/images.py index 0a69ec590..26c76ff5c 100644 --- a/kittens/tui/images.py +++ b/kittens/tui/images.py @@ -9,7 +9,7 @@ from base64 import standard_b64encode from collections import defaultdict, deque from itertools import count -from kitty.utils import fit_image, screen_size_function +from kitty.utils import fit_image from .operations import cursor @@ -18,7 +18,6 @@ try: codecs.lookup(fsenc) except Exception: fsenc = 'utf-8' -screen_size = screen_size_function() class ImageData: @@ -123,6 +122,10 @@ class ImageManager: def next_image_id(self): return next(self.image_id_counter) + 2 + @property + def screen_size(self): + return self.handler.screen_size + def __enter__(self): import tempfile self.tdir = tempfile.mkdtemp(prefix='kitten-images-') @@ -190,7 +193,7 @@ class ImageManager: self.failed_images[path] = e raise m = self.image_data[path] - ss = screen_size() + ss = self.screen_size if max_cols is None: max_cols = ss.cols if max_rows is None: diff --git a/kittens/tui/loop.py b/kittens/tui/loop.py index c8661b0ee..062ba54d8 100644 --- a/kittens/tui/loop.py +++ b/kittens/tui/loop.py @@ -27,8 +27,6 @@ from kitty.utils import screen_size_function from .handler import Handler from .operations import init_state, reset_state -screen_size = screen_size_function() - def debug(*a, **kw): from base64 import standard_b64encode @@ -156,6 +154,7 @@ class Loop: sanitize_bracketed_paste='[\x03\x04\x0e\x0f\r\x07\x7f\x8d\x8e\x8f\x90\x9b\x9d\x9e\x9f]'): self.input_fd = sys.stdin.fileno() if input_fd is None else input_fd self.output_fd = sys.stdout.fileno() if output_fd is None else output_fd + self._get_screen_size = screen_size_function(self.output_fd) self.wakeup_read_fd, self.wakeup_write_fd = safe_pipe() # For some reason on macOS the DefaultSelector fails when input_fd is # open('/dev/tty') @@ -320,8 +319,8 @@ class Loop: def _wakeup_ready(self, handler): data = os.read(self.wakeup_read_fd, 1024) if b'r' in data: - screen_size.changed = True - handler.on_resize(screen_size()) + self._get_screen_size.changed = True + handler.on_resize(self._get_screen_size()) if b't' in data: handler.on_term() if b'i' in data: @@ -386,7 +385,7 @@ class Loop: image_manager = handler.image_manager_class(handler) keep_going = True try: - handler._initialize(screen_size(), self.quit, self.wakeup, self.start_job, debug, image_manager) + handler._initialize(self._get_screen_size(), self.quit, self.wakeup, self.start_job, debug, image_manager) with handler: while keep_going: has_data_to_write = bool(handler.write_buf) @@ -415,7 +414,7 @@ class Loop: handler = UnhandledException(tb) handler.write_buf = [] handler._term_manager = term_manager - handler._initialize(screen_size(), self.quit, self.wakeup, self.start_job, debug) + handler._initialize(self._get_screen_size(), self.quit, self.wakeup, self.start_job, debug) with handler: while True: has_data_to_write = bool(handler.write_buf)