From 74f5c444e33d9a061296d402c25fafd5fda3071e Mon Sep 17 00:00:00 2001 From: Adam Purkrt Date: Mon, 15 Jan 2018 23:28:52 +0100 Subject: [PATCH] Fix to erratic unmaximization by drag In the original code in clientMoveEventFilter() near the patch: when you begin to drag (slowly) a maximized window from the absolute top (there must be no top panel), clientToggleMaximizedAtPoint() gets called in clientMoveTile() once per each motion event, until the pointer is 15 pixels away from original position, which leads to the back and forth erratic maximization/unmaximization (even when still near edge, where the window should stay maximized). After removing the check for the 15 pixels distance, maximized (and/or tiled) window get first unmaximized (with clientToggleMaximized()), and then potentially maximized immediately again inside clientMoveTile(), if it is still near the edge/corner. Hence it either stays maximized (near the edges) or get unmaximized when mouse pointer get away from top, bottom or sides. --- src/moveresize.c | 58 +++++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/src/moveresize.c b/src/moveresize.c index 8a23e763..3a754001 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -1032,47 +1032,37 @@ clientMoveEventFilter (XfwmEvent *event, gpointer data) if (FLAG_TEST (c->flags, CLIENT_FLAG_RESTORE_SIZE_POS)) { + gboolean size_changed; + /* to keep the distance from the edges of the window proportional. */ + double xratio, yratio; - if ((ABS (event->motion.x_root - passdata->mx) > 15) || - (ABS (event->motion.y_root - passdata->my) > 15)) - { - gboolean size_changed; - /* to keep the distance from the edges of the window proportional. */ - double xratio, yratio; + xratio = (event->motion.x_root - frameExtentX (c)) / (double) frameExtentWidth (c); + yratio = (event->motion.y_root - frameExtentY (c)) / (double) frameExtentHeight (c); - xratio = (event->motion.x_root - frameExtentX (c)) / (double) frameExtentWidth (c); - yratio = (event->motion.y_root - frameExtentY (c)) / (double) frameExtentHeight (c); + size_changed = clientToggleMaximized (c, c->flags & CLIENT_FLAG_MAXIMIZED, FALSE); + if (clientRestoreSizePos (c)) + { + size_changed = TRUE; + } + if (size_changed) + { + passdata->move_resized = TRUE; - size_changed = clientToggleMaximized (c, c->flags & CLIENT_FLAG_MAXIMIZED, FALSE); - if (clientRestoreSizePos (c)) + passdata->ox = c->x; + passdata->mx = frameExtentX (c) + passdata->px; + if ((passdata->mx < frameExtentX (c)) || (passdata->mx > frameExtentX (c) + frameExtentWidth (c))) { - size_changed = TRUE; + passdata->mx = CLAMP(frameExtentX (c) + frameExtentWidth (c) * xratio, frameExtentX (c), frameExtentX (c) + frameExtentWidth (c)); } - if (size_changed) - { - passdata->move_resized = TRUE; - - passdata->ox = c->x; - passdata->mx = frameExtentX (c) + passdata->px; - if ((passdata->mx < frameExtentX (c)) || (passdata->mx > frameExtentX (c) + frameExtentWidth (c))) - { - passdata->mx = CLAMP(frameExtentX (c) + frameExtentWidth (c) * xratio, frameExtentX (c), frameExtentX (c) + frameExtentWidth (c)); - } - passdata->oy = c->y; - passdata->my = frameExtentY (c) + passdata->py; - if ((passdata->my < frameExtentY (c)) || (passdata->my > frameExtentY (c) + frameExtentHeight (c))) - { - passdata->my = CLAMP(frameExtentY (c) + frameExtentHeight (c) * yratio, frameExtentY (c), frameExtentY (c) + frameExtentHeight (c)); - } - - passdata->configure_flags = CFG_FORCE_REDRAW; + passdata->oy = c->y; + passdata->my = frameExtentY (c) + passdata->py; + if ((passdata->my < frameExtentY (c)) || (passdata->my > frameExtentY (c) + frameExtentHeight (c))) + { + passdata->my = CLAMP(frameExtentY (c) + frameExtentHeight (c) * yratio, frameExtentY (c), frameExtentY (c) + frameExtentHeight (c)); } - } - else - { - event->motion.x_root = c->x - passdata->ox + passdata->mx; - event->motion.y_root = c->y - passdata->oy + passdata->my; + + passdata->configure_flags = CFG_FORCE_REDRAW; } } -- 2.15.1