REFACTOR:Introduce SchemesTracker for WM
parent
4e80801523
commit
48d3728005
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
|
||||
*
|
||||
* This file is part of Latte-Dock
|
||||
*
|
||||
* Latte-Dock is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Latte-Dock is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "schemestracker.h"
|
||||
|
||||
// local
|
||||
#include "abstractwindowinterface.h"
|
||||
#include "schemecolors.h"
|
||||
#include "../lattecorona.h"
|
||||
|
||||
// Qt
|
||||
#include <QDir>
|
||||
|
||||
// KDE
|
||||
#include <KDirWatch>
|
||||
|
||||
|
||||
namespace Latte {
|
||||
namespace WindowSystem {
|
||||
|
||||
SchemesTracker::SchemesTracker(AbstractWindowInterface *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
m_wm = parent;
|
||||
init();
|
||||
}
|
||||
|
||||
SchemesTracker::~SchemesTracker()
|
||||
{
|
||||
m_windowScheme.clear();
|
||||
//! it is just a reference to a real scheme file
|
||||
m_schemes.take("kdeglobals");
|
||||
qDeleteAll(m_schemes);
|
||||
m_schemes.clear();
|
||||
}
|
||||
|
||||
void SchemesTracker::init()
|
||||
{
|
||||
updateDefaultScheme();
|
||||
|
||||
connect(m_wm, &AbstractWindowInterface::windowRemoved, this, [&](WindowId wid) {
|
||||
m_windowScheme.remove(wid);
|
||||
});
|
||||
|
||||
//! track for changing default scheme
|
||||
QString kdeSettingsFile = QDir::homePath() + "/.config/kdeglobals";
|
||||
|
||||
KDirWatch::self()->addFile(kdeSettingsFile);
|
||||
|
||||
connect(KDirWatch::self(), &KDirWatch::dirty, this, [ &, kdeSettingsFile](const QString & path) {
|
||||
if (path == kdeSettingsFile) {
|
||||
this->updateDefaultScheme();
|
||||
}
|
||||
});
|
||||
|
||||
connect(KDirWatch::self(), &KDirWatch::created, this, [ &, kdeSettingsFile](const QString & path) {
|
||||
if (path == kdeSettingsFile) {
|
||||
this->updateDefaultScheme();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//! Scheme support for windows
|
||||
void SchemesTracker::updateDefaultScheme()
|
||||
{
|
||||
QString defaultSchemePath = SchemeColors::possibleSchemeFile("kdeglobals");
|
||||
|
||||
qDebug() << " Windows default color scheme :: " << defaultSchemePath;
|
||||
|
||||
SchemeColors *dScheme;
|
||||
|
||||
if (!m_schemes.contains(defaultSchemePath)) {
|
||||
dScheme = new SchemeColors(this, defaultSchemePath);
|
||||
m_schemes[defaultSchemePath] = dScheme;
|
||||
} else {
|
||||
dScheme = m_schemes[defaultSchemePath];
|
||||
}
|
||||
|
||||
if (!m_schemes.contains("kdeglobals") || m_schemes["kdeglobals"]->schemeFile() != defaultSchemePath) {
|
||||
m_schemes["kdeglobals"] = dScheme;
|
||||
}
|
||||
}
|
||||
|
||||
SchemeColors *SchemesTracker::schemeForWindow(WindowId wid)
|
||||
{
|
||||
if (!m_windowScheme.contains(wid)) {
|
||||
return m_schemes["kdeglobals"];
|
||||
} else {
|
||||
return m_schemes[m_windowScheme[wid]];
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void SchemesTracker::setColorSchemeForWindow(WindowId wid, QString scheme)
|
||||
{
|
||||
if (scheme == "kdeglobals" && !m_windowScheme.contains(wid)) {
|
||||
//default scheme does not have to be set
|
||||
return;
|
||||
}
|
||||
|
||||
if (scheme == "kdeglobals") {
|
||||
//! a window that previously had an explicit set scheme now is set back to default scheme
|
||||
m_windowScheme.remove(wid);
|
||||
} else {
|
||||
QString schemeFile = SchemeColors::possibleSchemeFile(scheme);
|
||||
|
||||
if (!m_schemes.contains(schemeFile)) {
|
||||
//! when this scheme file has not been loaded yet
|
||||
m_schemes[schemeFile] = new SchemeColors(this, schemeFile);
|
||||
}
|
||||
|
||||
m_windowScheme[wid] = schemeFile;
|
||||
}
|
||||
|
||||
if (wid == m_wm->activeWindow()) {
|
||||
emit m_wm->activeWindowChanged(wid);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2019 Michail Vourlakos <mvourlakos@gmail.com>
|
||||
*
|
||||
* This file is part of Latte-Dock
|
||||
*
|
||||
* Latte-Dock is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Latte-Dock is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SCHEMESTRACKER_H
|
||||
#define SCHEMESTRACKER_H
|
||||
|
||||
#include "windowinfowrap.h"
|
||||
|
||||
// Qt
|
||||
#include <QObject>
|
||||
|
||||
|
||||
namespace Latte {
|
||||
namespace WindowSystem {
|
||||
class AbstractWindowInterface;
|
||||
class SchemeColors;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Latte {
|
||||
namespace WindowSystem {
|
||||
|
||||
class SchemesTracker : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SchemesTracker(AbstractWindowInterface *parent);
|
||||
~SchemesTracker() override;
|
||||
|
||||
SchemeColors *schemeForWindow(WindowId wId);
|
||||
void setColorSchemeForWindow(WindowId wId, QString scheme);
|
||||
|
||||
private slots:
|
||||
void updateDefaultScheme();
|
||||
|
||||
private:
|
||||
void init();
|
||||
|
||||
private:
|
||||
AbstractWindowInterface *m_wm;
|
||||
|
||||
//! scheme file and its loaded colors
|
||||
QMap<QString, SchemeColors *> m_schemes;
|
||||
|
||||
//! window id and its corresponding scheme file
|
||||
QMap<WindowId, QString> m_windowScheme;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue