xdg-shell: Turn the resizing heuristics into an explicit state
Currently, there's a race condition. When resizing from the left, and
a client attaches a buffer after the resize ends, you suddenly see the
buffer jump to the right, because the resize ended while multiple
attaches were in-flight. Making resize a state can fix this, as the
server can now know exactly when the resize ended, and whether a commit
was before or after that place.
We don't implement the correct tracking in this commit; that's left as
an exercise to the reader.
Additionally, clients like terminals might want to display resize popups
to display the number of cells when in a resize. They can use the hint
here to figure out whether they are resizing.
diff --git a/clients/window.c b/clients/window.c
index 9ec12c7..6149618 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -2387,7 +2387,6 @@
if ((status & FRAME_STATUS_RESIZE) && window->xdg_surface) {
input_ungrab(input);
- window->resizing = 1;
xdg_surface_resize(window->xdg_surface,
input_get_seat(input),
window->display->serial,
@@ -2623,12 +2622,6 @@
input->pointer_enter_serial = serial;
input->pointer_focus = window;
- if (window->resizing) {
- window->resizing = 0;
- /* Schedule a redraw to free the pool */
- window_schedule_redraw(window);
- }
-
input->sx = sx;
input->sy = sy;
@@ -3873,6 +3866,7 @@
window->maximized = 0;
window->fullscreen = 0;
+ window->resizing = 0;
wl_array_for_each(p, states) {
uint32_t state = *p;
@@ -3883,6 +3877,9 @@
case XDG_SURFACE_STATE_FULLSCREEN:
window->fullscreen = 1;
break;
+ case XDG_SURFACE_STATE_RESIZING:
+ window->resizing = 1;
+ break;
default:
/* Unknown state */
break;