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
90 lines
2.5 KiB
C++
90 lines
2.5 KiB
C++
// SPDX-FileCopyrightText: 2022 ~ 2022 Deepin Technology Co., Ltd.
|
||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||
//
|
||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
||
#include "bamfdesktop.h"
|
||
|
||
#include <QDir>
|
||
#include <qstandardpaths.h>
|
||
|
||
#define BAMF_INDEX_NAME "bamf-2.index"
|
||
|
||
BamfDesktop *BamfDesktop::instance()
|
||
{
|
||
static BamfDesktop instance;
|
||
return &instance;
|
||
}
|
||
|
||
QString BamfDesktop::fileName(const QString &instanceName) const
|
||
{
|
||
for (const BamfData &lineData: m_bamfLineData) {
|
||
if (lineData.instanceName.toLower() == instanceName.toLower()) {
|
||
QString name = lineData.lineData.split("\t").first();
|
||
return QString("%1%2").arg(lineData.directory).arg(name);
|
||
}
|
||
}
|
||
|
||
// 如果根据instanceName没有找到,则根据空格来进行分隔
|
||
for (const BamfData &lineData: m_bamfLineData) {
|
||
QStringList lines = lineData.lineData.split("\t");
|
||
if (lines.size() < 2)
|
||
continue;
|
||
|
||
QStringList cmds = lines[2].split(" ");
|
||
if (cmds.size() > 1 && cmds[1].toLower() == instanceName.toLower())
|
||
return QString("%1%2").arg(lineData.directory).arg(lines.first());
|
||
}
|
||
|
||
return instanceName;
|
||
}
|
||
|
||
BamfDesktop::BamfDesktop()
|
||
{
|
||
loadDesktopFiles();
|
||
}
|
||
|
||
BamfDesktop::~BamfDesktop()
|
||
{
|
||
}
|
||
|
||
QStringList BamfDesktop::applicationDirs() const
|
||
{
|
||
QStringList appDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
|
||
QStringList directions;
|
||
for (auto appDir : appDirs)
|
||
directions << appDir;
|
||
|
||
return directions;
|
||
}
|
||
|
||
void BamfDesktop::loadDesktopFiles()
|
||
{
|
||
QStringList directions = applicationDirs();
|
||
for (const QString &direction : directions) {
|
||
// 读取后缀名为
|
||
QDir dir(direction);
|
||
dir.setNameFilters(QStringList() << BAMF_INDEX_NAME);
|
||
QFileInfoList fileList = dir.entryInfoList();
|
||
if (fileList.size() == 0)
|
||
continue;
|
||
|
||
QFileInfo fileInfo = fileList.at(0);
|
||
QFile file(fileInfo.absoluteFilePath());
|
||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||
continue;
|
||
|
||
QList<QPair<QString, QString>> bamfLine;
|
||
while (!file.atEnd()) {
|
||
QString line = file.readLine();
|
||
QStringList part = line.split("\t");
|
||
BamfData bamf;
|
||
bamf.directory = direction;
|
||
if (part.size() > 2)
|
||
bamf.instanceName = part[2].trimmed();
|
||
bamf.lineData = line;
|
||
m_bamfLineData << bamf;
|
||
}
|
||
}
|
||
}
|