wayland: Fix CSD size calculations

This is a partial revert of e359094cff68ec6cc26af407c2b924e5991eeec1

window->wl.{width, height} and window->wl.current.{width, height}
represent different things. The former represents the actual size of the
egl surface viewport used for terminal rendering. The former represents
the size of the entire window including the CSD (client side decorations).

These numbers should be the same if CSD is disabled.
This commit is contained in:
Alexander Orzechowski 2022-03-10 05:48:00 -05:00
parent 4013544efb
commit d4b048735d
4 changed files with 26 additions and 23 deletions

View File

@ -263,11 +263,11 @@ static bool
create_shm_buffers(_GLFWwindow* window) { create_shm_buffers(_GLFWwindow* window) {
const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1; const unsigned scale = window->wl.scale >= 1 ? window->wl.scale : 1;
const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.current.height + decs.metrics.top; const size_t vertical_width = decs.metrics.width, vertical_height = window->wl.height + decs.metrics.top;
const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.current.width + 2 * decs.metrics.width; const size_t horizontal_height = decs.metrics.width, horizontal_width = window->wl.width + 2 * decs.metrics.width;
decs.mapping.size = 0; decs.mapping.size = 0;
decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.current.width, decs.metrics.top, scale); decs.mapping.size += init_buffer_pair(&decs.top.buffer, window->wl.width, decs.metrics.top, scale);
decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale); decs.mapping.size += init_buffer_pair(&decs.left.buffer, vertical_width, vertical_height, scale);
decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale); decs.mapping.size += init_buffer_pair(&decs.bottom.buffer, horizontal_width, horizontal_height, scale);
decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale); decs.mapping.size += init_buffer_pair(&decs.right.buffer, vertical_width, vertical_height, scale);
@ -347,8 +347,8 @@ ensure_csd_resources(_GLFWwindow *window) {
const bool is_focused = window->id == _glfw.focusedWindowId; const bool is_focused = window->id == _glfw.focusedWindowId;
const bool focus_changed = is_focused != decs.for_window_state.focused; const bool focus_changed = is_focused != decs.for_window_state.focused;
const bool size_changed = ( const bool size_changed = (
decs.for_window_state.width != window->wl.current.width || decs.for_window_state.width != window->wl.width ||
decs.for_window_state.height != window->wl.current.height || decs.for_window_state.height != window->wl.height ||
decs.for_window_state.scale != window->wl.scale || decs.for_window_state.scale != window->wl.scale ||
!decs.mapping.data !decs.mapping.data
); );
@ -368,11 +368,11 @@ ensure_csd_resources(_GLFWwindow *window) {
if (!decs.left.surface) create_csd_surfaces(window, &decs.left); if (!decs.left.surface) create_csd_surfaces(window, &decs.left);
position_csd_surface(&decs.left, x, y, scale); position_csd_surface(&decs.left, x, y, scale);
x = -decs.metrics.width; y = window->wl.current.height; x = -decs.metrics.width; y = window->wl.height;
if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom); if (!decs.bottom.surface) create_csd_surfaces(window, &decs.bottom);
position_csd_surface(&decs.bottom, x, y, scale); position_csd_surface(&decs.bottom, x, y, scale);
x = window->wl.current.width; y = -decs.metrics.top; x = window->wl.width; y = -decs.metrics.top;
if (!decs.right.surface) create_csd_surfaces(window, &decs.right); if (!decs.right.surface) create_csd_surfaces(window, &decs.right);
position_csd_surface(&decs.right, x, y, scale); position_csd_surface(&decs.right, x, y, scale);
@ -382,8 +382,8 @@ ensure_csd_resources(_GLFWwindow *window) {
damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back); damage_csd(bottom, is_focused ? decs.bottom.buffer.front : decs.bottom.buffer.back);
damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back); damage_csd(right, is_focused ? decs.right.buffer.front : decs.right.buffer.back);
decs.for_window_state.width = window->wl.current.width; decs.for_window_state.width = window->wl.width;
decs.for_window_state.height = window->wl.current.height; decs.for_window_state.height = window->wl.height;
decs.for_window_state.scale = window->wl.scale; decs.for_window_state.scale = window->wl.scale;
decs.for_window_state.focused = is_focused; decs.for_window_state.focused = is_focused;
return true; return true;

4
glfw/wl_init.c vendored
View File

@ -206,7 +206,7 @@ static void pointerHandleMotion(void* data UNUSED,
case BOTTOM_DECORATION: case BOTTOM_DECORATION:
if (x < window->wl.decorations.metrics.width) if (x < window->wl.decorations.metrics.width)
cursorShape = GLFW_SW_RESIZE_CURSOR; cursorShape = GLFW_SW_RESIZE_CURSOR;
else if (x > window->wl.current.width + window->wl.decorations.metrics.width) else if (x > window->wl.width + window->wl.decorations.metrics.width)
cursorShape = GLFW_SE_RESIZE_CURSOR; cursorShape = GLFW_SE_RESIZE_CURSOR;
else else
cursorShape = GLFW_VRESIZE_CURSOR; cursorShape = GLFW_VRESIZE_CURSOR;
@ -274,7 +274,7 @@ static void pointerHandleButton(void* data UNUSED,
case BOTTOM_DECORATION: case BOTTOM_DECORATION:
if (x < window->wl.decorations.metrics.width) if (x < window->wl.decorations.metrics.width)
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT; edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
else if (x > window->wl.current.width + window->wl.decorations.metrics.width) else if (x > window->wl.width + window->wl.decorations.metrics.width)
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT; edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
else else
edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM; edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;

1
glfw/wl_platform.h vendored
View File

@ -132,6 +132,7 @@ static const WaylandWindowState TOPLEVEL_STATE_DOCKED = TOPLEVEL_STATE_MAXIMIZED
// //
typedef struct _GLFWwindowWayland typedef struct _GLFWwindowWayland
{ {
int width, height;
bool visible; bool visible;
bool hovered; bool hovered;
bool transparent; bool transparent;

26
glfw/wl_window.c vendored
View File

@ -206,7 +206,7 @@ static void setOpaqueRegion(_GLFWwindow* window)
if (!region) if (!region)
return; return;
wl_region_add(region, 0, 0, window->wl.current.width, window->wl.current.height); wl_region_add(region, 0, 0, window->wl.width, window->wl.height);
wl_surface_set_opaque_region(window->wl.surface, region); wl_surface_set_opaque_region(window->wl.surface, region);
wl_surface_commit(window->wl.surface); wl_surface_commit(window->wl.surface);
wl_region_destroy(region); wl_region_destroy(region);
@ -216,9 +216,9 @@ static void setOpaqueRegion(_GLFWwindow* window)
static void static void
resizeFramebuffer(_GLFWwindow* window) { resizeFramebuffer(_GLFWwindow* window) {
int scale = window->wl.scale; int scale = window->wl.scale;
int scaledWidth = window->wl.current.width * scale; int scaledWidth = window->wl.width * scale;
int scaledHeight = window->wl.current.height * scale; int scaledHeight = window->wl.height * scale;
debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.current.width, window->wl.current.height, scale); debug("Resizing framebuffer to: %dx%d at scale: %d\n", window->wl.width, window->wl.height, scale);
wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0); wl_egl_window_resize(window->wl.native, scaledWidth, scaledHeight, 0, 0);
if (!window->wl.transparent) setOpaqueRegion(window); if (!window->wl.transparent) setOpaqueRegion(window);
_glfwInputFramebufferSize(window, scaledWidth, scaledHeight); _glfwInputFramebufferSize(window, scaledWidth, scaledHeight);
@ -236,12 +236,12 @@ clipboard_mime(void) {
static void static void
dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) { dispatchChangesAfterConfigure(_GLFWwindow *window, int32_t width, int32_t height) {
bool size_changed = width != window->wl.current.width || height != window->wl.current.height; bool size_changed = width != window->wl.width || height != window->wl.height;
bool scale_changed = checkScaleChange(window); bool scale_changed = checkScaleChange(window);
if (size_changed) { if (size_changed) {
_glfwInputWindowSize(window, width, height); _glfwInputWindowSize(window, width, height);
window->wl.current.width = width; window->wl.current.height = height; window->wl.width = width; window->wl.height = height;
resizeFramebuffer(window); resizeFramebuffer(window);
} }
@ -384,8 +384,8 @@ static bool createSurface(_GLFWwindow* window,
if (!window->wl.native) if (!window->wl.native)
return false; return false;
window->wl.current.width = wndconfig->width; window->wl.width = wndconfig->width;
window->wl.current.height = wndconfig->height; window->wl.height = wndconfig->height;
window->wl.user_requested_content_size.width = wndconfig->width; window->wl.user_requested_content_size.width = wndconfig->width;
window->wl.user_requested_content_size.height = wndconfig->height; window->wl.user_requested_content_size.height = wndconfig->height;
window->wl.scale = 1; window->wl.scale = 1;
@ -514,6 +514,8 @@ static void xdgSurfaceHandleConfigure(void* data,
window->wl.current.toplevel_states = new_states; window->wl.current.toplevel_states = new_states;
set_csd_window_geometry(window, &width, &height); set_csd_window_geometry(window, &width, &height);
dispatchChangesAfterConfigure(window, width, height); dispatchChangesAfterConfigure(window, width, height);
window->wl.current.width = width;
window->wl.current.height = height;
debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height); debug("final window content size: %dx%d\n", window->wl.current.width, window->wl.current.height);
_glfwInputWindowFocus(window, window->wl.current.toplevel_states & TOPLEVEL_STATE_ACTIVATED); _glfwInputWindowFocus(window, window->wl.current.toplevel_states & TOPLEVEL_STATE_ACTIVATED);
ensure_csd_resources(window); ensure_csd_resources(window);
@ -904,19 +906,19 @@ void _glfwPlatformSetWindowPos(_GLFWwindow* window UNUSED, int xpos UNUSED, int
void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height) void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
{ {
if (width) if (width)
*width = window->wl.current.width; *width = window->wl.width;
if (height) if (height)
*height = window->wl.current.height; *height = window->wl.height;
} }
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height) void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
{ {
if (width != window->wl.current.width || height != window->wl.current.height) { if (width != window->wl.width || height != window->wl.height) {
window->wl.user_requested_content_size.width = width; window->wl.user_requested_content_size.width = width;
window->wl.user_requested_content_size.height = height; window->wl.user_requested_content_size.height = height;
int32_t w = 0, h = 0; int32_t w = 0, h = 0;
set_csd_window_geometry(window, &w, &h); set_csd_window_geometry(window, &w, &h);
window->wl.current.width = w; window->wl.current.height = h; window->wl.width = w; window->wl.height = h;
resizeFramebuffer(window); resizeFramebuffer(window);
ensure_csd_resources(window); ensure_csd_resources(window);
wl_surface_commit(window->wl.surface); wl_surface_commit(window->wl.surface);