kwin/tabbox/desktopchain.cpp
Vlad Zahorodnii 1fb9f6f13a Switch to SPDX license markers
The main advantage of SPDX license identifiers over the traditional
license headers is that it's more difficult to overlook inappropriate
licenses for kwin, for example GPL 3. We also don't have to copy a
lot of boilerplate text.

In order to create this change, I ran licensedigger -r -c from the
toplevel source directory.
2020-08-07 19:57:56 +00:00

131 lines
3.3 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
SPDX-FileCopyrightText: 2012 Martin Gräßlin <mgraesslin@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*********************************************************************/
#include "desktopchain.h"
namespace KWin
{
namespace TabBox
{
DesktopChain::DesktopChain(uint initialSize)
: m_chain(initialSize)
{
init();
}
void DesktopChain::init()
{
for (int i = 0; i < m_chain.size(); ++i) {
m_chain[i] = i + 1;
}
}
uint DesktopChain::next(uint indexDesktop) const
{
const int i = m_chain.indexOf(indexDesktop);
if (i >= 0 && i + 1 < m_chain.size()) {
return m_chain[i+1];
} else if (m_chain.size() > 0) {
return m_chain[0];
} else {
return 1;
}
}
void DesktopChain::resize(uint previousSize, uint newSize)
{
Q_ASSERT(int(previousSize) == m_chain.size());
m_chain.resize(newSize);
if (newSize >= previousSize) {
// We do not destroy the chain in case new desktops are added
for (uint i = previousSize; i < newSize; ++i) {
m_chain[i] = i + 1;
}
} else {
// But when desktops are removed, we may have to modify the chain a bit,
// otherwise invalid desktops may show up.
for (int i = 0; i < m_chain.size(); ++i) {
m_chain[i] = qMin(m_chain[i], newSize);
}
}
}
void DesktopChain::add(uint desktop)
{
if (m_chain.isEmpty() || int(desktop) > m_chain.count()) {
return;
}
int index = m_chain.indexOf(desktop);
if (index == -1) {
// not found - shift all elements by one position
index = m_chain.size() - 1;
}
for (int i = index; i > 0; --i) {
m_chain[i] = m_chain[i-1];
}
m_chain[0] = desktop;
}
DesktopChainManager::DesktopChainManager(QObject *parent)
: QObject(parent)
, m_maxChainSize(0)
{
m_currentChain = m_chains.insert(QString(), DesktopChain());
}
DesktopChainManager::~DesktopChainManager()
{
}
uint DesktopChainManager::next(uint indexDesktop) const
{
return m_currentChain.value().next(indexDesktop);
}
void DesktopChainManager::resize(uint previousSize, uint newSize)
{
m_maxChainSize = newSize;
for (DesktopChains::iterator it = m_chains.begin(); it != m_chains.end(); ++it) {
it.value().resize(previousSize, newSize);
}
}
void DesktopChainManager::addDesktop(uint previousDesktop, uint currentDesktop)
{
Q_UNUSED(previousDesktop)
m_currentChain.value().add(currentDesktop);
}
void DesktopChainManager::useChain(const QString &identifier)
{
if (m_currentChain.key().isNull()) {
createFirstChain(identifier);
} else {
m_currentChain = m_chains.find(identifier);
if (m_currentChain == m_chains.end()) {
m_currentChain = addNewChain(identifier);
}
}
}
void DesktopChainManager::createFirstChain(const QString &identifier)
{
DesktopChain value(m_currentChain.value());
m_chains.erase(m_currentChain);
m_currentChain = m_chains.insert(identifier, value);
}
QHash< QString, DesktopChain >::Iterator DesktopChainManager::addNewChain(const QString &identifier)
{
return m_chains.insert(identifier, DesktopChain(m_maxChainSize));
}
} // namespace TabBox
} // namespace KWin