diff --git a/libtaskmanager/CMakeLists.txt b/libtaskmanager/CMakeLists.txt --- a/libtaskmanager/CMakeLists.txt +++ b/libtaskmanager/CMakeLists.txt @@ -57,6 +57,7 @@ target_link_libraries(taskmanager PRIVATE Qt5::X11Extras + XCB::XCB KF5::IconThemes) endif() diff --git a/libtaskmanager/abstracttasksmodel.h b/libtaskmanager/abstracttasksmodel.h --- a/libtaskmanager/abstracttasksmodel.h +++ b/libtaskmanager/abstracttasksmodel.h @@ -96,6 +96,10 @@ model contents due to the asynchronous nature of the windowing system. */ LastActivated, /**< The timestamp of the last time a task was the active task. */ + ApplicationMenuServiceName, /**< The DBus service name for the application's menu. + May be empty. */ + ApplicationMenuObjectPath,/**< The DBus object path for the application's menu. + May be empty. */ }; Q_ENUM(AdditionalRoles) diff --git a/libtaskmanager/waylandtasksmodel.cpp b/libtaskmanager/waylandtasksmodel.cpp --- a/libtaskmanager/waylandtasksmodel.cpp +++ b/libtaskmanager/waylandtasksmodel.cpp @@ -312,6 +312,12 @@ QObject::connect(window, &KWayland::Client::PlasmaWindow::skipTaskbarChanged, q, [window, this] { this->dataChanged(window, SkipTaskbar); } ); + + QObject::connect(window, &KWayland::Client::PlasmaWindow::applicationMenuChanged, q, + [window, this] { + this->dataChanged(window, QVector{ApplicationMenuServiceName, ApplicationMenuObjectPath}); + } + ); } AppData WaylandTasksModel::Private::appData(KWayland::Client::PlasmaWindow *window) @@ -461,6 +467,10 @@ // FIXME Implement. } else if (role == AppPid) { return window->pid(); + } else if (role == ApplicationMenuObjectPath) { + return window->applicationMenuObjectPath(); + } else if (role == ApplicationMenuServiceName) { + return window->applicationMenuServiceName(); } return QVariant(); diff --git a/libtaskmanager/xwindowtasksmodel.cpp b/libtaskmanager/xwindowtasksmodel.cpp --- a/libtaskmanager/xwindowtasksmodel.cpp +++ b/libtaskmanager/xwindowtasksmodel.cpp @@ -22,6 +22,7 @@ #include "xwindowtasksmodel.h" #include "tasktools.h" #include "xwindowsystemeventbatcher.h" +#include #include #include @@ -44,6 +45,8 @@ #include #include +#include "xcb/xcb.h" + namespace TaskManager { @@ -81,6 +84,7 @@ KWindowInfo* windowInfo(WId window); AppData appData(WId window); + QPair appMenu(WId window); QIcon icon(WId window); static QString mimeType(); @@ -465,6 +469,13 @@ return data; } +// returns QPair for WId window +QPair XWindowTasksModel::Private::appMenu(WId window) +{ + auto info = windowInfo(window); + return qMakePair(QString::fromUtf8(info->applicationMenuServiceName()), QString::fromUtf8(info->applicationMenuObjectPath())); +} + QIcon XWindowTasksModel::Private::icon(WId window) { const AppData &app = appData(window); @@ -690,6 +701,10 @@ if (d->lastActivated.contains(window)) { return d->lastActivated.value(window); } + } else if (role == ApplicationMenuObjectPath) { + return d->appMenu(window).second; + } else if (role == ApplicationMenuServiceName) { + return d->appMenu(window).first; } return QVariant();