Depend fs layer upon active state, not stackorder
according to NETWM spec implementation notes suggests "focused windows having state _NET_WM_STATE_FULLSCREEN" to be on the highest layer. We'll also take the screen into account The user set stacking (being raised) is not considered by the spec note This behavior is also suggested by an old comment in activation.cpp, void Workspace::setActiveClient() BUG: 296076 CCBUG: 224600 REVIEW: 109572 FIXED-IN: 4.11
This commit is contained in:
parent
a5cce085af
commit
476ca65295
2 changed files with 14 additions and 18 deletions
21
layers.cpp
21
layers.cpp
|
@ -868,22 +868,11 @@ bool Client::isActiveFullScreen() const
|
||||||
if (!isFullScreen())
|
if (!isFullScreen())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// const Client* ac = workspace()->mostRecentlyActivatedClient(); // instead of activeClient() - avoids flicker
|
const Client* ac = workspace()->mostRecentlyActivatedClient(); // instead of activeClient() - avoids flicker
|
||||||
// if (!ac)
|
// according to NETWM spec implementation notes suggests
|
||||||
// return false;
|
// "focused windows having state _NET_WM_STATE_FULLSCREEN" to be on the highest layer.
|
||||||
// not needed, for xinerama -> && ( ac == this || this->group() == ac->group())
|
// we'll also take the screen into account
|
||||||
|
return ac && (ac == this || this->group() == ac->group() || ac->screen() != screen());
|
||||||
// only raise fullscreen above docks if it's the topmost window in unconstrained stacking order,
|
|
||||||
// i.e. the window set to be topmost by the user (also includes transients of the fullscreen window)
|
|
||||||
const Client* top = workspace()->topClientOnDesktop(VirtualDesktopManager::self()->current(), screen(), true, false);
|
|
||||||
if (!top)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// check whether we ...
|
|
||||||
if (top == this)
|
|
||||||
return true;
|
|
||||||
// ... or one of our transients is topmost
|
|
||||||
return rec_checkTransientOnTop(transients_list, top);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -1577,6 +1577,15 @@ int Workspace::screenNumber(const QPoint& pos) const
|
||||||
void Workspace::sendClientToScreen(Client* c, int screen)
|
void Workspace::sendClientToScreen(Client* c, int screen)
|
||||||
{
|
{
|
||||||
screen = c->rules()->checkScreen(screen);
|
screen = c->rules()->checkScreen(screen);
|
||||||
|
if (c->isActive()) {
|
||||||
|
active_screen = screen;
|
||||||
|
// might impact the layer of a fullscreen window
|
||||||
|
foreach (Client *cc, clientList()) {
|
||||||
|
if (cc->isFullScreen() && cc->screen() == screen) {
|
||||||
|
updateClientLayer(cc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (c->screen() == screen) // Don't use isOnScreen(), that's true even when only partially
|
if (c->screen() == screen) // Don't use isOnScreen(), that's true even when only partially
|
||||||
return;
|
return;
|
||||||
GeometryUpdatesBlocker blocker(c);
|
GeometryUpdatesBlocker blocker(c);
|
||||||
|
@ -1602,8 +1611,6 @@ void Workspace::sendClientToScreen(Client* c, int screen)
|
||||||
it != transients_stacking_order.constEnd();
|
it != transients_stacking_order.constEnd();
|
||||||
++it)
|
++it)
|
||||||
sendClientToScreen(*it, screen);
|
sendClientToScreen(*it, screen);
|
||||||
if (c->isActive())
|
|
||||||
active_screen = screen;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Workspace::killWindowId(Window window_to_kill)
|
void Workspace::killWindowId(Window window_to_kill)
|
||||||
|
|
Loading…
Reference in a new issue