1fb9f6f13a
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.
131 lines
3.3 KiB
C++
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
|