From 56b222dc97db4c28f75513aabdac1f03d49f8dff Mon Sep 17 00:00:00 2001 From: songwentao Date: Tue, 10 Jan 2023 17:23:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=8E=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E5=92=8C=E5=90=AF=E5=8A=A8=E5=99=A8=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=B5=8F=E8=A7=88=E5=99=A8=EF=BC=88=E7=8E=B2?= =?UTF-8?q?=E7=8F=91=EF=BC=89=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 玲珑应用Desktop文件Exec字段内容构成的字符串中包含字串,且字串不允许被拆分 对接玲珑组开发人员后,由AM对该问题进行修复 Log: Influence: 从桌面和启动器都可以正常打开浏览器(玲珑)应用 Task: https://pms.uniontech.com/task-view-236197.html Change-Id: I874bb3b9ba5d9d086279857e8d826b04e0a7ab58 --- src/modules/startmanager/startmanager.cpp | 42 ++++++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/modules/startmanager/startmanager.cpp b/src/modules/startmanager/startmanager.cpp index 30f08df..cc90f52 100644 --- a/src/modules/startmanager/startmanager.cpp +++ b/src/modules/startmanager/startmanager.cpp @@ -343,7 +343,7 @@ bool StartManager::doLaunchAppWithOptions(const QString &desktopFile) return false; } - launch(&info, QString::fromStdString(info.getCommandLine()).remove("\""), 0, QStringList()); + launch(&info, QString::fromStdString(info.getCommandLine()), 0, QStringList()); dbusHandler->markLaunched(desktopFile); @@ -372,7 +372,7 @@ bool StartManager::doLaunchAppWithOptions(QString desktopFile, uint32_t timestam return false; } - launch(&info, QString::fromStdString(info.getCommandLine()).remove("\""), timestamp, files); + launch(&info, info.getCommandLine().c_str(), timestamp, files); // mark app launched dbusHandler->markLaunched(desktopFile); @@ -382,6 +382,21 @@ bool StartManager::doLaunchAppWithOptions(QString desktopFile, uint32_t timestam bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp, QStringList files) { + /// 玲珑应用-浏览器应用比较特殊,Exec字段内容字符串中包含子串,且以空格分割时会导致浏览器无法启动的问题 + /// 与玲珑组开发对接,他们暂无有效方式优化该问题,AM 从自身Exec字段内容特点进行解析,修复该问题 + /// \brief subExecPos + /// + const int subExecPos = cmdLine.indexOf("--exec", 0); + const QString subArgStr = cmdLine.mid(subExecPos); + + // 保留字符串头部的转移字符\" + const QString subExecArgStr = subArgStr.section("\"", 1, 2, QString::SectionIncludeLeadingSep); + // 保留字符串尾部的转移字符\" + const QString subStr = subExecArgStr.section("\"", 0, 1, QString::SectionIncludeTrailingSep).remove("\""); + + // 从Exec字段内容中移除引号 + cmdLine.remove("\""); + QProcess process; QStringList cmdPrefixesEnvs; QStringList envs; @@ -416,6 +431,20 @@ bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp QStringList exeArgs; exeArgs << cmdLine.split(" "); + // 如果Exec字段内容字符串中包含子字符串,则要确保子串的内容不被分割 + // 先从被分割的列表中移除重复字段,然后将--Exec后面的子串内容整体插入 + if (!subStr.isEmpty()) { + QStringList tempExeArgs = exeArgs; + for (const QString &arg : exeArgs) { + if (subStr.contains(arg)) + tempExeArgs.removeOne(arg); + } + + exeArgs = tempExeArgs; + int pos = exeArgs.indexOf("--exec"); + exeArgs.insert(pos + 1, subStr); + } + handleRecognizeArgs(exeArgs, files); if (info->getTerminal()) { @@ -428,11 +457,14 @@ bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp workingDir = BaseDir::homeDir(); } - QString exec = exeArgs[0]; - exeArgs.removeAt(0); + QString exec; + if (!exeArgs.isEmpty()) { + exec = exeArgs[0]; + exeArgs.removeAt(0); + } #ifdef QT_DEBUG - qDebug() << "launchApp: " << desktopFile << " exec: " << exec << " args: " << exeArgs; + qInfo() << "launchApp: " << desktopFile << " exec: " << exec << " args: " << exeArgs; #endif process.setWorkingDirectory(workingDir.c_str());