1
0
mirror of https://github.com/KDE/latte-dock.git synced 2025-01-12 17:17:50 +03:00
latte-dock/app/wm/abstractwindowinterface.cpp
Michail Vourlakos c94843c9e6 KWin issue #2,hiding windows when activies stopped
--in such case under x11, the winIds of the visible
Latte windows are changed and as such the windows
tracking mechanism becomes broken. The code introduced
tries to track the case the update the WM::ignoredWindows
properly
2019-07-16 14:08:47 +03:00

188 lines
5.1 KiB
C++

/*
* Copyright 2016 Smith AR <audoban@openmailbox.org>
* 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 "abstractwindowinterface.h"
// local
#include "tracker/schemes.h"
#include "tracker/trackerwindows.h"
#include "../lattecorona.h"
// Qt
#include <QDebug>
// KDE
#include <KActivities/Controller>
namespace Latte {
namespace WindowSystem {
AbstractWindowInterface::AbstractWindowInterface(QObject *parent)
: QObject(parent)
{
m_activities = new KActivities::Consumer(this);
m_currentActivity = m_activities->currentActivity();
m_corona = qobject_cast<Latte::Corona *>(parent);
m_windowsTracker = new Tracker::Windows(this);
m_schemesTracker = new Tracker::Schemes(this);
rulesConfig = KSharedConfig::openConfig(QStringLiteral("taskmanagerrulesrc"));
m_windowWaitingTimer.setInterval(150);
m_windowWaitingTimer.setSingleShot(true);
connect(&m_windowWaitingTimer, &QTimer::timeout, this, [&]() {
WindowId wid = m_windowChangedWaiting;
m_windowChangedWaiting = QVariant();
emit windowChanged(wid);
});
// connect(this, &AbstractWindowInterface::windowChanged, this, [&](WindowId wid) {
// qDebug() << "WINDOW CHANGED ::: " << wid;
// });
connect(m_activities.data(), &KActivities::Consumer::currentActivityChanged, this, [&](const QString &id) {
m_currentActivity = id;
emit currentActivityChanged();
});
}
AbstractWindowInterface::~AbstractWindowInterface()
{
m_windowWaitingTimer.stop();
m_schemesTracker->deleteLater();
m_windowsTracker->deleteLater();
}
QString AbstractWindowInterface::currentDesktop() const
{
return m_currentDesktop;
}
QString AbstractWindowInterface::currentActivity() const
{
return m_currentActivity;
}
Latte::Corona *AbstractWindowInterface::corona()
{
return m_corona;
}
Tracker::Schemes *AbstractWindowInterface::schemesTracker()
{
return m_schemesTracker;
}
Tracker::Windows *AbstractWindowInterface::windowsTracker() const
{
return m_windowsTracker;
}
//! Register Latte Ignored Windows in order to NOT be tracked
void AbstractWindowInterface::registerIgnoredWindow(WindowId wid)
{
if (!wid.isNull() && !m_ignoredWindows.contains(wid)) {
m_ignoredWindows.append(wid);
emit windowChanged(wid);
}
}
void AbstractWindowInterface::unregisterIgnoredWindow(WindowId wid)
{
if (m_ignoredWindows.contains(wid)) {
m_ignoredWindows.removeAll(wid);
emit windowRemoved(wid);
}
}
//! Activities switching
void AbstractWindowInterface::switchToNextActivity()
{
QStringList runningActivities = m_activities->activities(KActivities::Info::State::Running);
if (runningActivities.count() <= 1) {
return;
}
int curPos = runningActivities.indexOf(m_currentActivity);
int nextPos = curPos + 1;
if (curPos == runningActivities.count() -1) {
nextPos = 0;
}
KActivities::Controller activitiesController;
activitiesController.setCurrentActivity(runningActivities.at(nextPos));
}
void AbstractWindowInterface::switchToPreviousActivity()
{
QStringList runningActivities = m_activities->activities(KActivities::Info::State::Running);
if (runningActivities.count() <= 1) {
return;
}
int curPos = runningActivities.indexOf(m_currentActivity);
int nextPos = curPos - 1;
if (curPos == 0) {
nextPos = runningActivities.count() - 1;
}
KActivities::Controller activitiesController;
activitiesController.setCurrentActivity(runningActivities.at(nextPos));
}
//! Delay window changed trigerring
void AbstractWindowInterface::considerWindowChanged(WindowId wid)
{
//! Consider if the windowChanged signal should be sent DIRECTLY or WAIT
if (m_windowChangedWaiting == wid && m_windowWaitingTimer.isActive()) {
//! window should be sent later
m_windowWaitingTimer.start();
return;
}
if (m_windowChangedWaiting != wid && !m_windowWaitingTimer.isActive()) {
//! window should be sent later
m_windowChangedWaiting = wid;
m_windowWaitingTimer.start();
}
if (m_windowChangedWaiting != wid && m_windowWaitingTimer.isActive()) {
m_windowWaitingTimer.stop();
//! sent previous waiting window
emit windowChanged(m_windowChangedWaiting);
//! retrigger waiting for the upcoming window
m_windowChangedWaiting = wid;
m_windowWaitingTimer.start();
}
}
}
}