Move calculation of window render data into native code
There was no reason to do it in python
This commit is contained in:
parent
2546afb7aa
commit
c11da595ef
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user