1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
/*
* SPDX-FileCopyrightText: 2014 Hugo Pereira Da Costa <hugo.pereira@free.fr>
*
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/
#include "breezesettingsprovider.h"
#include "breezeexceptionlist.h"
#include <QRegularExpression>
#include <QTextStream>
namespace Breeze
{
SettingsProvider *SettingsProvider::s_self = nullptr;
//__________________________________________________________________
SettingsProvider::SettingsProvider()
: m_config(KSharedConfig::openConfig(QStringLiteral("breezerc")))
{
reconfigure();
}
//__________________________________________________________________
SettingsProvider::~SettingsProvider()
{
s_self = nullptr;
}
//__________________________________________________________________
SettingsProvider *SettingsProvider::self()
{
// TODO: this is not thread safe!
if (!s_self) {
s_self = new SettingsProvider();
}
return s_self;
}
//__________________________________________________________________
void SettingsProvider::reconfigure()
{
if (!m_defaultSettings) {
m_defaultSettings = InternalSettingsPtr(new InternalSettings());
m_defaultSettings->setCurrentGroup(QStringLiteral("Windeco"));
}
m_defaultSettings->load();
ExceptionList exceptions;
exceptions.readConfig(m_config);
m_exceptions = exceptions.get();
}
//__________________________________________________________________
InternalSettingsPtr SettingsProvider::internalSettings(Decoration *decoration) const
{
QString windowTitle;
QString windowClass;
// get the client
const auto client = decoration->client().toStrongRef();
foreach (auto internalSettings, m_exceptions) {
// discard disabled exceptions
if (!internalSettings->enabled()) {
continue;
}
// discard exceptions with empty exception pattern
if (internalSettings->exceptionPattern().isEmpty()) {
continue;
}
/*
decide which value is to be compared
to the regular expression, based on exception type
*/
QString value;
switch (internalSettings->exceptionType()) {
case InternalSettings::ExceptionWindowTitle: {
value = windowTitle.isEmpty() ? (windowTitle = client->caption()) : windowTitle;
break;
}
default:
case InternalSettings::ExceptionWindowClassName: {
value = windowClass.isEmpty() ? (windowClass = client->windowClass()) : windowClass;
break;
}
}
// check matching
QRegularExpression rx(internalSettings->exceptionPattern());
if (rx.match(value).hasMatch()) {
return internalSettings;
}
}
return m_defaultSettings;
}
}
|