diff --git a/libtaskmanager/CMakeLists.txt b/libtaskmanager/CMakeLists.txt --- a/libtaskmanager/CMakeLists.txt +++ b/libtaskmanager/CMakeLists.txt @@ -4,6 +4,7 @@ set(taskmanager_LIB_SRCS abstracttasksmodel.cpp abstracttasksproxymodeliface.cpp + abstractwindowtasksmodel.cpp activityinfo.cpp concatenatetasksproxymodel.cpp flattentaskgroupsproxymodel.cpp @@ -67,6 +68,7 @@ abstracttasksmodel.h abstracttasksmodeliface.h abstracttasksproxymodeliface.h + abstractwindowtasksmodel.h activityinfo.h concatenatetasksproxymodel.h flattentaskgroupsproxymodel.h diff --git a/libtaskmanager/abstractwindowtasksmodel.h b/libtaskmanager/abstractwindowtasksmodel.h new file mode 100644 --- /dev/null +++ b/libtaskmanager/abstractwindowtasksmodel.h @@ -0,0 +1,53 @@ +/******************************************************************** +Copyright 2016 Eike Hein + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) version 3, or any +later version accepted by the membership of KDE e.V. (or its +successor approved by the membership of KDE e.V.), which shall +act as a proxy defined in Section 6 of version 3 of the license. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library. If not, see . +*********************************************************************/ + +#ifndef ABSTRACTWINDOWTASKSMODEL_H +#define ABSTRACTWINDOWTASKSMODEL_H + +#include "abstracttasksmodel.h" + +#include "taskmanager_export.h" + +namespace TaskManager +{ + +/** + * @short An abstract base class for window tasks models. + * + * This class serves as abstract base class for window tasks model implementations. + * + * It takes care of refreshing the ScreenGeometry data role when screens are added + * or a screen changes its geometry. + * + * @author Eike Hein + **/ + +class TASKMANAGER_EXPORT AbstractWindowTasksModel : public AbstractTasksModel +{ + Q_OBJECT + +public: + explicit AbstractWindowTasksModel(QObject *parent = nullptr); + virtual ~AbstractWindowTasksModel(); +}; + +} + +#endif diff --git a/libtaskmanager/abstractwindowtasksmodel.cpp b/libtaskmanager/abstractwindowtasksmodel.cpp new file mode 100644 --- /dev/null +++ b/libtaskmanager/abstractwindowtasksmodel.cpp @@ -0,0 +1,60 @@ +/******************************************************************** +Copyright 2016 Eike Hein + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) version 3, or any +later version accepted by the membership of KDE e.V. (or its +successor approved by the membership of KDE e.V.), which shall +act as a proxy defined in Section 6 of version 3 of the license. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library. If not, see . +*********************************************************************/ + +#include "abstractwindowtasksmodel.h" + +#include +#include + +namespace TaskManager +{ + +AbstractWindowTasksModel::AbstractWindowTasksModel(QObject *parent) + : AbstractTasksModel(parent) +{ + // TODO: The following will refresh the ScreenGeometry data role for + // all rows whenever any screen is added or changes its geometry. No + // attempt is made to be intelligent and exempt rows that are tech- + // nically unaffected by the change. Doing so would require tracking + // far more state (i.e. what screen a window is on) and be so + // complicated as to invite bugs. As the trigger conditions are + // expected to be rare, this would be premature optimization at this + // time. That assessment may change in the future. + + auto screenAdded = [this](const QScreen *screen) { + connect(screen, &QScreen::geometryChanged, this, + [this]() { + dataChanged(index(0, 0), index(rowCount(), 0), QVector{ScreenGeometry}); + } + ); + }; + + connect(qGuiApp, &QGuiApplication::screenAdded, this, screenAdded); + + foreach(const QScreen *screen, QGuiApplication::screens()) { + screenAdded(screen); + } +} + +AbstractWindowTasksModel::~AbstractWindowTasksModel() +{ +} + +} diff --git a/libtaskmanager/waylandtasksmodel.h b/libtaskmanager/waylandtasksmodel.h --- a/libtaskmanager/waylandtasksmodel.h +++ b/libtaskmanager/waylandtasksmodel.h @@ -21,7 +21,7 @@ #ifndef WAYLANDTASKSMODEL_H #define WAYLANDTASKSMODEL_H -#include "abstracttasksmodel.h" +#include "abstractwindowtasksmodel.h" #include "taskmanager_export.h" @@ -49,7 +49,7 @@ * @author Eike Hein */ -class TASKMANAGER_EXPORT WaylandTasksModel : public AbstractTasksModel +class TASKMANAGER_EXPORT WaylandTasksModel : public AbstractWindowTasksModel { Q_OBJECT diff --git a/libtaskmanager/waylandtasksmodel.cpp b/libtaskmanager/waylandtasksmodel.cpp --- a/libtaskmanager/waylandtasksmodel.cpp +++ b/libtaskmanager/waylandtasksmodel.cpp @@ -250,7 +250,7 @@ } WaylandTasksModel::WaylandTasksModel(QObject *parent) - : AbstractTasksModel(parent) + : AbstractWindowTasksModel(parent) , d(new Private(this)) { d->initWayland(); diff --git a/libtaskmanager/xwindowtasksmodel.h b/libtaskmanager/xwindowtasksmodel.h --- a/libtaskmanager/xwindowtasksmodel.h +++ b/libtaskmanager/xwindowtasksmodel.h @@ -21,7 +21,7 @@ #ifndef XWINDOWTASKSMODEL_H #define XWINDOWTASKSMODEL_H -#include "abstracttasksmodel.h" +#include "abstractwindowtasksmodel.h" #include "taskmanager_export.h" @@ -46,7 +46,7 @@ * @author Eike Hein */ -class TASKMANAGER_EXPORT XWindowTasksModel : public AbstractTasksModel +class TASKMANAGER_EXPORT XWindowTasksModel : public AbstractWindowTasksModel { Q_OBJECT diff --git a/libtaskmanager/xwindowtasksmodel.cpp b/libtaskmanager/xwindowtasksmodel.cpp --- a/libtaskmanager/xwindowtasksmodel.cpp +++ b/libtaskmanager/xwindowtasksmodel.cpp @@ -825,7 +825,7 @@ } XWindowTasksModel::XWindowTasksModel(QObject *parent) - : AbstractTasksModel(parent) + : AbstractWindowTasksModel(parent) , d(new Private(this)) { d->init();