[weston v2 6/8] xwm: Ignore configure request while the user is resizing
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Mon Nov 13 21:20:54 UTC 2017
We don't want the application to fight with the user when manually
resizing a window.
v2: Re-enable sync when a new resize operation is started
Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
---
xwayland/window-manager.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index a0ff6b62..1f3bcdac 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -173,6 +173,7 @@ struct weston_wm_window {
int delete_window;
int maximized_vert;
int maximized_horz;
+ int resizing;
int64_t sync_request_serial;
int configure_pending;
int sync_disabled;
@@ -701,6 +702,11 @@ weston_wm_handle_configure_request(struct weston_wm *wm, xcb_generic_event_t *ev
return;
}
+ if (window->frame && window->resizing) {
+ wm_log("Ignore configure request while resizing window\n");
+ return;
+ }
+
if (configure_request->value_mask & XCB_CONFIG_WINDOW_WIDTH)
window->width = configure_request->width;
if (configure_request->value_mask & XCB_CONFIG_WINDOW_HEIGHT)
@@ -1671,9 +1677,13 @@ weston_wm_window_handle_moveresize(struct weston_wm_window *window,
case _NET_WM_MOVERESIZE_SIZE_BOTTOM:
case _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT:
case _NET_WM_MOVERESIZE_SIZE_LEFT:
+ if (!window->resizing)
+ window->sync_disabled = 0;
+ window->resizing = 1;
xwayland_interface->resize(window->shsurf, pointer, map[detail]);
break;
case _NET_WM_MOVERESIZE_CANCEL:
+ window->resizing = 0;
break;
}
}
@@ -2106,6 +2116,10 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
WL_POINTER_BUTTON_STATE_RELEASED;
button_id = button->detail == 1 ? BTN_LEFT : BTN_RIGHT;
+ if (window->resizing && button_id == BTN_LEFT &&
+ button_state == WL_POINTER_BUTTON_STATE_PRESSED)
+ window->resizing = 0;
+
if (button_state == WL_POINTER_BUTTON_STATE_PRESSED) {
if (button->time - window->last_button_time <= DOUBLE_CLICK_PERIOD) {
double_click = 1;
@@ -2143,8 +2157,12 @@ weston_wm_handle_button(struct weston_wm *wm, xcb_generic_event_t *event)
}
if (frame_status(window->frame) & FRAME_STATUS_RESIZE) {
- if (pointer && weston_wm_window_is_resizable(window))
+ if (pointer && weston_wm_window_is_resizable(window)) {
+ if (!window->resizing)
+ window->sync_disabled = 0;
+ window->resizing = 1;
xwayland_interface->resize(window->shsurf, pointer, location);
+ }
frame_status_clear(window->frame, FRAME_STATUS_RESIZE);
}
--
2.13.0
More information about the wayland-devel
mailing list