Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions plugins/application-tray/abstracttrayprotocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@

class TrayWidget;
namespace tray {

enum Protocol {
UNKNOWN = 0,
XEMBED,
SNI
};

class AbstractTrayProtocolHandler;
class AbstractTrayProtocol : public QObject
{
Expand All @@ -21,6 +28,9 @@ class AbstractTrayProtocol : public QObject

Q_SIGNALS:
void trayCreated(QPointer<AbstractTrayProtocolHandler> handler);

protected:
inline static QHash<uint, enum Protocol> registeredMap;
};

class AbstractTrayProtocolHandler : public QObject
Expand Down
8 changes: 8 additions & 0 deletions plugins/application-tray/sniprotocolhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ void SniTrayProtocol::registedItemChanged()
for (auto currentRegistedItem : currentRegistedItems) {
if (!m_registedItem.contains(currentRegistedItem)) {
auto trayHandler = QSharedPointer<SniTrayProtocolHandler>(new SniTrayProtocolHandler(currentRegistedItem));
uint pid = QDBusConnection::sessionBus().interface()->servicePid(SniTrayProtocolHandler::serviceAndPath(currentRegistedItem).first).value();
m_item2Pid[currentRegistedItem] = pid;
if (registeredMap[pid] != SNI)
emit removeXEmbedItemByPid(pid);
registeredMap[pid] = SNI;
m_registedItem.insert(currentRegistedItem, trayHandler);
Q_EMIT AbstractTrayProtocol::trayCreated(trayHandler.get());
}
Expand All @@ -86,6 +91,9 @@ void SniTrayProtocol::registedItemChanged()
for (auto alreadyRegistedItem : m_registedItem.keys()) {
if (!currentRegistedItems.contains(alreadyRegistedItem)) {
if (auto value = m_registedItem.value(alreadyRegistedItem, nullptr)) {
uint pid = m_item2Pid[alreadyRegistedItem];
m_item2Pid.remove(alreadyRegistedItem);
registeredMap.remove(pid);
Comment on lines +94 to +96

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Avoid using operator[] for lookups in m_item2Pid to prevent unintended insertions and desynchronization

Using m_item2Pid[alreadyRegistedItem] here will insert a default entry if the key is missing. If m_item2Pid and m_registedItem are ever out of sync, you’ll silently create an entry with pid 0 and then call registeredMap.remove(0). Prefer m_item2Pid.value(alreadyRegistedItem, 0) with a contains check, or guard the block with if (m_item2Pid.contains(alreadyRegistedItem)) to avoid unintended insertions.

m_registedItem.remove(alreadyRegistedItem);
}
}
Expand Down
4 changes: 4 additions & 0 deletions plugins/application-tray/sniprotocolhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,17 @@ class SniTrayProtocol : public AbstractTrayProtocol
explicit SniTrayProtocol(QObject *parent = nullptr);
~SniTrayProtocol();

Q_SIGNALS:
void removeXEmbedItemByPid(uint pid);

private Q_SLOTS:
void registedItemChanged();

private:
OrgKdeStatusNotifierWatcherInterface* m_trayManager;

QHash<QString, QSharedPointer<SniTrayProtocolHandler>> m_registedItem;
QHash<QString, uint> m_item2Pid;
};

class SniTrayProtocolHandler : public AbstractTrayProtocolHandler
Expand Down
1 change: 1 addition & 0 deletions plugins/application-tray/trayplugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ void TrayPlugin::init(PluginProxyInterface *proxyInter)

connect(sniProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
connect(indicatorProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
connect(sniProtocol, &SniTrayProtocol::removeXEmbedItemByPid, xembedProtocol, &XembedProtocol::onRemoveItemByPid);
if (UTIL->isXAvaliable()) {
connect(xembedProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
} else {
Expand Down
17 changes: 17 additions & 0 deletions plugins/application-tray/xembedprotocolhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ void XembedProtocol::onTrayIconsChanged()
for (auto currentRegistedItem : currentRegistedItems) {
if (!m_registedItem.contains(currentRegistedItem)) {
auto trayHandler = QSharedPointer<XembedProtocolHandler>(new XembedProtocolHandler(currentRegistedItem));
uint pid = UTIL->getWindowPid(trayHandler->windowId());
if (registeredMap[pid] == SNI)
continue;
registeredMap[pid] = XEMBED;
m_item2Pid[currentRegistedItem] = pid;
connect(m_trayManager, &TrayManager::Changed, trayHandler.get(), &XembedProtocolHandler::xembedTrayIconChanged);
m_registedItem.insert(currentRegistedItem, trayHandler);
Q_EMIT AbstractTrayProtocol::trayCreated(trayHandler.get());
Expand All @@ -97,6 +102,9 @@ void XembedProtocol::onTrayIconsChanged()
for (auto alreadyRegistedItem : m_registedItem.keys()) {
if (!currentRegistedItems.contains(alreadyRegistedItem)) {
if (auto value = m_registedItem.value(alreadyRegistedItem, nullptr)) {
uint pid = m_item2Pid[alreadyRegistedItem];
registeredMap.remove(pid);
m_item2Pid.remove(alreadyRegistedItem);
m_registedItem.remove(alreadyRegistedItem);
}
}
Expand All @@ -105,6 +113,15 @@ void XembedProtocol::onTrayIconsChanged()

}

void XembedProtocol::onRemoveItemByPid(uint pid)
{
auto it = std::find_if(m_registedItem.keys().begin(), m_registedItem.keys().end(), [this, pid] (uint id) { return pid == m_item2Pid[id]; });
if (it != m_registedItem.keys().end()) {
m_item2Pid.remove(*it);
m_registedItem.remove(*it);
}
}

XembedProtocolHandler::XembedProtocolHandler(const uint32_t& id, QObject* parent)
: AbstractTrayProtocolHandler(parent)
, m_enabled(false)
Expand Down
4 changes: 4 additions & 0 deletions plugins/application-tray/xembedprotocolhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class XembedProtocol : public AbstractTrayProtocol, public QAbstractNativeEventF
XembedProtocol(QObject *parent = nullptr);
~XembedProtocol();

public Q_SLOTS:
void onRemoveItemByPid(uint pid);

protected:
bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override;

Expand All @@ -36,6 +39,7 @@ private Q_SLOTS:
TrayManager* m_trayManager;
FdoSelectionManager *m_selectionManager = nullptr;
QHash<uint32_t, QSharedPointer<AbstractTrayProtocolHandler>> m_registedItem;
QHash<uint, uint> m_item2Pid;
};

class XembedProtocolHandler : public AbstractTrayProtocolHandler
Expand Down