From 946867bf57d5ffc9b66105c36c1b3cd1ecc619cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Jun 2026 02:43:17 +0000 Subject: [PATCH] Fix first Wayland window wrong cell count with fractional scale (issue 10146) --- docs/changelog.rst | 2 ++ kitty/glfw.c | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 69cb5f129..43fab6b9f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -181,6 +181,8 @@ Detailed list of changes 0.47.4 [2026-06-15] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- Wayland: Fix first OS window being a few cells too small when :opt:`initial_window_width`/:opt:`initial_window_height` are set in cells and a fractional display scale is in use (:iss:`10146`) + - Linux: Fix a regression in the previous release that broke rendering of bitmap color fonts (:pull:`10145`) - Linux: Allow fake italics defined via a matrix in fontconfig settings to work for fonts like Fira Code that do not ship with an italic face (:pull:`10120`) diff --git a/kitty/glfw.c b/kitty/glfw.c index 655f6d878..c3f31daba 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -1850,8 +1850,21 @@ create_os_window(PyObject UNUSED *self, PyObject *args, PyObject *kw) { // this can happen if the window is moved by the OS to a different monitor when shown or with fractional scales on Wayland // it can also happen with layer shell windows if the callback is // called before the window is fully created - xdpi = n_xdpi; ydpi = n_ydpi; + xdpi = n_xdpi; ydpi = n_ydpi; xscale = n_xscale; yscale = n_yscale; fonts_data = load_fonts_data(OPT(font_size), xdpi, ydpi); + // Re-compute the window size with the updated scale/font metrics. This matters when + // the initial size is specified in cells: the first window on Wayland is created with + // scale=1 because fractional scale is only sent by the compositor after the surface + // exists, so the cell dimensions used for the initial size calculation were wrong. + PyObject *new_size = PyObject_CallFunction(get_window_size, "IIddff", fonts_data->fcm.cell_width, fonts_data->fcm.cell_height, fonts_data->logical_dpi_x, fonts_data->logical_dpi_y, xscale, yscale); + if (new_size != NULL) { + int new_width = PyLong_AsLong(PyTuple_GET_ITEM(new_size, 0)), new_height = PyLong_AsLong(PyTuple_GET_ITEM(new_size, 1)); + Py_DECREF(new_size); + if (!PyErr_Occurred() && (new_width != width || new_height != height)) { + glfwSetWindowSize(glfw_window, new_width, new_height); + width = new_width; height = new_height; + } else PyErr_Clear(); + } else PyErr_Clear(); } } if (is_first_window) {