diff --git a/libtaskmanager/abstracttasksmodel.h b/libtaskmanager/abstracttasksmodel.h --- a/libtaskmanager/abstracttasksmodel.h +++ b/libtaskmanager/abstracttasksmodel.h @@ -83,7 +83,8 @@ ScreenGeometry, /**< Screen geometry for the task (i.e. the window's screen). */ Activities, /**< Activities for the task (i.e. window). */ IsDemandingAttention, /**< Task is demanding attention. */ - SkipTaskbar /**< Task desires not to be shown in a user interface. */ + SkipTaskbar, /**< Task desires not to be shown in a 'task bar' user interface. */ + SkipPager, /**< Task desires not to be shown in a 'pager' user interface. */ }; explicit AbstractTasksModel(QObject *parent = nullptr); diff --git a/libtaskmanager/taskfilterproxymodel.h b/libtaskmanager/taskfilterproxymodel.h --- a/libtaskmanager/taskfilterproxymodel.h +++ b/libtaskmanager/taskfilterproxymodel.h @@ -54,6 +54,7 @@ Q_PROPERTY(bool filterByActivity READ filterByActivity WRITE setFilterByActivity NOTIFY filterByActivityChanged) Q_PROPERTY(bool filterNotMinimized READ filterNotMinimized WRITE setFilterNotMinimized NOTIFY filterNotMinimizedChanged) Q_PROPERTY(bool filterSkipTaskbar READ filterSkipTaskbar WRITE setFilterSkipTaskbar NOTIFY filterSkipTaskbarChanged) + Q_PROPERTY(bool filterSkipPager READ filterSkipPager WRITE setFilterSkipPager NOTIFY filterSkipPagerChanged) public: explicit TaskFilterProxyModel(QObject *parent = 0); @@ -229,6 +230,27 @@ * filtered. **/ void setFilterSkipTaskbar(bool filter); + + /** + * Whether tasks which indicate they want to be omitted from 'pagers' + * should be filtered. Defaults to @c true. + * + * @see setFilterSkipPager + * @returns @c true if tasks which want to skip the 'pager' should be + * filtered. + **/ + bool filterSkipPager() const; + + /** + * Set whether tasks which indicate they want to be omitted from 'pagers' + * should be filtered. + * + * @see filterSkipPager + * @param filter Whether tasks which want to skip the 'pager' should be + * filtered. + **/ + void setFilterSkipPager(bool filter); + Q_SIGNALS: void virtualDesktopChanged() const; void screenGeometryChanged() const; @@ -238,6 +260,7 @@ void filterByActivityChanged() const; void filterNotMinimizedChanged() const; void filterSkipTaskbarChanged() const; + void filterSkipPagerChanged() const; protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; diff --git a/libtaskmanager/taskfilterproxymodel.cpp b/libtaskmanager/taskfilterproxymodel.cpp --- a/libtaskmanager/taskfilterproxymodel.cpp +++ b/libtaskmanager/taskfilterproxymodel.cpp @@ -40,6 +40,7 @@ bool filterByActivity = false; bool filterNotMinimized = false; bool filterSkipTaskbar = true; + bool filterSkipPager = false; private: TaskFilterProxyModel *q; @@ -201,6 +202,22 @@ } } +bool TaskFilterProxyModel::filterSkipPager() const +{ + return d->filterSkipPager; +} + +void TaskFilterProxyModel::setFilterSkipPager(bool filter) +{ + if (d->filterSkipPager != filter) { + d->filterSkipPager = filter; + + invalidateFilter(); + + emit filterSkipPagerChanged(); + } +} + QModelIndex TaskFilterProxyModel::mapIfaceToSource(const QModelIndex &index) const { return mapToSource(index); @@ -217,6 +234,11 @@ return false; } + // Filter tasks that are not to be shown on the pager. + if (d->filterSkipPager && sourceIdx.data(AbstractTasksModel::SkipPager).toBool()) { + return false; + } + // Filter by virtual desktop. if (d->filterByVirtualDesktop && d->virtualDesktop != 0) { if (!sourceIdx.data(AbstractTasksModel::IsOnAllVirtualDesktops).toBool() diff --git a/libtaskmanager/waylandtasksmodel.cpp b/libtaskmanager/waylandtasksmodel.cpp --- a/libtaskmanager/waylandtasksmodel.cpp +++ b/libtaskmanager/waylandtasksmodel.cpp @@ -331,6 +331,8 @@ return window->isDemandingAttention(); } else if (role == SkipTaskbar) { return window->skipTaskbar(); + } else if (role == SkipPager) { + // FIXME Implement. } return QVariant(); diff --git a/libtaskmanager/xwindowtasksmodel.cpp b/libtaskmanager/xwindowtasksmodel.cpp --- a/libtaskmanager/xwindowtasksmodel.cpp +++ b/libtaskmanager/xwindowtasksmodel.cpp @@ -359,7 +359,7 @@ if (properties & (NET::WMState | NET::XAWMState)) { wipeInfoCache = true; changedRoles << IsFullScreen << IsMaximized << IsMinimized << IsKeepAbove << IsKeepBelow; - changedRoles << IsShaded << IsDemandingAttention << SkipTaskbar; + changedRoles << IsShaded << IsDemandingAttention << SkipTaskbar << SkipPager; } if (properties2 & NET::WM2AllowedActions) { @@ -887,6 +887,8 @@ return d->demandsAttention(window); } else if (role == SkipTaskbar) { return d->windowInfo(window)->hasState(NET::SkipTaskbar); + } else if (role == SkipPager) { + return d->windowInfo(window)->hasState(NET::SkipPager); } return QVariant();