Skip to content

Commit

Permalink
fix: Duplicate tray display
Browse files Browse the repository at this point in the history
app simultaneous register xembed and sni,causing duplicate display

use app pid filter

log:
  • Loading branch information
hudeng-go committed Aug 5, 2023
1 parent 9011e4a commit 6404e87
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 4 deletions.
40 changes: 36 additions & 4 deletions frame/window/tray/tray_monitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@
#include "tray_monitor.h"
#include "quicksettingcontroller.h"
#include "pluginsiteminterface.h"
#include "xembedtrayitemwidget.h"
#include "snitrayitemwidget.h"

#define REGISTERTED_WAY_IS_SNI 1
#define REGISTERTED_WAY_IS_XEMBED 2

TrayMonitor::TrayMonitor(QObject *parent)
: QObject(parent)
Expand Down Expand Up @@ -79,6 +84,20 @@ QList<PluginsItemInterface *> TrayMonitor::systemTrays() const
void TrayMonitor::onTrayIconsChanged()
{
QList<quint32> wids = m_trayInter->trayIcons();

// Filter winid by tray pid
QList<quint32> newWids;
for (auto wid : wids) {
uint pid = XEmbedTrayItemWidget::getWindowPID(wid);

// tray registered with sni, removed
if (m_trayPids.value(pid, REGISTERTED_WAY_IS_XEMBED) == REGISTERTED_WAY_IS_XEMBED) {
m_trayPids.insert(pid, REGISTERTED_WAY_IS_XEMBED);
newWids.append(wid);
}
}
wids = newWids;

if (m_trayWids == wids)
return;

Expand All @@ -101,10 +120,23 @@ void TrayMonitor::onSniItemsChanged()
{
//TODO 防止同一个进程注册多个sni服务
const QStringList &sniServices = m_sniWatcher->registeredStatusNotifierItems();
if (m_sniServices == sniServices)
return;

// Filter sni by pid
QStringList newSniServices;
for (auto s : sniServices) {
uint pid = SNITrayItemWidget::servicePID(s);
// tray registered with xembed, removed
// TODO: Priority use of SNI, need remove xembed tray by pid?
if (m_trayPids.value(pid, REGISTERTED_WAY_IS_SNI) == REGISTERTED_WAY_IS_SNI) {
m_trayPids.insert(pid, REGISTERTED_WAY_IS_SNI);
newSniServices.append(s);
}
}

if (m_sniServices == newSniServices)
return;

for (auto s : newSniServices) {
if (!m_sniServices.contains(s)) {
if (s.startsWith("/") || !s.contains("/")) {
qWarning() << __FUNCTION__ << "invalid sni service" << s;
Expand All @@ -115,12 +147,12 @@ void TrayMonitor::onSniItemsChanged()
}

for (auto s : m_sniServices) {
if (!sniServices.contains(s)) {
if (!newSniServices.contains(s)) {
Q_EMIT sniTrayRemoved(s);
}
}

m_sniServices = sniServices;
m_sniServices = newSniServices;
}

void TrayMonitor::startLoadIndicators()
Expand Down
1 change: 1 addition & 0 deletions frame/window/tray/tray_monitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public Q_SLOTS:
QStringList m_sniServices;
QStringList m_indicatorNames;
QList<PluginsItemInterface *> m_systemTrays;
QMap<uint, char> m_trayPids;
};

#endif // TRAYMONITOR_H

0 comments on commit 6404e87

Please sign in to comment.