window: Don't overwrite window->allocation until we've done the resize
This way we can actually detect whether or not a window resizes.
diff --git a/clients/window.c b/clients/window.c
index bb17b8a..bebcd35 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -111,6 +111,7 @@
struct wl_shell_surface *shell_surface;
char *title;
struct rectangle allocation, saved_allocation, server_allocation;
+ struct rectangle pending_allocation;
int x, y;
int resize_edges;
int redraw_scheduled;
@@ -2018,24 +2019,21 @@
}
static void
-window_resize(struct window *window, int32_t width, int32_t height)
+window_resize(struct window *window)
{
- struct rectangle allocation;
struct widget *widget;
- allocation.x = 0;
- allocation.y = 0;
- allocation.width = width;
- allocation.height = height;
-
widget = window->widget;
- widget_set_allocation(widget, allocation.x, allocation.y,
- allocation.width, allocation.height);
+ widget_set_allocation(widget,
+ window->pending_allocation.x,
+ window->pending_allocation.y,
+ window->pending_allocation.width,
+ window->pending_allocation.height);
if (widget->resize_handler)
widget->resize_handler(widget,
- allocation.width,
- allocation.height,
+ widget->allocation.width,
+ widget->allocation.height,
widget->user_data);
if (window->allocation.width != widget->allocation.width ||
@@ -2051,17 +2049,19 @@
struct window *window =
container_of(task, struct window, resize_task);
- window_resize(window,
- window->allocation.width, window->allocation.height);
+ window_resize(window);
window->resize_scheduled = 0;
}
void
window_schedule_resize(struct window *window, int width, int height)
{
+ window->pending_allocation.x = 0;
+ window->pending_allocation.y = 0;
+ window->pending_allocation.width = width;
+ window->pending_allocation.height = height;
+
if (!window->resize_scheduled) {
- window->allocation.width = width;
- window->allocation.height = height;
window->resize_task.run = idle_resize;
display_defer(window->display, &window->resize_task);
window->resize_scheduled = 1;
@@ -2085,8 +2085,7 @@
return;
window->resize_edges = edges;
-
- window_resize(window, width, height);
+ window_schedule_resize(window, width, height);
}
static void