From 2449d326e72b8c6886d6ddeeef34b82bf3bdd612 Mon Sep 17 00:00:00 2001 From: "P. Pronk" Date: Tue, 10 Jan 2017 12:45:53 +0100 Subject: [PATCH 2/2] Bug: 13284 When dragging a window from a large monitor to the top of a smaller monitor to maximize the window, it is possible that the window gets maximised on a different monitor then the monitor your mouse is. This happens because clientToggleMaximized uses the center point of the window to calculate on which monitor the window should be maximised. To fix this behaviour this commits adds a clientToggleMaximizedAtPoint method so we can tell on which monitor the window should be maximised. modified: src/client.c modified: wqsrc/client.h modified: src/moveresize.c --- src/client.c | 28 ++++++++++++++++++++++------ src/client.h | 5 +++++ src/moveresize.c | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/client.c b/src/client.c index 2bf15b6..4586eed 100644 --- a/src/client.c +++ b/src/client.c @@ -3366,6 +3366,24 @@ clientNewMaxSize (Client *c, XWindowChanges *wc, GdkRectangle *rect) gboolean clientToggleMaximized (Client *c, int mode, gboolean restore_position) { + g_return_val_if_fail (c != NULL, FALSE); + + TRACE ("entering clientToggleMaximized"); + + if (!CLIENT_CAN_MAXIMIZE_WINDOW (c)) + { + return FALSE; + } + + return clientToggleMaximizedAtPoint(c, + frameX (c) + (frameWidth (c) / 2), + frameY (c) + (frameHeight (c) / 2), + mode, restore_position); +} + +gboolean +clientToggleMaximizedAtPoint (Client *c, gint cx, gint cy, int mode, gboolean restore_position) +{ DisplayInfo *display_info; ScreenInfo *screen_info; XWindowChanges wc; @@ -3374,8 +3392,8 @@ clientToggleMaximized (Client *c, int mode, gboolean restore_position) g_return_val_if_fail (c != NULL, FALSE); - TRACE ("entering clientToggleMaximized"); - TRACE ("maximzing/unmaximizing client \"%s\" (0x%lx)", c->name, c->window); + TRACE ("entering clientToggleMaximizedAtPoint"); + TRACE ("maximizing/unmaximizing client \"%s\" (0x%lx)", c->name, c->window); if (!CLIENT_CAN_MAXIMIZE_WINDOW (c)) { @@ -3384,10 +3402,8 @@ clientToggleMaximized (Client *c, int mode, gboolean restore_position) screen_info = c->screen_info; display_info = screen_info->display_info; - myScreenFindMonitorAtPoint (screen_info, - frameX (c) + (frameWidth (c) / 2), - frameY (c) + (frameHeight (c) / 2), &rect); - + myScreenFindMonitorAtPoint (screen_info, cx, cy, &rect); + wc.x = c->x; wc.y = c->y; wc.width = c->width; diff --git a/src/client.h b/src/client.h index fd8b730..abfb6d1 100644 --- a/src/client.h +++ b/src/client.h @@ -467,6 +467,11 @@ void clientUpdateMaximizeSize (Client *); gboolean clientToggleMaximized (Client *, int, gboolean); +gboolean clientToggleMaximizedAtPoint (Client *, + gint, + gint, + int, + gboolean); gboolean clientTile (Client *, gint, gint, diff --git a/src/moveresize.c b/src/moveresize.c index b0f4108..c2a696a 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -832,7 +832,7 @@ clientMoveTile (Client *c, XMotionEvent *xevent) /* mouse pointer on top edge excluding corners */ if (y < disp_y + dist) { - return clientToggleMaximized (c, CLIENT_FLAG_MAXIMIZED, FALSE); + return clientToggleMaximizedAtPoint (c, x, y, CLIENT_FLAG_MAXIMIZED, FALSE); } } -- 2.7.4