Make screen_size handling in tui cleaner
Now screen size is fetched only for output_fd rather than sys.stdout
This commit is contained in:
parent
c8e9199b03
commit
97c317b735
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user