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:
parent
e359094cff
commit
854cb8f27e
2
glfw/wl_platform.h
vendored
2
glfw/wl_platform.h
vendored
@ -221,7 +221,7 @@ typedef struct _GLFWwindowWayland
|
|||||||
unsigned int x, y;
|
unsigned int x, y;
|
||||||
} axis_discrete_count;
|
} axis_discrete_count;
|
||||||
|
|
||||||
_GLFWwindowWaylandState current;
|
_GLFWwindowWaylandState current, pending;
|
||||||
} _GLFWwindowWayland;
|
} _GLFWwindowWayland;
|
||||||
|
|
||||||
typedef enum _GLFWWaylandOfferType
|
typedef enum _GLFWWaylandOfferType
|
||||||
|
|||||||
38
glfw/wl_window.c
vendored
38
glfw/wl_window.c
vendored
@ -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;
|
window->wl.pending.toplevel_states = new_states;
|
||||||
set_csd_window_geometry(window, &width, &height);
|
window->wl.pending.width = width;
|
||||||
dispatchChangesAfterConfigure(window, width, height);
|
window->wl.pending.height = 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 void xdgToplevelHandleClose(void* data,
|
static void xdgToplevelHandleClose(void* data,
|
||||||
@ -499,11 +493,33 @@ static const struct xdg_toplevel_listener xdgToplevelListener = {
|
|||||||
xdgToplevelHandleClose
|
xdgToplevelHandleClose
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xdgSurfaceHandleConfigure(void* data UNUSED,
|
static void xdgSurfaceHandleConfigure(void* data,
|
||||||
struct xdg_surface* surface,
|
struct xdg_surface* surface,
|
||||||
uint32_t serial)
|
uint32_t serial)
|
||||||
{
|
{
|
||||||
|
_GLFWwindow* window = data;
|
||||||
xdg_surface_ack_configure(surface, serial);
|
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 = {
|
static const struct xdg_surface_listener xdgSurfaceListener = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user