From c11da595ef7684b84a84b3af5c6b274a6ad2c6f7 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 5 Dec 2021 12:21:24 +0530 Subject: [PATCH] Move calculation of window render data into native code There was no reason to do it in python --- kitty/fast_data_types.pyi | 6 ++---- kitty/state.c | 17 +++++++++++++++-- kitty/tab_bar.py | 6 ++---- kitty/types.py | 9 --------- kitty/window.py | 23 +++-------------------- 5 files changed, 22 insertions(+), 39 deletions(-) diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index ae4779987..ea066fde7 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -1146,15 +1146,13 @@ class Screen: def set_tab_bar_render_data( - os_window_id: int, xstart: float, ystart: float, dx: float, dy: float, - screen: Screen + os_window_id: int, screen: Screen, left: int, top: int, right: int, bottom: int ) -> None: pass def set_window_render_data( - os_window_id: int, tab_id: int, window_id: int, - xstart: float, ystart: float, dx: float, dy: float, screen: Screen, + os_window_id: int, tab_id: int, window_id: int, screen: Screen, left: int, top: int, right: int, bottom: int ) -> None: pass diff --git a/kitty/state.c b/kitty/state.c index 6c138407c..8594bdb6c 100644 --- a/kitty/state.c +++ b/kitty/state.c @@ -705,13 +705,25 @@ PYWRAP1(set_options) { BOOL_SET(in_sequence_mode) +static void +init_screen_render_data(OSWindow *osw, const WindowGeometry *g, ScreenRenderData *d) { + d->dx = (2.f * osw->fonts_data->cell_width) / (float)osw->viewport_width; + d->dy = (2.f * osw->fonts_data->cell_height) / (float)osw->viewport_height; + float xmargin = g->left / (float)osw->viewport_width, ymargin = g->top / (float)osw->viewport_height; + d->xstart = -1.f + 2.f * xmargin; + d->ystart = 1.f - 2.f * ymargin; + +} + PYWRAP1(set_tab_bar_render_data) { ScreenRenderData d = {0}; + WindowGeometry g = {0}; id_type os_window_id; - PA("KffffO", &os_window_id, &d.xstart, &d.ystart, &d.dx, &d.dy, &d.screen); + PA("KOIIII", &os_window_id, &d.screen, &g.left, &g.top, &g.right, &g.bottom); WITH_OS_WINDOW(os_window_id) Py_CLEAR(os_window->tab_bar_render_data.screen); d.vao_idx = os_window->tab_bar_render_data.vao_idx; + init_screen_render_data(os_window, &g, &d); os_window->tab_bar_render_data = d; Py_INCREF(os_window->tab_bar_render_data.screen); END_WITH_OS_WINDOW @@ -867,12 +879,13 @@ PYWRAP1(set_window_render_data) { id_type os_window_id, tab_id, window_id; ScreenRenderData d = {0}; WindowGeometry g = {0}; - PA("KKKffffOIIII", &os_window_id, &tab_id, &window_id, A(xstart), A(ystart), A(dx), A(dy), A(screen), B(left), B(top), B(right), B(bottom)); + PA("KKKOIIII", &os_window_id, &tab_id, &window_id, A(screen), B(left), B(top), B(right), B(bottom)); WITH_WINDOW(os_window_id, tab_id, window_id); Py_CLEAR(window->render_data.screen); d.vao_idx = window->render_data.vao_idx; d.gvao_idx = window->render_data.gvao_idx; + init_screen_render_data(osw, &g, &d); window->render_data = d; window->geometry = g; Py_INCREF(window->render_data.screen); diff --git a/kitty/tab_bar.py b/kitty/tab_bar.py index a0f46858c..9e121c2f6 100644 --- a/kitty/tab_bar.py +++ b/kitty/tab_bar.py @@ -18,7 +18,6 @@ from .rgb import alpha_blend, color_as_sgr, color_from_int, to_color from .types import WindowGeometry, run_once from .typing import EdgeLiteral, PowerlineStyle from .utils import color_as_int, log_error -from .window import calculate_gl_geometry class TabBarData(NamedTuple): @@ -523,9 +522,8 @@ class TabBar: margin = (viewport_width - ncells * cell_width) // 2 + self.margin_width self.window_geometry = g = WindowGeometry( margin, tab_bar.top, viewport_width - margin, tab_bar.bottom, s.columns, s.lines) - self.screen_geometry = sg = calculate_gl_geometry(g, vw, vh, cell_width, cell_height) self.update_blank_rects(central, tab_bar, vw, vh) - set_tab_bar_render_data(self.os_window_id, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen) + set_tab_bar_render_data(self.os_window_id, self.screen, *g[:4]) def update(self, data: Sequence[TabBarData]) -> None: if not self.laid_out_once: @@ -533,7 +531,7 @@ class TabBar: s = self.screen s.cursor.x = 0 s.erase_in_line(2, False) - max_title_length = max(1, (self.screen_geometry.xnum // max(1, len(data))) - 1) + max_title_length = max(1, (self.screen.columns // max(1, len(data))) - 1) cr = [] last_tab = data[-1] if data else None ed = ExtraData() diff --git a/kitty/types.py b/kitty/types.py index 89f9f3031..8ff67f8af 100644 --- a/kitty/types.py +++ b/kitty/types.py @@ -28,15 +28,6 @@ class FloatEdges(NamedTuple): bottom: float = 0 -class ScreenGeometry(NamedTuple): - xstart: float - ystart: float - xnum: int - ynum: int - dx: float - dy: float - - class WindowGeometry(NamedTuple): left: int top: int diff --git a/kitty/window.py b/kitty/window.py index 721bbddab..97b08a91a 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -32,14 +32,14 @@ from .fast_data_types import ( mouse_selection, move_cursor_to_mouse_if_in_prompt, pt_to_px, set_clipboard_string, set_titlebar_color, set_window_logo, set_window_padding, set_window_render_data, update_ime_position_for_window, - update_window_title, update_window_visibility, viewport_for_window + update_window_title, update_window_visibility ) from .keys import keyboard_mode_name, mod_mask from .notify import NotificationCommand, handle_notification_cmd from .options.types import Options from .rgb import to_color from .terminfo import get_capabilities -from .types import MouseEvent, ScreenGeometry, WindowGeometry, ac +from .types import MouseEvent, WindowGeometry, ac from .typing import BossType, ChildType, EdgeLiteral, TabType, TypedDict from .utils import ( get_primary_selection, load_shaders, log_error, open_cmd, open_url, @@ -153,15 +153,6 @@ def call_watchers(windowref: Callable[[], Optional['Window']], which: str, data: add_timer(callback, 0, False) -def calculate_gl_geometry(window_geometry: WindowGeometry, viewport_width: int, viewport_height: int, cell_width: int, cell_height: int) -> ScreenGeometry: - dx, dy = 2 * cell_width / viewport_width, 2 * cell_height / viewport_height - xmargin = window_geometry.left / viewport_width - ymargin = window_geometry.top / viewport_height - xstart = -1 + 2 * xmargin - ystart = 1 - 2 * ymargin - return ScreenGeometry(xstart, ystart, window_geometry.xnum, window_geometry.ynum, dx, dy) - - def as_text( screen: Screen, as_ansi: bool = False, @@ -546,21 +537,13 @@ class Window: self.screen.mark_as_dirty() wakeup() - def update_position(self, window_geometry: WindowGeometry) -> ScreenGeometry: - central, tab_bar, vw, vh, cw, ch = viewport_for_window(self.os_window_id) - self.screen_geometry = sg = calculate_gl_geometry(window_geometry, vw, vh, cw, ch) - return sg - def set_geometry(self, new_geometry: WindowGeometry) -> None: if self.destroyed: return if self.needs_layout or new_geometry.xnum != self.screen.columns or new_geometry.ynum != self.screen.lines: self.screen.resize(new_geometry.ynum, new_geometry.xnum) - sg = self.update_position(new_geometry) self.needs_layout = False call_watchers(weakref.ref(self), 'on_resize', {'old_geometry': self.geometry, 'new_geometry': new_geometry}) - else: - sg = self.update_position(new_geometry) current_pty_size = ( self.screen.lines, self.screen.columns, max(0, new_geometry.right - new_geometry.left), max(0, new_geometry.bottom - new_geometry.top)) @@ -576,7 +559,7 @@ class Window: mark_os_window_dirty(self.os_window_id) self.geometry = g = new_geometry - set_window_render_data(self.os_window_id, self.tab_id, self.id, sg.xstart, sg.ystart, sg.dx, sg.dy, self.screen, *g[:4]) + set_window_render_data(self.os_window_id, self.tab_id, self.id, self.screen, *g[:4]) self.update_effective_padding() if update_ime_position: update_ime_position_for_window(self.id, True)