You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.1 KiB
120 lines
3.1 KiB
/* |
|
SPDX-FileCopyrightText: 2022 Fushan Wen <qydwhotmail@gmail.com> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "maximizedwindowmonitor.h" |
|
|
|
#include <QGuiApplication> |
|
#include <QScreen> |
|
|
|
#include "abstracttasksmodel.h" // For enums |
|
#include "activityinfo.h" |
|
#include "virtualdesktopinfo.h" |
|
|
|
#include "debug.h" |
|
|
|
class MaximizedWindowMonitor::Private |
|
{ |
|
public: |
|
explicit Private(MaximizedWindowMonitor *q); |
|
|
|
void init(); |
|
|
|
private: |
|
Q_DISABLE_COPY(Private); |
|
|
|
MaximizedWindowMonitor *q = nullptr; |
|
|
|
bool m_ready = false; |
|
|
|
TaskManager::ActivityInfo *m_activityInfo = nullptr; |
|
TaskManager::VirtualDesktopInfo *m_virtualDesktopInfo = nullptr; |
|
|
|
QRect m_geometry; |
|
|
|
friend class MaximizedWindowMonitor; |
|
}; |
|
|
|
MaximizedWindowMonitor::Private::Private(MaximizedWindowMonitor *q) |
|
: q(q) |
|
, m_activityInfo(new TaskManager::ActivityInfo(q)) |
|
, m_virtualDesktopInfo(new TaskManager::VirtualDesktopInfo(q)) |
|
{ |
|
} |
|
|
|
void MaximizedWindowMonitor::Private::init() |
|
{ |
|
q->setSortMode(SortMode::SortActivity); |
|
q->setGroupMode(GroupMode::GroupDisabled); |
|
|
|
q->setActivity(m_activityInfo->currentActivity()); |
|
q->connect(m_activityInfo, &TaskManager::ActivityInfo::currentActivityChanged, q, [this] { |
|
q->setActivity(m_activityInfo->currentActivity()); |
|
}); |
|
|
|
q->setVirtualDesktop(m_virtualDesktopInfo->currentDesktop()); |
|
q->connect(m_virtualDesktopInfo, &TaskManager::VirtualDesktopInfo::currentDesktopChanged, q, [this]() { |
|
q->setVirtualDesktop(m_virtualDesktopInfo->currentDesktop()); |
|
}); |
|
|
|
q->setFilterByActivity(true); |
|
q->setFilterByVirtualDesktop(true); |
|
} |
|
|
|
MaximizedWindowMonitor::MaximizedWindowMonitor(QObject *parent) |
|
: TaskManager::TasksModel(parent) |
|
, d(std::make_unique<Private>(this)) |
|
{ |
|
d->init(); |
|
} |
|
|
|
MaximizedWindowMonitor::~MaximizedWindowMonitor() |
|
{ |
|
} |
|
|
|
QRect MaximizedWindowMonitor::targetRect() const |
|
{ |
|
return d->m_geometry; |
|
} |
|
|
|
void MaximizedWindowMonitor::setTargetRect(const QRect &rect) |
|
{ |
|
if (d->m_geometry == rect) { |
|
return; |
|
} |
|
|
|
d->m_geometry = rect; |
|
Q_EMIT targetRectChanged(); |
|
|
|
invalidateFilter(); |
|
} |
|
|
|
bool MaximizedWindowMonitor::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const |
|
{ |
|
const QModelIndex sourceIndex = sourceModel()->index(sourceRow, 0); |
|
|
|
// Filter out minimized "maximized" windows |
|
if (sourceIndex.data(TaskManager::AbstractTasksModel::IsMinimized).toBool()) { |
|
return false; |
|
} |
|
|
|
if (!TaskManager::TasksModel::filterAcceptsRow(sourceRow, sourceParent)) { |
|
return false; |
|
} |
|
|
|
// Filter windows on the screen where the wallpaper plugin is on |
|
const QRect windowGeometry = sourceIndex.data(TaskManager::AbstractTasksModel::Geometry).toRect(); |
|
|
|
// Use intersects so the geometry doesn't need be multiplied by devicePixelRatio |
|
if (!d->m_geometry.intersects(windowGeometry)) { |
|
return false; |
|
} |
|
|
|
if (sourceIndex.data(TaskManager::AbstractTasksModel::IsMaximized).toBool() || sourceIndex.data(TaskManager::AbstractTasksModel::IsFullScreen).toBool()) { |
|
return true; |
|
} |
|
|
|
return false; |
|
}
|
|
|