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