diff --git a/client.h b/client.h index 3ca24c7ff7..39fb88cfd0 100644 --- a/client.h +++ b/client.h @@ -638,6 +638,8 @@ public: //sets whether the client should be treated as a SessionInteract window void setSessionInteract(bool needed); virtual bool isClient() const; + // a helper for the workspace window packing. tests for screen validity and updates since in maximization case as with normal moving + void packTo(int left, int top); #ifdef KWIN_BUILD_KAPPMENU // Used by workspace diff --git a/placement.cpp b/placement.cpp index 2e70f9245b..912a284a75 100644 --- a/placement.cpp +++ b/placement.cpp @@ -628,36 +628,47 @@ const char* Placement::policyToString(Policy policy) // Workspace // ******************** +void Client::packTo(int left, int top) +{ + const int oldScreen = screen(); + move(left, top); + if (screen() != oldScreen) { + workspace()->sendClientToScreen(this, screen()); // checks rule validity + if (maximizeMode() != MaximizeRestore) + checkWorkspacePosition(); + } +} + /*! Moves active window left until in bumps into another window or workarea edge. */ void Workspace::slotWindowPackLeft() { if (active_client && active_client->isMovable()) - active_client->move(packPositionLeft(active_client, active_client->geometry().left(), true), - active_client->y()); + active_client->screen(); + active_client->packTo(packPositionLeft(active_client, active_client->geometry().left(), true), + active_client->y()); } void Workspace::slotWindowPackRight() { if (active_client && active_client->isMovable()) - active_client->move( - packPositionRight(active_client, active_client->geometry().right(), true) - - active_client->width() + 1, active_client->y()); + active_client->packTo(packPositionRight(active_client, active_client->geometry().right(), true) + - active_client->width() + 1, active_client->y()); } void Workspace::slotWindowPackUp() { if (active_client && active_client->isMovable()) - active_client->move(active_client->x(), - packPositionUp(active_client, active_client->geometry().top(), true)); + active_client->packTo(active_client->x(), + packPositionUp(active_client, active_client->geometry().top(), true)); } void Workspace::slotWindowPackDown() { if (active_client && active_client->isMovable()) - active_client->move(active_client->x(), - packPositionDown(active_client, active_client->geometry().bottom(), true) - active_client->height() + 1); + active_client->packTo(active_client->x(), + packPositionDown(active_client, active_client->geometry().bottom(), true) - active_client->height() + 1); } void Workspace::slotWindowGrowHorizontal()