1、wayland环境下根据窗口Id获取当前激活窗口错误,导致无法获取激活窗口 2、释放鼠标的时候没有触发激活窗口的判断函数,导致任务栏在拖动过程中释放鼠标后,没有发送是否隐藏信号 Log: 修复wayland下设置智能隐藏失败的问题 Influence: 进入wayland环境,任务栏设置智能隐藏,窗口拖动到任务栏下方,观察窗口是否隐藏,窗口移出任务栏,观察任务栏是否显示 Bug: https://pms.uniontech.com/bug-view-154513.html Change-Id: I4de3b4db019a664f184b0676bb8ce2a77d1d66a9
129 lines
3.5 KiB
C++
129 lines
3.5 KiB
C++
/*
|
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
|
*
|
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
|
*
|
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "waylandmanager.h"
|
|
#include "dock.h"
|
|
#include "xcbutils.h"
|
|
|
|
#define XCB XCBUtils::instance()
|
|
|
|
WaylandManager::WaylandManager(Dock *_dock, QObject *parent)
|
|
: QObject(parent)
|
|
, m_dock(_dock)
|
|
, 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_dock->createPlasmaWindow(objPath);
|
|
if (!plasmaWindow) {
|
|
qWarning() << "registerWindowWayland: createPlasmaWindow failed";
|
|
return;
|
|
}
|
|
|
|
QString appId = plasmaWindow->AppId();
|
|
QStringList list {"dde-dock", "dde-launcher", "dde-clipboard", "dde-osd", "dde-polkit-agent", "dde-simple-egl", "dmcs"};
|
|
if (list.indexOf(appId) >= 0)
|
|
return;
|
|
|
|
XWindow winId = XCB->allocId(); // XCB中未发现释放XID接口
|
|
XWindow realId = plasmaWindow->WindowId();
|
|
if (realId)
|
|
winId = realId;
|
|
|
|
WindowInfoK *winInfo = new WindowInfoK(plasmaWindow, winId);
|
|
m_dock->listenKWindowSignals(winInfo);
|
|
insertWindow(objPath, winInfo);
|
|
m_dock->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_dock->removePlasmaWindowHandler(winInfo->getPlasmaWindow());
|
|
m_dock->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);
|
|
}
|
|
|