From f4827fbac9e3ef2f2c63553943af6d29d89b6143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=BCbking?= Date: Fri, 19 Jul 2013 16:28:05 +0200 Subject: [PATCH] update packing logics to honor activities and tabs at the same time using MaximizeArea instead MoveArea ratio: movearea allows to pack windows under panels and while one can expect users of packing to know alt+lmb, we usually do not allow to loose the titlebar Moreover this relies on packing against dock windows what fails with "virtual" struts as input shaping panels (eg. cairo-dock?) might use (ie. we we would also have packed against plasma panel shadows - back then ;-) BUG: 180084 REVIEW: 111603 FIXED-IN: 4.11 --- placement.cpp | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/placement.cpp b/placement.cpp index b23dc37d62..55fcb34e87 100644 --- a/placement.cpp +++ b/placement.cpp @@ -140,7 +140,7 @@ void Placement::placeAtRandom(Client* c, const QRect& area, Policy /*next*/) } // TODO: one day, there'll be C++11 ... -static inline bool isIrrelevant(Client *client, Client *regarding, int desktop) +static inline bool isIrrelevant(const Client *client, const Client *regarding, int desktop) { if (!client) return true; @@ -810,16 +810,14 @@ void Workspace::slotWindowQuickTileBottomRight() int Workspace::packPositionLeft(const Client* cl, int oldx, bool left_edge) const { - int newx = clientArea(MovementArea, cl).left(); + int newx = clientArea(MaximizeArea, cl).left(); if (oldx <= newx) // try another Xinerama screen - newx = clientArea(MovementArea, + newx = clientArea(MaximizeArea, QPoint(cl->geometry().left() - 1, cl->geometry().center().y()), cl->desktop()).left(); if (oldx <= newx) return oldx; - for (ClientList::ConstIterator it = clients.constBegin(); - it != clients.constEnd(); - ++it) { - if (!(*it)->isShown(false) || !(*it)->isOnDesktop(active_client->desktop())) + for (ClientList::ConstIterator it = clients.constBegin(), end = clients.constEnd(); it != end; ++it) { + if (isIrrelevant(*it, cl, cl->desktop())) continue; int x = left_edge ? (*it)->geometry().right() + 1 : (*it)->geometry().left() - 1; if (x > newx && x < oldx @@ -832,16 +830,14 @@ int Workspace::packPositionLeft(const Client* cl, int oldx, bool left_edge) cons int Workspace::packPositionRight(const Client* cl, int oldx, bool right_edge) const { - int newx = clientArea(MovementArea, cl).right(); + int newx = clientArea(MaximizeArea, cl).right(); if (oldx >= newx) // try another Xinerama screen - newx = clientArea(MovementArea, + newx = clientArea(MaximizeArea, QPoint(cl->geometry().right() + 1, cl->geometry().center().y()), cl->desktop()).right(); if (oldx >= newx) return oldx; - for (ClientList::ConstIterator it = clients.constBegin(); - it != clients.constEnd(); - ++it) { - if (!(*it)->isShown(false) || !(*it)->isOnDesktop(cl->desktop())) + for (ClientList::ConstIterator it = clients.constBegin(), end = clients.constEnd(); it != end; ++it) { + if (isIrrelevant(*it, cl, cl->desktop())) continue; int x = right_edge ? (*it)->geometry().left() - 1 : (*it)->geometry().right() + 1; if (x < newx && x > oldx @@ -854,16 +850,14 @@ int Workspace::packPositionRight(const Client* cl, int oldx, bool right_edge) co int Workspace::packPositionUp(const Client* cl, int oldy, bool top_edge) const { - int newy = clientArea(MovementArea, cl).top(); + int newy = clientArea(MaximizeArea, cl).top(); if (oldy <= newy) // try another Xinerama screen - newy = clientArea(MovementArea, + newy = clientArea(MaximizeArea, QPoint(cl->geometry().center().x(), cl->geometry().top() - 1), cl->desktop()).top(); if (oldy <= newy) return oldy; - for (ClientList::ConstIterator it = clients.constBegin(); - it != clients.constEnd(); - ++it) { - if (!(*it)->isShown(false) || !(*it)->isOnDesktop(cl->desktop())) + for (ClientList::ConstIterator it = clients.constBegin(), end = clients.constEnd(); it != end; ++it) { + if (isIrrelevant(*it, cl, cl->desktop())) continue; int y = top_edge ? (*it)->geometry().bottom() + 1 : (*it)->geometry().top() - 1; if (y > newy && y < oldy @@ -876,16 +870,14 @@ int Workspace::packPositionUp(const Client* cl, int oldy, bool top_edge) const int Workspace::packPositionDown(const Client* cl, int oldy, bool bottom_edge) const { - int newy = clientArea(MovementArea, cl).bottom(); + int newy = clientArea(MaximizeArea, cl).bottom(); if (oldy >= newy) // try another Xinerama screen - newy = clientArea(MovementArea, + newy = clientArea(MaximizeArea, QPoint(cl->geometry().center().x(), cl->geometry().bottom() + 1), cl->desktop()).bottom(); if (oldy >= newy) return oldy; - for (ClientList::ConstIterator it = clients.constBegin(); - it != clients.constEnd(); - ++it) { - if (!(*it)->isShown(false) || !(*it)->isOnDesktop(cl->desktop())) + for (ClientList::ConstIterator it = clients.constBegin(), end = clients.constEnd(); it != end; ++it) { + if (isIrrelevant(*it, cl, cl->desktop())) continue; int y = bottom_edge ? (*it)->geometry().top() - 1 : (*it)->geometry().bottom() + 1; if (y < newy && y > oldy