diff --git a/docs/changelog.rst b/docs/changelog.rst index fd61dc43a..6c9851f2a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -54,6 +54,8 @@ Detailed list of changes - Fix a regression in 0.26.0 that broke mapping of native keys who key codes did not fit in 21 bits (:iss:`5452`) +- Wayland: Fix remembering window size not accurate when client side decorations are present + 0.26.1 [2022-08-30] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/glfw/wl_window.c b/glfw/wl_window.c index 5c57deddd..ae9cb078c 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -998,7 +998,7 @@ void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window, if (window->decorated && !window->monitor && !window->wl.decorations.serverSide) { if (top) - *top = window->wl.decorations.metrics.top; + *top = window->wl.decorations.metrics.top - window->wl.decorations.metrics.visible_titlebar_height; if (left) *left = window->wl.decorations.metrics.width; if (right) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index 8f28f738f..f319195a2 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -974,7 +974,7 @@ process_pending_resizes(monotonic_t now) { static void close_os_window(ChildMonitor *self, OSWindow *os_window) { - int w = os_window->window_width, h = os_window->window_height; + int w = os_window->content_area_width, h = os_window->content_area_height; if (os_window->before_fullscreen.is_set && is_os_window_fullscreen(os_window)) { w = os_window->before_fullscreen.w; h = os_window->before_fullscreen.h; } diff --git a/kitty/glfw.c b/kitty/glfw.c index becc283ea..b64b80073 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -97,6 +97,22 @@ min_size_for_os_window(OSWindow *window, int *min_width, int *min_height) { } +static void +adjust_window_size_for_csd(OSWindow *w, int width, int height, int *adjusted_width, int *adjusted_height) { + *adjusted_width = width; *adjusted_height = height; + if (global_state.is_wayland) { + int left = -1, top, right, bottom; + glfwGetWindowFrameSize(w->handle, &left, &top, &right, &bottom); + if (left > -1) { + *adjusted_width -= left + right; + *adjusted_height -= top + bottom; + *adjusted_width = MAX(0, *adjusted_width); + *adjusted_height = MAX(0, *adjusted_height); + } + } +} + + void update_os_window_viewport(OSWindow *window, bool notify_boss) { int w, h, fw, fh; @@ -135,6 +151,7 @@ update_os_window_viewport(OSWindow *window, bool notify_boss) { window->viewport_height = MAX(window->viewport_height, min_height); window->window_width = MAX(w, min_width); window->window_height = MAX(h, min_height); + adjust_window_size_for_csd(window, window->window_width, window->window_height, &window->content_area_width, &window->content_area_height); if (notify_boss) { call_boss(on_window_resize, "KiiO", window->id, window->viewport_width, window->viewport_height, dpi_changed ? Py_True : Py_False); } @@ -652,13 +669,14 @@ set_os_window_dpi(OSWindow *w) { static bool do_toggle_fullscreen(OSWindow *w, unsigned int flags, bool restore_sizes) { - int width, height, x, y; + int width, height, x, y, content_area_width, content_area_height; glfwGetWindowSize(w->handle, &width, &height); glfwGetWindowPos(w->handle, &x, &y); + adjust_window_size_for_csd(w, width, height, &content_area_width, &content_area_height); bool was_maximized = glfwGetWindowAttrib(w->handle, GLFW_MAXIMIZED); if (glfwToggleFullscreen(w->handle, flags)) { w->before_fullscreen.is_set = true; - w->before_fullscreen.w = width; w->before_fullscreen.h = height; w->before_fullscreen.x = x; w->before_fullscreen.y = y; + w->before_fullscreen.w = content_area_width; w->before_fullscreen.h = content_area_height; w->before_fullscreen.x = x; w->before_fullscreen.y = y; w->before_fullscreen.was_maximized = was_maximized; return true; } diff --git a/kitty/state.h b/kitty/state.h index 1acd20b9d..7ece20636 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -188,7 +188,7 @@ typedef struct { int x, y, w, h; bool is_set, was_maximized; } before_fullscreen; - int viewport_width, viewport_height, window_width, window_height; + int viewport_width, viewport_height, window_width, window_height, content_area_width, content_area_height; double viewport_x_ratio, viewport_y_ratio; Tab *tabs; BackgroundImage *bgimage;