From d79b4734dc9be22edb076b387acc9f01a594e7cd Mon Sep 17 00:00:00 2001 From: Nicolas Fella Date: Sat, 18 Dec 2021 23:42:49 +0100 Subject: [PATCH] [libtaskmanager] Add role to determine whether a new instance of a task can be launched This moves a bit of logic that is currently in the task manager context menu down to the model. This makes it easier to extend in the future --- libtaskmanager/abstracttasksmodel.h | 1 + libtaskmanager/launchertasksmodel.cpp | 2 ++ libtaskmanager/tasktools.cpp | 8 ++++++++ libtaskmanager/tasktools.h | 2 ++ libtaskmanager/waylandstartuptasksmodel.cpp | 2 ++ libtaskmanager/waylandtasksmodel.cpp | 5 ++++- libtaskmanager/xstartuptasksmodel.cpp | 2 ++ libtaskmanager/xwindowtasksmodel.cpp | 5 ++++- 8 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libtaskmanager/abstracttasksmodel.h b/libtaskmanager/abstracttasksmodel.h index 63e74ab5a..3c50c45dc 100644 --- a/libtaskmanager/abstracttasksmodel.h +++ b/libtaskmanager/abstracttasksmodel.h @@ -84,6 +84,7 @@ public: May be empty. @since 5.19 */ IsHidden, /**< Task (i.e window) is hidden on screen. A minimzed window is not necessarily hidden. */ + CanLaunchNewInstance, /**< A new instance of the task can be launched. @since 5.24 */ }; Q_ENUM(AdditionalRoles) diff --git a/libtaskmanager/launchertasksmodel.cpp b/libtaskmanager/launchertasksmodel.cpp index 27dd7e41c..9e03d9d1c 100644 --- a/libtaskmanager/launchertasksmodel.cpp +++ b/libtaskmanager/launchertasksmodel.cpp @@ -329,6 +329,8 @@ QVariant LauncherTasksModel::data(const QModelIndex &index, int role) const return true; } else if (role == Activities) { return QStringList(d->activitiesForLauncher[url].values()); + } else if (role == CanLaunchNewInstance) { + return false; } return QVariant(); diff --git a/libtaskmanager/tasktools.cpp b/libtaskmanager/tasktools.cpp index 581299434..0a29f91fb 100644 --- a/libtaskmanager/tasktools.cpp +++ b/libtaskmanager/tasktools.cpp @@ -764,4 +764,12 @@ void runApp(const AppData &appData, const QList &urls) } } +bool canLauchNewInstance(const AppData &appData) +{ + if (appData.url.isEmpty()) { + return false; + } + + return true; +} } diff --git a/libtaskmanager/tasktools.h b/libtaskmanager/tasktools.h index 67d051156..644bd3291 100644 --- a/libtaskmanager/tasktools.h +++ b/libtaskmanager/tasktools.h @@ -172,4 +172,6 @@ TASKMANAGER_EXPORT QRect screenGeometry(const QPoint &pos); * @param urls A list of URLs for the application to open. */ TASKMANAGER_EXPORT void runApp(const AppData &appData, const QList &urls = QList()); + +bool canLauchNewInstance(const AppData &appData); } diff --git a/libtaskmanager/waylandstartuptasksmodel.cpp b/libtaskmanager/waylandstartuptasksmodel.cpp index cd15e5516..3d8da303f 100644 --- a/libtaskmanager/waylandstartuptasksmodel.cpp +++ b/libtaskmanager/waylandstartuptasksmodel.cpp @@ -194,6 +194,8 @@ QVariant WaylandStartupTasksModel::data(const QModelIndex &index, int role) cons return data.launcherUrl; } else if (role == IsStartup) { return true; + } else if (role == CanLaunchNewInstance) { + return false; } return QVariant(); diff --git a/libtaskmanager/waylandtasksmodel.cpp b/libtaskmanager/waylandtasksmodel.cpp index e36d22450..dce3dde0d 100644 --- a/libtaskmanager/waylandtasksmodel.cpp +++ b/libtaskmanager/waylandtasksmodel.cpp @@ -83,6 +83,7 @@ void WaylandTasksModel::Private::init() AbstractTasksModel::GenericName, AbstractTasksModel::LauncherUrl, AbstractTasksModel::LauncherUrlWithoutIcon, + AbstractTasksModel::CanLaunchNewInstance, AbstractTasksModel::SkipTaskbar}); }; @@ -200,7 +201,7 @@ void WaylandTasksModel::Private::addWindow(KWayland::Client::PlasmaWindow *windo appDataCache.remove(window); // Refresh roles satisfied from the app data cache. - this->dataChanged(window, QVector{AppId, AppName, GenericName, LauncherUrl, LauncherUrlWithoutIcon, SkipTaskbar}); + this->dataChanged(window, QVector{AppId, AppName, GenericName, LauncherUrl, LauncherUrlWithoutIcon, SkipTaskbar, CanLaunchNewInstance}); }); QObject::connect(window, &KWayland::Client::PlasmaWindow::activeChanged, q, [window, this] { @@ -464,6 +465,8 @@ QVariant WaylandTasksModel::data(const QModelIndex &index, int role) const return window->applicationMenuObjectPath(); } else if (role == ApplicationMenuServiceName) { return window->applicationMenuServiceName(); + } else if (role == CanLaunchNewInstance) { + return canLauchNewInstance(d->appData(window)); } return QVariant(); diff --git a/libtaskmanager/xstartuptasksmodel.cpp b/libtaskmanager/xstartuptasksmodel.cpp index 9f9dd29f8..72c9c90ad 100644 --- a/libtaskmanager/xstartuptasksmodel.cpp +++ b/libtaskmanager/xstartuptasksmodel.cpp @@ -249,6 +249,8 @@ QVariant XStartupTasksModel::data(const QModelIndex &index, int role) const return QVariantList() << QVariant(data.desktop()); } else if (role == IsOnAllVirtualDesktops) { return (data.desktop() == 0); + } else if (role == CanLaunchNewInstance) { + return false; } return QVariant(); diff --git a/libtaskmanager/xwindowtasksmodel.cpp b/libtaskmanager/xwindowtasksmodel.cpp index 47493460a..f1e71b0b5 100644 --- a/libtaskmanager/xwindowtasksmodel.cpp +++ b/libtaskmanager/xwindowtasksmodel.cpp @@ -111,6 +111,7 @@ void XWindowTasksModel::Private::init() AbstractTasksModel::GenericName, AbstractTasksModel::LauncherUrl, AbstractTasksModel::LauncherUrlWithoutIcon, + AbstractTasksModel::CanLaunchNewInstance, AbstractTasksModel::SkipTaskbar}); }; @@ -316,7 +317,7 @@ void XWindowTasksModel::Private::windowChanged(WId window, NET::Properties prope if (properties & (NET::WMPid) || properties2 & (NET::WM2DesktopFileName | NET::WM2WindowClass)) { wipeInfoCache = true; wipeAppDataCache = true; - changedRoles << Qt::DecorationRole << AppId << AppName << GenericName << LauncherUrl << AppPid << SkipTaskbar; + changedRoles << Qt::DecorationRole << AppId << AppName << GenericName << LauncherUrl << AppPid << SkipTaskbar << CanLaunchNewInstance; } if (properties & (NET::WMName | NET::WMVisibleName)) { @@ -681,6 +682,8 @@ QVariant XWindowTasksModel::data(const QModelIndex &index, int role) const return d->appMenuObjectPath(window); } else if (role == ApplicationMenuServiceName) { return d->appMenuServiceName(window); + } else if (role == CanLaunchNewInstance) { + return canLauchNewInstance(d->appData(window)); } return QVariant();