fix: 修复程序注册两个不同图标时被拦截的问题

使用Set记录注册的PID会导致程序在同一协议上注册不同图标时,无法注册的问题。
更改使用Map来记录注册的PID和注册的协议映射,使用与之前相同的协议时,仍同意程序继续注册托盘。

Log: 程序需要注册两个不同的图标问题修复
Influence: 托盘
Bug: https://pms.uniontech.com/zentao/bug-view-105424.html
Change-Id: I99e51d4298f27359d6d27ed58cc0dfe95a75d4a7
This commit is contained in:
Liu Heng 2021-12-01 12:22:31 +08:00 committed by liuheng
parent dc0b4b2bc4
commit 0e30d5a2a5
5 changed files with 14 additions and 10 deletions

View File

@ -29,6 +29,7 @@
AbstractTrayWidget::AbstractTrayWidget(QWidget *parent, Qt::WindowFlags f)
: QWidget(parent, f)
, m_handleMouseReleaseTimer(new QTimer(this))
, m_ownerPID(0)
{
m_handleMouseReleaseTimer->setSingleShot(true);
m_handleMouseReleaseTimer->setInterval(100);

View File

@ -66,6 +66,6 @@ private:
QPair<QPoint, Qt::MouseButton> m_lastMouseReleaseData;
uint m_ownerPID = 0;
uint m_ownerPID;
};

View File

@ -43,6 +43,9 @@
#define SNI_WATCHER_SERVICE "org.kde.StatusNotifierWatcher"
#define SNI_WATCHER_PATH "/StatusNotifierWatcher"
#define REGISTERTED_WAY_IS_SNI 1
#define REGISTERTED_WAY_IS_XEMBED 2
using org::kde::StatusNotifierWatcher;
using namespace Dock;
@ -334,7 +337,7 @@ void TrayPlugin::sniItemsChanged()
}
for (auto itemKey : m_trayMap.keys()) {
if (!sinTrayKeyList.contains(itemKey) && SNITrayWidget::isSNIKey(itemKey)) {
m_registertedPID.remove(m_trayMap[itemKey]->getOwnerPID());
m_registertedPID.take(m_trayMap[itemKey]->getOwnerPID());
trayRemoved(itemKey);
}
}
@ -346,9 +349,9 @@ void TrayPlugin::sniItemsChanged()
}
for (int i = 0; i < sinTrayKeyList.size(); ++i) {
uint pid = SNITrayWidget::servicePID(itemServicePaths.at(i));
if (!m_registertedPID.contains(pid)) {
if (m_registertedPID.value(pid, REGISTERTED_WAY_IS_SNI) == REGISTERTED_WAY_IS_SNI) {
traySNIAdded(sinTrayKeyList.at(i), itemServicePaths.at(i));
m_registertedPID.insert(pid);
m_registertedPID.insert(pid, REGISTERTED_WAY_IS_SNI);
}
}
}
@ -364,8 +367,8 @@ void TrayPlugin::xembedItemsChanged()
uint pid = XEmbedTrayWidget::getWindowPID(winid);
allKeytary << XEmbedTrayWidget::toXEmbedKey(winid);
if (!m_registertedPID.contains(pid)) {
m_registertedPID.insert(pid);
if (m_registertedPID.value(pid, REGISTERTED_WAY_IS_XEMBED) == REGISTERTED_WAY_IS_XEMBED) {
m_registertedPID.insert(pid, REGISTERTED_WAY_IS_XEMBED);
newlyAddedWindowID << winid;
newlyAddedTrayKeyList << XEmbedTrayWidget::toXEmbedKey(winid);
}
@ -373,7 +376,7 @@ void TrayPlugin::xembedItemsChanged()
for (auto tray : m_trayMap.keys()) {
if (!allKeytary.contains(tray) && XEmbedTrayWidget::isXEmbedKey(tray)) {
m_registertedPID.remove(m_trayMap[tray]->getOwnerPID());
m_registertedPID.take(m_trayMap[tray]->getOwnerPID());
trayRemoved(tray);
}
}

View File

@ -105,7 +105,7 @@ private:
QMap<QString, AbstractTrayWidget *> m_trayMap;
QMap<QString, SNITrayWidget *> m_passiveSNITrayMap; //这个目前好像无用了
QMap<QString, IndicatorTray*> m_indicatorMap; //这个有键盘跟license
QSet<uint> m_registertedPID;
QMap<uint, char> m_registertedPID;
bool m_pluginLoaded;
std::mutex m_sniMutex;

View File

@ -578,11 +578,10 @@ bool XEmbedTrayWidget::isBadWindow()
uint XEmbedTrayWidget::getWindowPID(uint winId)
{
uint pid = 0;
const auto display = IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display();
if (!display) {
qWarning() << "QX11Info::connection() is " << display;
return pid;
return 0;
}
Atom nameAtom = XInternAtom(display, "_NET_WM_PID", 1);
@ -591,6 +590,7 @@ uint XEmbedTrayWidget::getWindowPID(uint winId)
unsigned long nitems, after;
unsigned char *data;
unsigned int pid = 0;
status = XGetWindowProperty(display, winId, nameAtom, 0, 1024, 0,
XInternAtom(display, "CARDINAL", 0), &type, &format, &nitems, &after, &data);