mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-05-30 22:01:41 +00:00

1. taskmanager used to identify which entry should map to window in x11 environmrnt, listen to xevent in anohter thread, and handle those event when window create, destory, changed. use some way to identify which entry(desktopfile) should mapped to changed window. in wayland, connected plsamawindow signal(window created destoried. 2. use taskmanager instead of dbus in old dock code log: as title
120 lines
3.2 KiB
C++
120 lines
3.2 KiB
C++
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
|
//
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "waylandmanager.h"
|
|
#include "taskmanager.h"
|
|
#include "taskmanager/entry.h"
|
|
#include "xcbutils.h"
|
|
|
|
#define XCB XCBUtils::instance()
|
|
|
|
WaylandManager::WaylandManager(TaskManager *_taskmanager, QObject *parent)
|
|
: QObject(parent)
|
|
, m_taskmanager(_taskmanager)
|
|
, m_mutex(QMutex(QMutex::NonRecursive))
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief WaylandManager::registerWindow 注册窗口
|
|
* @param objPath
|
|
*/
|
|
void WaylandManager::registerWindow(const QString &objPath)
|
|
{
|
|
qInfo() << "registerWindow: " << objPath;
|
|
if (findWindowByObjPath(objPath))
|
|
return;
|
|
|
|
PlasmaWindow *plasmaWindow = m_taskmanager->createPlasmaWindow(objPath);
|
|
if (!plasmaWindow) {
|
|
qWarning() << "registerWindowWayland: createPlasmaWindow failed";
|
|
return;
|
|
}
|
|
|
|
if (!plasmaWindow->IsValid() || !plasmaWindow->isValid()) {
|
|
qWarning() << "PlasmaWindow is not valid:" << objPath;
|
|
plasmaWindow->deleteLater();
|
|
return;
|
|
}
|
|
|
|
QString appId = plasmaWindow->AppId();
|
|
QStringList list {"dde-dock", "dde-launcher", "dde-clipboard", "dde-osd", "dde-polkit-agent", "dde-simple-egl", "dmcs", "dde-lock"};
|
|
if (list.indexOf(appId) >= 0 || appId.startsWith("No such object path")) {
|
|
plasmaWindow->deleteLater();
|
|
return;
|
|
}
|
|
|
|
XWindow winId = XCB->allocId(); // XCB中未发现释放XID接口
|
|
XWindow realId = plasmaWindow->WindowId();
|
|
if (realId)
|
|
winId = realId;
|
|
|
|
WindowInfoK *winInfo = new WindowInfoK(plasmaWindow, winId);
|
|
m_taskmanager->listenKWindowSignals(winInfo);
|
|
insertWindow(objPath, winInfo);
|
|
m_taskmanager->attachOrDetachWindow(winInfo);
|
|
if (winId) {
|
|
m_windowInfoMap[winId] = winInfo;
|
|
}
|
|
}
|
|
|
|
// 取消注册窗口
|
|
void WaylandManager::unRegisterWindow(const QString &objPath)
|
|
{
|
|
qInfo() << "unRegisterWindow: " << objPath;
|
|
WindowInfoK *winInfo = findWindowByObjPath(objPath);
|
|
if (!winInfo)
|
|
return;
|
|
|
|
m_taskmanager->removePlasmaWindowHandler(winInfo->getPlasmaWindow());
|
|
m_taskmanager->detachWindow(winInfo);
|
|
deleteWindow(objPath);
|
|
}
|
|
|
|
WindowInfoK *WaylandManager::findWindowById(uint activeWin)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
for (auto iter = m_kWinInfos.begin(); iter != m_kWinInfos.end(); iter++) {
|
|
if (iter.value()->getInnerId() == QString::number(activeWin)) {
|
|
return iter.value();
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
WindowInfoK *WaylandManager::findWindowByXid(XWindow xid)
|
|
{
|
|
WindowInfoK *winInfo = nullptr;
|
|
for (auto iter = m_kWinInfos.begin(); iter != m_kWinInfos.end(); iter++) {
|
|
if (iter.value()->getXid() == xid) {
|
|
winInfo = iter.value();
|
|
break;
|
|
}
|
|
}
|
|
|
|
return winInfo;
|
|
}
|
|
|
|
WindowInfoK *WaylandManager::findWindowByObjPath(QString objPath)
|
|
{
|
|
if (m_kWinInfos.find(objPath) == m_kWinInfos.end())
|
|
return nullptr;
|
|
|
|
return m_kWinInfos[objPath];
|
|
}
|
|
|
|
void WaylandManager::insertWindow(QString objPath, WindowInfoK *windowInfo)
|
|
{
|
|
QMutexLocker locker(&m_mutex);
|
|
m_kWinInfos[objPath] = windowInfo;
|
|
}
|
|
|
|
void WaylandManager::deleteWindow(QString objPath)
|
|
{
|
|
m_kWinInfos.remove(objPath);
|
|
}
|