Introduce Workspace::stackAbove()
The main purpose is to simplify X11 Above stack mode implementation.
This commit is contained in:
parent
1ff2846579
commit
bca341c70b
4 changed files with 71 additions and 0 deletions
|
@ -151,6 +151,26 @@ void FocusChain::moveAfterWindow(Window *window, Window *reference)
|
||||||
moveAfterWindowInChain(window, reference, m_mostRecentlyUsed);
|
moveAfterWindowInChain(window, reference, m_mostRecentlyUsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FocusChain::moveBeforeWindow(Window *window, Window *reference)
|
||||||
|
{
|
||||||
|
if (window->isDeleted()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!window->wantsTabFocus()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto it = m_desktopFocusChains.begin();
|
||||||
|
it != m_desktopFocusChains.end();
|
||||||
|
++it) {
|
||||||
|
if (!window->isOnDesktop(it.key())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
moveBeforeWindowInChain(window, reference, it.value());
|
||||||
|
}
|
||||||
|
moveBeforeWindowInChain(window, reference, m_mostRecentlyUsed);
|
||||||
|
}
|
||||||
|
|
||||||
void FocusChain::moveAfterWindowInChain(Window *window, Window *reference, Chain &chain)
|
void FocusChain::moveAfterWindowInChain(Window *window, Window *reference, Chain &chain)
|
||||||
{
|
{
|
||||||
if (window->isDeleted()) {
|
if (window->isDeleted()) {
|
||||||
|
@ -173,6 +193,28 @@ void FocusChain::moveAfterWindowInChain(Window *window, Window *reference, Chain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FocusChain::moveBeforeWindowInChain(Window *window, Window *reference, Chain &chain)
|
||||||
|
{
|
||||||
|
if (window->isDeleted()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!chain.contains(reference)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Window::belongToSameApplication(reference, window)) {
|
||||||
|
chain.removeAll(window);
|
||||||
|
chain.insert(chain.indexOf(reference) + 1, window);
|
||||||
|
} else {
|
||||||
|
chain.removeAll(window);
|
||||||
|
for (int i = chain.size() - 1; i >= 0; --i) {
|
||||||
|
if (Window::belongToSameApplication(reference, chain.at(i))) {
|
||||||
|
chain.insert(i + 1, window);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Window *FocusChain::firstMostRecentlyUsed() const
|
Window *FocusChain::firstMostRecentlyUsed() const
|
||||||
{
|
{
|
||||||
if (m_mostRecentlyUsed.isEmpty()) {
|
if (m_mostRecentlyUsed.isEmpty()) {
|
||||||
|
|
|
@ -79,6 +79,14 @@ public:
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
void moveAfterWindow(Window *window, Window *reference);
|
void moveAfterWindow(Window *window, Window *reference);
|
||||||
|
/**
|
||||||
|
* @brief Moves @p window in front of the @p reference Window in all focus chains.
|
||||||
|
*
|
||||||
|
* @param window The Window to move in the chains
|
||||||
|
* @param reference The Window in front of which the @p window should be moved
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void moveBeforeWindow(Window *window, Window *reference);
|
||||||
/**
|
/**
|
||||||
* @brief Finds the best Window to become the new active Window in the focus chain for the given
|
* @brief Finds the best Window to become the new active Window in the focus chain for the given
|
||||||
* virtual @p desktop.
|
* virtual @p desktop.
|
||||||
|
@ -197,6 +205,7 @@ private:
|
||||||
*/
|
*/
|
||||||
void makeLastInChain(Window *window, Chain &chain);
|
void makeLastInChain(Window *window, Chain &chain);
|
||||||
void moveAfterWindowInChain(Window *window, Window *reference, Chain &chain);
|
void moveAfterWindowInChain(Window *window, Window *reference, Chain &chain);
|
||||||
|
void moveBeforeWindowInChain(Window *window, Window *reference, Chain &chain);
|
||||||
void updateWindowInChain(Window *window, Change change, Chain &chain);
|
void updateWindowInChain(Window *window, Change change, Chain &chain);
|
||||||
void insertWindowIntoChain(Window *window, Chain &chain);
|
void insertWindowIntoChain(Window *window, Chain &chain);
|
||||||
Chain m_mostRecentlyUsed;
|
Chain m_mostRecentlyUsed;
|
||||||
|
|
|
@ -464,6 +464,25 @@ void Workspace::stackBelow(Window *window, Window *reference)
|
||||||
updateStackingOrder();
|
updateStackingOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Workspace::stackAbove(Window *window, Window *reference)
|
||||||
|
{
|
||||||
|
if (window->isDeleted()) {
|
||||||
|
qCWarning(KWIN_CORE) << "Workspace::stackAbove: closed window" << window << "cannot be restacked";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT(unconstrained_stacking_order.contains(reference));
|
||||||
|
if (reference == window) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unconstrained_stacking_order.removeAll(window);
|
||||||
|
unconstrained_stacking_order.insert(unconstrained_stacking_order.indexOf(reference) + 1, window);
|
||||||
|
|
||||||
|
m_focusChain->moveBeforeWindow(window, reference);
|
||||||
|
updateStackingOrder();
|
||||||
|
}
|
||||||
|
|
||||||
void Workspace::restackWindowUnderActive(Window *window)
|
void Workspace::restackWindowUnderActive(Window *window)
|
||||||
{
|
{
|
||||||
if (!m_activeWindow || m_activeWindow == window || m_activeWindow->layer() != window->layer()) {
|
if (!m_activeWindow || m_activeWindow == window || m_activeWindow->layer() != window->layer()) {
|
||||||
|
|
|
@ -236,6 +236,7 @@ public:
|
||||||
void lowerWindowRequest(Window *window);
|
void lowerWindowRequest(Window *window);
|
||||||
void restackWindowUnderActive(Window *window);
|
void restackWindowUnderActive(Window *window);
|
||||||
void stackBelow(Window *window, Window *reference);
|
void stackBelow(Window *window, Window *reference);
|
||||||
|
void stackAbove(Window *window, Window *reference);
|
||||||
void raiseOrLowerWindow(Window *window);
|
void raiseOrLowerWindow(Window *window);
|
||||||
void updateStackingOrder(bool propagate_new_windows = false);
|
void updateStackingOrder(bool propagate_new_windows = false);
|
||||||
void forceRestacking();
|
void forceRestacking();
|
||||||
|
|
Loading…
Reference in a new issue