mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
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:
parent
dc0b4b2bc4
commit
0e30d5a2a5
@ -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);
|
||||
|
@ -66,6 +66,6 @@ private:
|
||||
|
||||
QPair<QPoint, Qt::MouseButton> m_lastMouseReleaseData;
|
||||
|
||||
uint m_ownerPID = 0;
|
||||
uint m_ownerPID;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user