From 49daa163530ceabc9eaa8911ab96b5f799cfb552 Mon Sep 17 00:00:00 2001 From: Fabien Proriol Date: Sun, 25 May 2025 17:58:09 +0200 Subject: Initial Commit --- src/waylandentries.cpp | 159 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 src/waylandentries.cpp (limited to 'src/waylandentries.cpp') diff --git a/src/waylandentries.cpp b/src/waylandentries.cpp new file mode 100644 index 0000000..42808bb --- /dev/null +++ b/src/waylandentries.cpp @@ -0,0 +1,159 @@ +#include "waylandentries.h" +#include +#include +#include +#include + +WaylandEntries *m_instance = nullptr; + +WaylandEntries::WaylandEntries(QObject *parent) + : QAbstractListModel(parent) +{ + if(m_instance != nullptr) + { + qWarning() << "Many instance of WaylandEntries"; + } + m_instance = this; +} + +int WaylandEntries::rowCount(const QModelIndex &parent) const +{ + QMutexLocker locker(&m_lock); + return m_surfaces.count(); +} + +QVariant WaylandEntries::data(const QModelIndex &index, int role) const +{ + QMutexLocker locker(&m_lock); + if(index.row() > m_surfaces.count()) + return QVariant(); + + QWaylandXdgSurface *surface = m_surfaces[index.row()]; + if(surface == nullptr) + return QVariant(); + + switch(role) { + case Qt::DisplayRole: + case TitleRole: + return surface->toplevel()->title(); + case AppIdRole: + return surface->toplevel()->appId(); + case SurfaceRole: + return QVariant::fromValue(surface); + case PidRole: + return surface->surface()->client()->processId(); + } + + return QVariant(); +} + +QHash WaylandEntries::roleNames() const +{ + QHash roles = QAbstractItemModel::roleNames(); + roles[SurfaceRole] = "wl_surface"; + roles[TitleRole] = "title"; + roles[PidRole] = "pid"; + roles[AppIdRole] = "appId"; + return roles; +} + +// Need only for application manager interface for cli +WaylandEntries *WaylandEntries::getInstance() +{ + return m_instance; +} + +void WaylandEntries::addSurface(QObject *obj) +{ + QMutexLocker locker(&m_lock); + QWaylandXdgSurface *s = qobject_cast(obj); + if(s) + { + QObject::connect(s, &QWaylandXdgSurface::destroyed, this, &WaylandEntries::surfaceDestroyed); + if(m_hidden.contains(s->surface()->client()->processId())) + { + m_surfaces_hidden.append(s); + } + else + { + int id = m_surfaces.count(); + beginInsertRows(QModelIndex(), m_surfaces.count(), m_surfaces.count()); + QObject::connect(s->toplevel(), &QWaylandXdgToplevel::titleChanged, this, [this, id](){ + const QVector roles = {TitleRole}; + emit dataChanged(index(id), index(id), roles); + }); + QObject::connect(s->toplevel(), &QWaylandXdgToplevel::appIdChanged, this, [this, id, s](){ + const QVector roles = {AppIdRole}; + + emit topWindowRegistered(s, s->toplevel()->appId()); + emit dataChanged(index(id), index(id), roles); + }); + m_surfaces.append(s); + endInsertRows(); + emit nbAppsChanged(); + } + } +} + +void WaylandEntries::addHidePid(qint64 pid) +{ + QMutexLocker locker(&m_lock); + m_hidden.append(pid); + QWaylandXdgSurface *surfaceToHide = nullptr; + + for(QWaylandXdgSurface *surface: m_surfaces) + { + if(surface->surface()->client()->processId() == pid) + { + surfaceToHide = surface; + break; + } + } + if(surfaceToHide) + { + beginRemoveRows(QModelIndex(), m_surfaces.indexOf(surfaceToHide), m_surfaces.indexOf(surfaceToHide)); + m_surfaces.removeAll(surfaceToHide); + endRemoveRows(); + m_surfaces_hidden.append(surfaceToHide); + emit nbAppsChanged(); + } +} + +void WaylandEntries::surfaceDestroyed() +{ + QObject *obj = QObject::sender(); + QWaylandXdgSurface *s = static_cast(obj); + emit topWindowDestroyed(s, s->toplevel()->appId()); + QMutexLocker locker(&m_lock); + beginRemoveRows(QModelIndex(), m_surfaces.indexOf(s), m_surfaces.indexOf(s)); + m_surfaces.removeAll(s); + endRemoveRows(); + emit nbAppsChanged(); +} + +void WaylandEntries::stop(int pid) +{ + kill(pid, SIGTERM); +} + +QObject *WaylandEntries::getSurface(int pid) +{ + QMutexLocker locker(&m_lock); + for(QWaylandXdgSurface *surface: m_surfaces) + { + if(surface->surface()->client()->processId() == pid) + return surface; + } + for(QWaylandXdgSurface *surface: m_surfaces_hidden) + { + if(surface->surface()->client()->processId() == pid) + return surface; + } + return nullptr; +} + +int WaylandEntries::nbApps() const +{ + QMutexLocker locker(&m_lock); + return m_surfaces.count(); +} -- cgit v1.2.3