]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Unmaximize on Move
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 5 Jan 2022 07:30:07 +0000 (08:30 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Fri, 7 Jan 2022 22:06:21 +0000 (22:06 +0000)
src/interactive.c

index cad77391d3088d36335d13f1338ac0613abf517e..3fc25d937477bb17b810b82e695a45960b5f7fca 100644 (file)
@@ -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;