File indexing completed on 2024-05-19 16:34:53

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #include "desktopchain.h"
0010 
0011 namespace KWin
0012 {
0013 namespace TabBox
0014 {
0015 
0016 DesktopChain::DesktopChain(uint initialSize)
0017     : m_chain(initialSize)
0018 {
0019     init();
0020 }
0021 
0022 void DesktopChain::init()
0023 {
0024     for (int i = 0; i < m_chain.size(); ++i) {
0025         m_chain[i] = i + 1;
0026     }
0027 }
0028 
0029 uint DesktopChain::next(uint indexDesktop) const
0030 {
0031     const int i = m_chain.indexOf(indexDesktop);
0032     if (i >= 0 && i + 1 < m_chain.size()) {
0033         return m_chain[i + 1];
0034     } else if (m_chain.size() > 0) {
0035         return m_chain[0];
0036     } else {
0037         return 1;
0038     }
0039 }
0040 
0041 void DesktopChain::resize(uint previousSize, uint newSize)
0042 {
0043     Q_ASSERT(int(previousSize) == m_chain.size());
0044     m_chain.resize(newSize);
0045 
0046     if (newSize >= previousSize) {
0047         // We do not destroy the chain in case new desktops are added
0048         for (uint i = previousSize; i < newSize; ++i) {
0049             m_chain[i] = i + 1;
0050         }
0051     } else {
0052         // But when desktops are removed, we may have to modify the chain a bit,
0053         // otherwise invalid desktops may show up.
0054         for (int i = 0; i < m_chain.size(); ++i) {
0055             m_chain[i] = std::min(m_chain[i], newSize);
0056         }
0057     }
0058 }
0059 
0060 void DesktopChain::add(uint desktop)
0061 {
0062     if (m_chain.isEmpty() || int(desktop) > m_chain.count()) {
0063         return;
0064     }
0065     int index = m_chain.indexOf(desktop);
0066     if (index == -1) {
0067         // not found - shift all elements by one position
0068         index = m_chain.size() - 1;
0069     }
0070     for (int i = index; i > 0; --i) {
0071         m_chain[i] = m_chain[i - 1];
0072     }
0073     m_chain[0] = desktop;
0074 }
0075 
0076 DesktopChainManager::DesktopChainManager(QObject *parent)
0077     : QObject(parent)
0078     , m_maxChainSize(0)
0079 {
0080     m_currentChain = m_chains.insert(QString(), DesktopChain());
0081 }
0082 
0083 DesktopChainManager::~DesktopChainManager()
0084 {
0085 }
0086 
0087 uint DesktopChainManager::next(uint indexDesktop) const
0088 {
0089     return m_currentChain.value().next(indexDesktop);
0090 }
0091 
0092 void DesktopChainManager::resize(uint previousSize, uint newSize)
0093 {
0094     m_maxChainSize = newSize;
0095     for (DesktopChains::iterator it = m_chains.begin(); it != m_chains.end(); ++it) {
0096         it.value().resize(previousSize, newSize);
0097     }
0098 }
0099 
0100 void DesktopChainManager::addDesktop(uint previousDesktop, uint currentDesktop)
0101 {
0102     m_currentChain.value().add(currentDesktop);
0103 }
0104 
0105 void DesktopChainManager::useChain(const QString &identifier)
0106 {
0107     if (m_currentChain.key().isNull()) {
0108         createFirstChain(identifier);
0109     } else {
0110         m_currentChain = m_chains.find(identifier);
0111         if (m_currentChain == m_chains.end()) {
0112             m_currentChain = addNewChain(identifier);
0113         }
0114     }
0115 }
0116 
0117 void DesktopChainManager::createFirstChain(const QString &identifier)
0118 {
0119     DesktopChain value(m_currentChain.value());
0120     m_chains.erase(m_currentChain);
0121     m_currentChain = m_chains.insert(identifier, value);
0122 }
0123 
0124 QHash<QString, DesktopChain>::Iterator DesktopChainManager::addNewChain(const QString &identifier)
0125 {
0126     return m_chains.insert(identifier, DesktopChain(m_maxChainSize));
0127 }
0128 
0129 } // namespace TabBox
0130 } // namespace KWin