Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Duplicate tray display #897

Closed
wants to merge 1 commit into from
Closed
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
39 changes: 35 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,19 @@ QList<PluginsItemInterface *> TrayMonitor::systemTrays() const
void TrayMonitor::onTrayIconsChanged()
{
QList<quint32> wids = m_trayInter->trayIcons();

// Filter xembed by tray pid
QList<quint32> filteredWids;
for (auto wid : wids) {
uint pid = XEmbedTrayItemWidget::getWindowPID(wid);
// filter registered sni tray
if (m_trayPids.value(pid, REGISTERTED_WAY_IS_XEMBED) == REGISTERTED_WAY_IS_XEMBED) {
m_trayPids.insert(pid, REGISTERTED_WAY_IS_XEMBED);
filteredWids.append(wid);
}
}
wids = filteredWids;

if (m_trayWids == wids)
return;

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

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

if (m_sniServices == filteredSniServices)
return;

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

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

m_sniServices = sniServices;
m_sniServices = filteredSniServices;
}

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
Loading