diff --git a/libtaskmanager/abstracttasksmodel.h b/libtaskmanager/abstracttasksmodel.h --- a/libtaskmanager/abstracttasksmodel.h +++ b/libtaskmanager/abstracttasksmodel.h @@ -83,6 +83,7 @@ IsDemandingAttention, /**< Task is demanding attention. */ SkipTaskbar, /**< Task should not be shown in a 'task bar' user interface. */ SkipPager, /**< Task should not to be shown in a 'pager' user interface. */ + AppPid, /**< Application Process ID */ }; Q_ENUM(AdditionalRoles) diff --git a/libtaskmanager/tasktools.h b/libtaskmanager/tasktools.h --- a/libtaskmanager/tasktools.h +++ b/libtaskmanager/tasktools.h @@ -37,6 +37,7 @@ QString genericName; // Generic application name. QIcon icon; QUrl url; + int pid; }; enum UrlComparisonMode { diff --git a/libtaskmanager/xwindowtasksmodel.cpp b/libtaskmanager/xwindowtasksmodel.cpp --- a/libtaskmanager/xwindowtasksmodel.cpp +++ b/libtaskmanager/xwindowtasksmodel.cpp @@ -345,7 +345,7 @@ || properties2 & (NET::WM2DesktopFileName | NET::WM2WindowClass)) { wipeInfoCache = true; wipeAppDataCache = true; - changedRoles << Qt::DisplayRole << Qt::DecorationRole << AppId << AppName << GenericName << LauncherUrl; + changedRoles << Qt::DisplayRole << Qt::DecorationRole << AppId << AppName << GenericName << LauncherUrl << AppPid; } if ((properties & NET::WMIcon) && !changedRoles.contains(Qt::DecorationRole)) { @@ -427,20 +427,16 @@ AppData XWindowTasksModel::Private::appData(WId window) { if (!appDataCache.contains(window)) { - const AppData &data = appDataFromUrl(windowUrl(window)); + AppData data = appDataFromUrl(windowUrl(window)); + + data.pid = NETWinInfo(QX11Info::connection(), window, QX11Info::appRootWindow(), NET::WMPid, 0).pid(); // If we weren't able to derive a launcher URL from the window meta data, // fall back to WM_CLASS Class string as app id. This helps with apps we // can't map to an URL due to existing outside the regular system // environment, e.g. wine clients. if (data.id.isEmpty() && data.url.isEmpty()) { - AppData dataCopy = data; - - dataCopy.id = windowInfo(window)->windowClassClass(); - - appDataCache.insert(window, dataCopy); - - return dataCopy; + data.id = windowInfo(window)->windowClassClass(); } appDataCache.insert(window, data); @@ -921,6 +917,8 @@ return (info->hasState(NET::SkipTaskbar) || info->windowType(NET::UtilityMask) == NET::Utility); } else if (role == SkipPager) { return d->windowInfo(window)->hasState(NET::SkipPager); + } else if (role == AppPid) { + return d->appData(window).pid; } return QVariant();