diff --git a/useractions.cpp b/useractions.cpp --- a/useractions.cpp +++ b/useractions.cpp @@ -1559,17 +1559,45 @@ */ void Workspace::switchWindow(Direction direction) { + switchWindow(direction, true); +} + +void Workspace::switchWindow(Direction direction, bool tryOpposite) +{ if (!active_client) return; AbstractClient *c = active_client; - Client *switchTo = 0; - int bestScore = 0; - int d = c->isOnAllDesktops() ? VirtualDesktopManager::self()->current() : c->desktop(); + int desktopNumber = c->isOnAllDesktops() ? VirtualDesktopManager::self()->current() : c->desktop(); // Centre of the active window + QPoint curPos(c->pos().x() + c->geometry().width() / 2, c->pos().y() + c->geometry().height() / 2); + switchOrCycleWindow(c, direction, curPos, desktopNumber, tryOpposite); +} + +QPoint Workspace::oppositePosition(QPoint point, Direction direction) +{ + switch(direction) { + case DirectionNorth: + return QPoint(point.x(), 0); + case DirectionSouth: + return QPoint(point.x(), screens()->geometry().height()); + case DirectionEast: + return QPoint(0, point.y()); + case DirectionWest: + return QPoint(screens()->geometry().width(), point.y()); + } + return QPoint(0, 0); +} + +void Workspace::switchOrCycleWindow(AbstractClient *c, Direction direction, QPoint curPos, int d, bool tryOpposite) +{ + Client *switchTo = 0; + int bestScore = 0; + ToplevelList clist = stackingOrder(); + for (ToplevelList::Iterator i = clist.begin(); i != clist.end(); ++i) { Client *client = qobject_cast(*i); if (!client) { @@ -1619,6 +1647,8 @@ if (switchTo->tabGroup()) switchTo = switchTo->tabGroup()->current(); activateClient(switchTo); + } else if (tryOpposite) { + switchOrCycleWindow(c, direction, oppositePosition(curPos, direction), d, false); } } diff --git a/workspace.h b/workspace.h --- a/workspace.h +++ b/workspace.h @@ -502,7 +502,11 @@ DirectionSouth, DirectionWest }; + void switchWindow(Direction direction); + void switchWindow(Direction direction, bool tryOpposite); + void switchOrCycleWindow(AbstractClient *c, Direction direction, QPoint curPos, int d, bool tryOpposite); + QPoint oppositePosition(QPoint point, Direction direction); void propagateClients(bool propagate_new_clients); // Called only from updateStackingOrder ToplevelList constrainedStackingOrder();