mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-12 03:29:10 +02:00
DRYer: Maintain font and DPI per OSWindow information in one place
This commit is contained in:
16
kitty/glfw.c
16
kitty/glfw.c
@@ -137,10 +137,10 @@ update_os_window_viewport(OSWindow *window, bool notify_boss) {
|
||||
int w, h, fw, fh;
|
||||
glfwGetFramebufferSize(window->handle, &fw, &fh);
|
||||
glfwGetWindowSize(window->handle, &w, &h);
|
||||
double xdpi = window->logical_dpi_x, ydpi = window->logical_dpi_y;
|
||||
double xdpi = window->fonts_data->logical_dpi_x, ydpi = window->fonts_data->logical_dpi_y;
|
||||
set_os_window_dpi(window);
|
||||
|
||||
if (fw == window->viewport_width && fh == window->viewport_height && w == window->window_width && h == window->window_height && xdpi == window->logical_dpi_x && ydpi == window->logical_dpi_y) {
|
||||
if (fw == window->viewport_width && fh == window->viewport_height && w == window->window_width && h == window->window_height && xdpi == window->fonts_data->logical_dpi_x && ydpi == window->fonts_data->logical_dpi_y) {
|
||||
return; // no change, ignore
|
||||
}
|
||||
int min_width, min_height; min_size_for_os_window(window, &min_width, &min_height);
|
||||
@@ -163,7 +163,7 @@ update_os_window_viewport(OSWindow *window, bool notify_boss) {
|
||||
double xr = window->viewport_x_ratio, yr = window->viewport_y_ratio;
|
||||
window->viewport_x_ratio = (double)window->viewport_width / (double)w;
|
||||
window->viewport_y_ratio = (double)window->viewport_height / (double)h;
|
||||
bool dpi_changed = (xr != 0.0 && xr != window->viewport_x_ratio) || (yr != 0.0 && yr != window->viewport_y_ratio) || (xdpi != window->logical_dpi_x) || (ydpi != window->logical_dpi_y);
|
||||
bool dpi_changed = (xr != 0.0 && xr != window->viewport_x_ratio) || (yr != 0.0 && yr != window->viewport_y_ratio) || (xdpi != window->fonts_data->logical_dpi_x) || (ydpi != window->fonts_data->logical_dpi_y);
|
||||
|
||||
window->viewport_size_dirty = true;
|
||||
window->viewport_width = MAX(window->viewport_width, min_width);
|
||||
@@ -678,7 +678,7 @@ draw_text_callback(GLFWwindow *window, const char *text, uint32_t fg, uint32_t b
|
||||
if (!ensure_csd_title_render_ctx()) return false;
|
||||
double xdpi, ydpi;
|
||||
get_window_dpi(window, &xdpi, &ydpi);
|
||||
unsigned px_sz = (unsigned)(global_state.callback_os_window->font_sz_in_pts * ydpi / 72.);
|
||||
unsigned px_sz = (unsigned)(global_state.callback_os_window->fonts_data->font_sz_in_pts * ydpi / 72.);
|
||||
px_sz = MIN(px_sz, 3 * height / 4);
|
||||
static char title[2048];
|
||||
snprintf(title, sizeof(title), "🐱 %s", text);
|
||||
@@ -854,7 +854,7 @@ get_os_window_content_scale(OSWindow *os_window, double *xdpi, double *ydpi, flo
|
||||
|
||||
static void
|
||||
set_os_window_dpi(OSWindow *w) {
|
||||
get_window_dpi(w->handle, &w->logical_dpi_x, &w->logical_dpi_y);
|
||||
get_window_dpi(w->handle, &w->fonts_data->logical_dpi_x, &w->fonts_data->logical_dpi_y);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -1271,7 +1271,6 @@ create_os_window(PyObject UNUSED *self, PyObject *args, PyObject *kw) {
|
||||
q->is_focused = q == w ? true : false;
|
||||
}
|
||||
}
|
||||
w->logical_dpi_x = xdpi; w->logical_dpi_y = ydpi;
|
||||
w->fonts_data = fonts_data;
|
||||
w->shown_once = true;
|
||||
w->last_focused_counter = ++focus_counter;
|
||||
@@ -1464,10 +1463,7 @@ glfw_init(PyObject UNUSED *self, PyObject *args) {
|
||||
#else
|
||||
glfwSetDrawTextFunction(draw_text_callback);
|
||||
#endif
|
||||
OSWindow w = {0};
|
||||
set_os_window_dpi(&w);
|
||||
global_state.default_dpi.x = w.logical_dpi_x;
|
||||
global_state.default_dpi.y = w.logical_dpi_y;
|
||||
get_window_dpi(NULL, &global_state.default_dpi.x, &global_state.default_dpi.y);
|
||||
}
|
||||
edge_spacing_func = edge_sf; Py_INCREF(edge_spacing_func);
|
||||
Py_INCREF(ans);
|
||||
|
||||
@@ -63,7 +63,7 @@ GlobalState global_state = {{0}};
|
||||
|
||||
static double
|
||||
dpi_for_os_window(OSWindow *os_window) {
|
||||
double dpi = (os_window->logical_dpi_x + os_window->logical_dpi_y) / 2.;
|
||||
double dpi = (os_window->fonts_data->logical_dpi_x + os_window->fonts_data->logical_dpi_y) / 2.;
|
||||
if (dpi == 0) dpi = (global_state.default_dpi.x + global_state.default_dpi.y) / 2.;
|
||||
return dpi;
|
||||
}
|
||||
@@ -224,7 +224,6 @@ add_os_window(void) {
|
||||
}
|
||||
}
|
||||
|
||||
ans->font_sz_in_pts = OPT(font_size);
|
||||
END_WITH_OS_WINDOW_REFS
|
||||
return ans;
|
||||
}
|
||||
@@ -1020,9 +1019,8 @@ PYWRAP1(os_window_font_size) {
|
||||
double new_sz = -1;
|
||||
PA("K|dp", &os_window_id, &new_sz, &force);
|
||||
WITH_OS_WINDOW(os_window_id)
|
||||
if (new_sz > 0 && (force || new_sz != os_window->font_sz_in_pts)) {
|
||||
os_window->font_sz_in_pts = new_sz;
|
||||
os_window->fonts_data = load_fonts_data(os_window->font_sz_in_pts, os_window->logical_dpi_x, os_window->logical_dpi_y);
|
||||
if (new_sz > 0 && (force || new_sz != os_window->fonts_data->font_sz_in_pts)) {
|
||||
os_window->fonts_data = load_fonts_data(new_sz, os_window->fonts_data->logical_dpi_x, os_window->fonts_data->logical_dpi_y);
|
||||
send_prerendered_sprites_for_window(os_window);
|
||||
resize_screen(os_window, os_window->tab_bar_render_data.screen, false);
|
||||
for (size_t ti = 0; ti < os_window->num_tabs; ti++) {
|
||||
@@ -1036,7 +1034,7 @@ PYWRAP1(os_window_font_size) {
|
||||
// On Wayland with CSD title needs to be re-rendered in a different font size
|
||||
if (os_window->window_title && global_state.is_wayland) set_os_window_title(os_window, NULL);
|
||||
}
|
||||
return Py_BuildValue("d", os_window->font_sz_in_pts);
|
||||
return Py_BuildValue("d", os_window->fonts_data->font_sz_in_pts);
|
||||
END_WITH_OS_WINDOW
|
||||
return Py_BuildValue("d", 0.0);
|
||||
}
|
||||
|
||||
@@ -230,7 +230,6 @@ typedef struct {
|
||||
bool is_focused;
|
||||
monotonic_t cursor_blink_zero_time, last_mouse_activity_at;
|
||||
double mouse_x, mouse_y;
|
||||
double logical_dpi_x, logical_dpi_y, font_sz_in_pts;
|
||||
bool mouse_button_pressed[32];
|
||||
PyObject *window_title;
|
||||
bool disallow_title_changes, title_is_overriden;
|
||||
|
||||
Reference in New Issue
Block a user