From ae43d4b9d1c8fb1a758fa9f212f629a72e6d7c27 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Wed, 5 Jan 2022 08:30:07 +0100 Subject: [PATCH] Unmaximize on Move --- src/interactive.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/interactive.c b/src/interactive.c index cad77391..3fc25d93 100644 --- a/src/interactive.c +++ b/src/interactive.c @@ -1,16 +1,49 @@ // SPDX-License-Identifier: GPL-2.0-only #include "labwc.h" +static int +max_move_scale(double pos_cursor, double pos_current, + double size_current, double size_orig) +{ + double anchor_frac = (pos_cursor - pos_current) / size_current; + int pos_new = pos_cursor - (size_orig * anchor_frac); + if (pos_new < pos_current) { + /* Clamp by using the old offsets of the maximized window */ + pos_new = pos_current; + } + return pos_new; +} + void interactive_begin(struct view *view, enum input_mode mode, uint32_t edges) { if (view->maximized) { - return; + if (mode == LAB_INPUT_STATE_MOVE) { + int new_x = max_move_scale(view->server->seat.cursor->x, + view->x, view->w, view->unmaximized_geometry.width); + int new_y = max_move_scale(view->server->seat.cursor->y, + view->y, view->h, view->unmaximized_geometry.height); + view->unmaximized_geometry.x = new_x; + view->unmaximized_geometry.y = new_y; + view_maximize(view, false); + /* + * view_maximize() indirectly calls view->impl->configure + * which is async but we are using the current values in + * server->grab_box. We pretend the configure already + * happened by setting them manually. + */ + view->x = new_x; + view->y = new_y; + view->w = view->unmaximized_geometry.width; + view->h = view->unmaximized_geometry.height; + } else { + return; + } } /* * This function sets up an interactive move or resize operation, where - * the compositor stops propegating pointer events to clients and + * the compositor stops propagating pointer events to clients and * instead consumes them itself, to move or resize windows. */ struct seat *seat = &view->server->seat;