Skip to content

Commit f4a5d38

Browse files
ArchieMengBLumia
authored andcommitted
fix: Avoid showing XEMBED and SNI plugins together
The trayplugin-loader will only show SNI plugin when both plugins are both available. Bug: https://pms.uniontech.com/bug-view-270397.html Log: Avoid showing XEMBED and SNI plugins together
1 parent 6989e05 commit f4a5d38

6 files changed

Lines changed: 44 additions & 0 deletions

File tree

plugins/application-tray/abstracttrayprotocol.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111

1212
class TrayWidget;
1313
namespace tray {
14+
15+
enum Protocol {
16+
UNKNOWN = 0,
17+
XEMBED,
18+
SNI
19+
};
20+
1421
class AbstractTrayProtocolHandler;
1522
class AbstractTrayProtocol : public QObject
1623
{
@@ -21,6 +28,9 @@ class AbstractTrayProtocol : public QObject
2128

2229
Q_SIGNALS:
2330
void trayCreated(QPointer<AbstractTrayProtocolHandler> handler);
31+
32+
protected:
33+
inline static QHash<uint, enum Protocol> registeredMap;
2434
};
2535

2636
class AbstractTrayProtocolHandler : public QObject

plugins/application-tray/sniprotocolhandler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ void SniTrayProtocol::registedItemChanged()
7878
for (auto currentRegistedItem : currentRegistedItems) {
7979
if (!m_registedItem.contains(currentRegistedItem)) {
8080
auto trayHandler = QSharedPointer<SniTrayProtocolHandler>(new SniTrayProtocolHandler(currentRegistedItem));
81+
uint pid = QDBusConnection::sessionBus().interface()->servicePid(SniTrayProtocolHandler::serviceAndPath(currentRegistedItem).first).value();
82+
m_item2Pid[currentRegistedItem] = pid;
83+
if (registeredMap[pid] != SNI)
84+
emit removeXEmbedItemByPid(pid);
85+
registeredMap[pid] = SNI;
8186
m_registedItem.insert(currentRegistedItem, trayHandler);
8287
Q_EMIT AbstractTrayProtocol::trayCreated(trayHandler.get());
8388
}
@@ -86,6 +91,9 @@ void SniTrayProtocol::registedItemChanged()
8691
for (auto alreadyRegistedItem : m_registedItem.keys()) {
8792
if (!currentRegistedItems.contains(alreadyRegistedItem)) {
8893
if (auto value = m_registedItem.value(alreadyRegistedItem, nullptr)) {
94+
uint pid = m_item2Pid[alreadyRegistedItem];
95+
m_item2Pid.remove(alreadyRegistedItem);
96+
registeredMap.remove(pid);
8997
m_registedItem.remove(alreadyRegistedItem);
9098
}
9199
}

plugins/application-tray/sniprotocolhandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@ class SniTrayProtocol : public AbstractTrayProtocol
2727
explicit SniTrayProtocol(QObject *parent = nullptr);
2828
~SniTrayProtocol();
2929

30+
Q_SIGNALS:
31+
void removeXEmbedItemByPid(uint pid);
32+
3033
private Q_SLOTS:
3134
void registedItemChanged();
3235

3336
private:
3437
OrgKdeStatusNotifierWatcherInterface* m_trayManager;
3538

3639
QHash<QString, QSharedPointer<SniTrayProtocolHandler>> m_registedItem;
40+
QHash<QString, uint> m_item2Pid;
3741
};
3842

3943
class SniTrayProtocolHandler : public AbstractTrayProtocolHandler

plugins/application-tray/trayplugin.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ void TrayPlugin::init(PluginProxyInterface *proxyInter)
5959

6060
connect(sniProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
6161
connect(indicatorProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
62+
connect(sniProtocol, &SniTrayProtocol::removeXEmbedItemByPid, xembedProtocol, &XembedProtocol::onRemoveItemByPid);
6263
if (UTIL->isXAvaliable()) {
6364
connect(xembedProtocol, &SniTrayProtocol::trayCreated, this, &TrayPlugin::onTrayhandlerCreatd);
6465
} else {

plugins/application-tray/xembedprotocolhandler.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ void XembedProtocol::onTrayIconsChanged()
8888
for (auto currentRegistedItem : currentRegistedItems) {
8989
if (!m_registedItem.contains(currentRegistedItem)) {
9090
auto trayHandler = QSharedPointer<XembedProtocolHandler>(new XembedProtocolHandler(currentRegistedItem));
91+
uint pid = UTIL->getWindowPid(trayHandler->windowId());
92+
if (registeredMap[pid] == SNI)
93+
continue;
94+
registeredMap[pid] = XEMBED;
95+
m_item2Pid[currentRegistedItem] = pid;
9196
connect(m_trayManager, &TrayManager::Changed, trayHandler.get(), &XembedProtocolHandler::xembedTrayIconChanged);
9297
m_registedItem.insert(currentRegistedItem, trayHandler);
9398
Q_EMIT AbstractTrayProtocol::trayCreated(trayHandler.get());
@@ -97,6 +102,9 @@ void XembedProtocol::onTrayIconsChanged()
97102
for (auto alreadyRegistedItem : m_registedItem.keys()) {
98103
if (!currentRegistedItems.contains(alreadyRegistedItem)) {
99104
if (auto value = m_registedItem.value(alreadyRegistedItem, nullptr)) {
105+
uint pid = m_item2Pid[alreadyRegistedItem];
106+
registeredMap.remove(pid);
107+
m_item2Pid.remove(alreadyRegistedItem);
100108
m_registedItem.remove(alreadyRegistedItem);
101109
}
102110
}
@@ -105,6 +113,15 @@ void XembedProtocol::onTrayIconsChanged()
105113

106114
}
107115

116+
void XembedProtocol::onRemoveItemByPid(uint pid)
117+
{
118+
auto it = std::find_if(m_registedItem.keys().begin(), m_registedItem.keys().end(), [this, pid] (uint id) { return pid == m_item2Pid[id]; });
119+
if (it != m_registedItem.keys().end()) {
120+
m_item2Pid.remove(*it);
121+
m_registedItem.remove(*it);
122+
}
123+
}
124+
108125
XembedProtocolHandler::XembedProtocolHandler(const uint32_t& id, QObject* parent)
109126
: AbstractTrayProtocolHandler(parent)
110127
, m_enabled(false)

plugins/application-tray/xembedprotocolhandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class XembedProtocol : public AbstractTrayProtocol, public QAbstractNativeEventF
2626
XembedProtocol(QObject *parent = nullptr);
2727
~XembedProtocol();
2828

29+
public Q_SLOTS:
30+
void onRemoveItemByPid(uint pid);
31+
2932
protected:
3033
bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override;
3134

@@ -36,6 +39,7 @@ private Q_SLOTS:
3639
TrayManager* m_trayManager;
3740
FdoSelectionManager *m_selectionManager = nullptr;
3841
QHash<uint32_t, QSharedPointer<AbstractTrayProtocolHandler>> m_registedItem;
42+
QHash<uint, uint> m_item2Pid;
3943
};
4044

4145
class XembedProtocolHandler : public AbstractTrayProtocolHandler

0 commit comments

Comments
 (0)