When we're resizing from the top or left, send the new window size through the X server as well, so it can handle the move and resize with one atomic attach.
Signed-off-by: Daniel Stone <[email protected]> --- src/xwayland/window-manager.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c index 3ceff63..bdc1c4e 100644 --- a/src/xwayland/window-manager.c +++ b/src/xwayland/window-manager.c @@ -538,7 +538,6 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve xcb_configure_notify_event_t *configure_notify = (xcb_configure_notify_event_t *) event; struct weston_wm_window *window; - int x, y; window = hash_table_lookup(wm->window_hash, configure_notify->window); @@ -547,14 +546,6 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve configure_notify->window, configure_notify->x, configure_notify->y, configure_notify->width, configure_notify->height); - - /* resize falls here */ - if (configure_notify->window != window->id) - return; - - weston_wm_window_get_child_position(window, &x, &y); - window->x = configure_notify->x - x; - window->y = configure_notify->y - y; } static void @@ -1576,10 +1567,14 @@ weston_wm_window_configure(void *data) values); weston_wm_window_get_frame_size(window, &width, &height); - values[0] = width; - values[1] = height; + values[0] = window->x; + values[1] = window->y; + values[2] = width; + values[3] = height; xcb_configure_window(wm->conn, window->frame_id, + XCB_CONFIG_WINDOW_X | + XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, values); @@ -1596,16 +1591,30 @@ send_configure(struct weston_surface *surface, struct weston_wm_window *window = get_wm_window(surface); struct weston_wm *wm = window->wm; struct theme *t = window->wm->theme; + int new_width, new_height; + int old_x = window->x, old_y = window->y; if (window->decorate) { - window->width = width - 2 * (t->margin + t->width); - window->height = height - 2 * t->margin - + new_width = width - 2 * (t->margin + t->width); + new_height = height - 2 * t->margin - t->titlebar_height - t->width; } else { - window->width = width - 2 * t->margin; - window->height = height - 2 * t->margin; + new_width = width - 2 * t->margin; + new_height = height - 2 * t->margin; } + if (edges == THEME_LOCATION_RESIZING_LEFT || + edges == THEME_LOCATION_RESIZING_TOP_LEFT || + edges == THEME_LOCATION_RESIZING_BOTTOM_LEFT) + window->x -= (new_width - window->width); + if (edges == THEME_LOCATION_RESIZING_TOP || + edges == THEME_LOCATION_RESIZING_TOP_LEFT || + edges == THEME_LOCATION_RESIZING_TOP_RIGHT) + window->y -= (new_height - window->height); + + window->width = new_width; + window->height = new_height; + if (window->configure_source) return; -- 1.7.10.4 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
