wayland: handle resize requests after acknowledging the configure

The wayland protocol requires that clients commit a new buffer sometime
after `xdg_surface_ack_configure`.
This commit is contained in:
Alexander Orzechowski 2022-02-28 19:40:49 -05:00
parent e359094cff
commit 854cb8f27e
2 changed files with 28 additions and 12 deletions

2
glfw/wl_platform.h vendored
View File

@ -221,7 +221,7 @@ typedef struct _GLFWwindowWayland
unsigned int x, y;
} axis_discrete_count;
_GLFWwindowWaylandState current;
_GLFWwindowWaylandState current, pending;
} _GLFWwindowWayland;
typedef enum _GLFWWaylandOfferType

38
glfw/wl_window.c vendored
View File

@ -475,16 +475,10 @@ xdgToplevelHandleConfigure(void* data,
}
}
}
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING);
window->wl.current.toplevel_states = new_states;
set_csd_window_geometry(window, &width, &height);
dispatchChangesAfterConfigure(window, width, 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);
ensure_csd_resources(window);
wl_surface_commit(window->wl.surface);
inform_compositor_of_window_geometry(window, "configure");
if (live_resize_done) _glfwInputLiveResize(window, false);
window->wl.pending.toplevel_states = new_states;
window->wl.pending.width = width;
window->wl.pending.height = height;
}
static void xdgToplevelHandleClose(void* data,
@ -499,11 +493,33 @@ static const struct xdg_toplevel_listener xdgToplevelListener = {
xdgToplevelHandleClose
};
static void xdgSurfaceHandleConfigure(void* data UNUSED,
static void xdgSurfaceHandleConfigure(void* data,
struct xdg_surface* surface,
uint32_t serial)
{
_GLFWwindow* window = data;
xdg_surface_ack_configure(surface, serial);
uint32_t new_states = window->wl.pending.toplevel_states;
int width = window->wl.pending.width;
int height = window->wl.pending.height;
if (new_states != window->wl.current.toplevel_states ||
width != window->wl.current.width ||
height != window->wl.current.height) {
bool live_resize_done = !(new_states & TOPLEVEL_STATE_RESIZING) && (window->wl.current.toplevel_states & TOPLEVEL_STATE_RESIZING);
window->wl.current.toplevel_states = new_states;
set_csd_window_geometry(window, &width, &height);
dispatchChangesAfterConfigure(window, width, 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);
ensure_csd_resources(window);
wl_surface_commit(window->wl.surface);
inform_compositor_of_window_geometry(window, "configure");
if (live_resize_done) _glfwInputLiveResize(window, false);
}
}
static const struct xdg_surface_listener xdgSurfaceListener = {