From 893a7f4f7beec7ee5e02c0a9525592b4f46fa3e2 Mon Sep 17 00:00:00 2001 From: visualfc Date: Thu, 13 Aug 2026 15:53:43 +0800 Subject: [PATCH] fix process for Qt6 --- .../src/plugins/dlvdebugger/dlvdebugger.cpp | 2 +- .../plugins/dlvdebugger/dlvrpcdebugger.cpp | 2 +- .../src/plugins/gdbdebugger/gdbdebugger.cpp | 2 +- liteidex/src/plugins/gopls/goplsplugin.cpp | 81 ++++++++++++++++++- liteidex/src/plugins/gopls/goplsplugin.h | 8 ++ liteidex/src/plugins/terminal/terminal.cpp | 6 +- liteidex/src/utils/processex/processex.cpp | 12 +++ 7 files changed, 104 insertions(+), 9 deletions(-) diff --git a/liteidex/src/plugins/dlvdebugger/dlvdebugger.cpp b/liteidex/src/plugins/dlvdebugger/dlvdebugger.cpp index 78eaf2ba..13a00771 100644 --- a/liteidex/src/plugins/dlvdebugger/dlvdebugger.cpp +++ b/liteidex/src/plugins/dlvdebugger/dlvdebugger.cpp @@ -995,7 +995,7 @@ void DlvDebugger::headlessReadStdOutput() m_process->setNativeArguments(argsList.join(" ")); m_process->start("\""+m_dlvFilePath+"\""); #else - m_process->start(m_dlvFilePath + " " + argsList.join(" ")); + m_process->start(m_dlvFilePath,argsList); #endif QString log = QString("%1 %2 [%3]").arg(m_dlvFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory()); emit debugLog(LiteApi::DebugRuntimeLog,log); diff --git a/liteidex/src/plugins/dlvdebugger/dlvrpcdebugger.cpp b/liteidex/src/plugins/dlvdebugger/dlvrpcdebugger.cpp index f5971b9d..a39d8fd1 100644 --- a/liteidex/src/plugins/dlvdebugger/dlvrpcdebugger.cpp +++ b/liteidex/src/plugins/dlvdebugger/dlvrpcdebugger.cpp @@ -1409,7 +1409,7 @@ void DlvRpcDebugger::headlessReadStdOutput() m_process->setNativeArguments(argsList.join(" ")); m_process->start("\""+m_dlvFilePath+"\""); #else - m_process->start(m_dlvFilePath + " " + argsList.join(" ")); + m_process->start(m_dlvFilePath,argsList); #endif QString log = QString("%1 %2 [%3]").arg(m_dlvFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory()); emit debugLog(LiteApi::DebugRuntimeLog,log); diff --git a/liteidex/src/plugins/gdbdebugger/gdbdebugger.cpp b/liteidex/src/plugins/gdbdebugger/gdbdebugger.cpp index 325cffd6..25cbed47 100644 --- a/liteidex/src/plugins/gdbdebugger/gdbdebugger.cpp +++ b/liteidex/src/plugins/gdbdebugger/gdbdebugger.cpp @@ -239,7 +239,7 @@ bool GdbDebugger::start(const QString &program, const QString &arguments) m_process->setNativeArguments(argsList.join(" ")); m_process->start("\""+m_gdbFilePath+"\""); #else - m_process->start(m_gdbFilePath + " " + argsList.join(" ")); + m_process->start(m_gdbFilePath,argsList); #endif QString log = QString("%1 %2 [%3]").arg(m_gdbFilePath).arg(argsList.join(" ")).arg(m_process->workingDirectory()); diff --git a/liteidex/src/plugins/gopls/goplsplugin.cpp b/liteidex/src/plugins/gopls/goplsplugin.cpp index 2e7f2445..290a052d 100644 --- a/liteidex/src/plugins/gopls/goplsplugin.cpp +++ b/liteidex/src/plugins/gopls/goplsplugin.cpp @@ -7,15 +7,18 @@ #include "fileutil/fileutil.h" #include +#include #include #include #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -88,6 +91,26 @@ QStringList GoplsPlugin::dependPluginList() const return QStringList() << "plugin/liteenv" << "plugin/golangast" << "plugin/litefind"; } +bool GoplsPlugin::eventFilter(QObject *object, QEvent *event) +{ + LiteApi::IEditor *editor = m_hoverViewports.value(object); + if (!m_ready || !editor || event->type() != QEvent::ToolTip) { + return LiteApi::IPlugin::eventFilter(object,event); + } + if (QApplication::keyboardModifiers() & Qt::ControlModifier) { + return LiteApi::IPlugin::eventFilter(object,event); + } + QPlainTextEdit *plainTextEdit = LiteApi::getPlainTextEdit(editor); + if (!plainTextEdit) { + return LiteApi::IPlugin::eventFilter(object,event); + } + QHelpEvent *helpEvent = static_cast(event); + QTextCursor cursor = plainTextEdit->cursorForPosition(helpEvent->pos()); + LiteApi::selectWordUnderCursor(cursor); + requestHover(editor,cursor,helpEvent->globalPos()); + return true; +} + QString GoplsPlugin::workspaceRoot() const { LiteApi::IProject *project = m_liteApp->projectManager()->currentProject(); @@ -172,6 +195,7 @@ void GoplsPlugin::clientStopped() m_completionPrefixes.clear(); m_completionRoots.clear(); m_pendingCompletions.clear(); + m_pendingHovers.clear(); setLegacyCompletionEnabled(true); } @@ -211,6 +235,11 @@ void GoplsPlugin::editorCreated(LiteApi::IEditor *editor) if (liteEditor) { connect(liteEditor,SIGNAL(updateLink(QTextCursor,QPoint,bool)),this,SLOT(hoverRequested(QTextCursor,QPoint,bool)),Qt::UniqueConnection); } + QPlainTextEdit *plainTextEdit = LiteApi::getPlainTextEdit(editor); + if (plainTextEdit && !m_hoverViewports.contains(plainTextEdit->viewport())) { + plainTextEdit->viewport()->installEventFilter(this); + m_hoverViewports.insert(plainTextEdit->viewport(),editor); + } addEditorActions(editor); if (m_ready) { openDocument(editor); @@ -316,6 +345,17 @@ void GoplsPlugin::editorAboutToClose(LiteApi::IEditor *editor) m_completionEditors.remove(requestId); m_completionPrefixes.remove(requestId); m_completionRoots.remove(requestId); + int hoverId = m_pendingHovers.take(editor); + if (hoverId) { + m_client->notify("$/cancelRequest",QJsonObject{{"id",hoverId}}); + m_hintEditors.remove(hoverId); + m_hintPositions.remove(hoverId); + } + QObject *viewport = m_hoverViewports.key(editor,0); + if (viewport) { + viewport->removeEventFilter(this); + m_hoverViewports.remove(viewport); + } disconnect(editor,0,this,0); } @@ -492,6 +532,12 @@ void GoplsPlugin::handleHintResponse(int id, const QString &method, const QJsonV { LiteApi::IEditor *editor = m_hintEditors.take(id); QPoint position = m_hintPositions.take(id); + if (method == "textDocument/hover") { + if (!editor || m_pendingHovers.value(editor) != id) { + return; + } + m_pendingHovers.remove(editor); + } if (!editor || !error.isEmpty() || result.isNull()) { return; } @@ -625,7 +671,18 @@ QString GoplsPlugin::markupText(const QJsonValue &value) const } if (value.isObject()) { QJsonObject object = value.toObject(); - return object.value("value").toString(object.value("language").toString()); + QString text = object.value("value").toString(); + if (object.value("kind").toString() == "markdown") { +#if QT_VERSION >= QT_VERSION_CHECK(5,14,0) + QTextDocument document; + document.setMarkdown(text); + text = document.toPlainText(); +#else + text.replace(QRegExp("```[A-Za-z0-9_+.-]*\\n"),QString()); + text.replace("```",QString()); +#endif + } + return text.trimmed(); } if (value.isArray()) { QStringList parts; @@ -633,7 +690,7 @@ QString GoplsPlugin::markupText(const QJsonValue &value) const QString text = markupText(part); if (!text.isEmpty()) parts.append(text); } - return parts.join("\n"); + return parts.join("\n\n"); } return QString(); } @@ -645,16 +702,36 @@ void GoplsPlugin::hoverRequested(const QTextCursor &cursor, const QPoint &positi } LiteApi::ILiteEditor *liteEditor = qobject_cast(sender()); LiteApi::IEditor *editor = liteEditor; + requestHover(editor,cursor,position); +} + +void GoplsPlugin::requestHover(LiteApi::IEditor *editor, const QTextCursor &cursor, + const QPoint &position) +{ if (!isGoEditor(editor) || cursor.selectedText().trimmed().isEmpty()) { + int oldId = m_pendingHovers.take(editor); + if (oldId) { + m_client->notify("$/cancelRequest",QJsonObject{{"id",oldId}}); + m_hintEditors.remove(oldId); + m_hintPositions.remove(oldId); + } return; } QTextCursor requestCursor = cursor; requestCursor.setPosition(cursor.selectionStart()); QJsonObject params{{"textDocument",QJsonObject{{"uri",documentUri(editor)}}}, {"position",QJsonObject{{"line",requestCursor.blockNumber()},{"character",requestCursor.positionInBlock()}}}}; + changeDocument(editor); + int oldId = m_pendingHovers.value(editor,0); + if (oldId) { + m_client->notify("$/cancelRequest",QJsonObject{{"id",oldId}}); + m_hintEditors.remove(oldId); + m_hintPositions.remove(oldId); + } int id = m_client->request("textDocument/hover",params); m_hintEditors.insert(id,editor); m_hintPositions.insert(id,position); + m_pendingHovers.insert(editor,id); } void GoplsPlugin::requestSignatureHelp(LiteApi::IEditor *editor) diff --git a/liteidex/src/plugins/gopls/goplsplugin.h b/liteidex/src/plugins/gopls/goplsplugin.h index ec7714aa..879be4a6 100644 --- a/liteidex/src/plugins/gopls/goplsplugin.h +++ b/liteidex/src/plugins/gopls/goplsplugin.h @@ -12,6 +12,7 @@ class GoplsClient; class GoplsSearchResults; class QAction; +class QEvent; namespace LiteApi { class ICompleter; } class GoplsPlugin : public LiteApi::IPlugin @@ -23,6 +24,9 @@ class GoplsPlugin : public LiteApi::IPlugin virtual bool load(LiteApi::IApplication *app); virtual QStringList dependPluginList() const; +protected: + bool eventFilter(QObject *object, QEvent *event); + private slots: void appLoaded(); void clientInitialized(); @@ -64,6 +68,8 @@ private slots: void requestLocations(const QString &method); void addEditorActions(LiteApi::IEditor *editor); void requestSignatureHelp(LiteApi::IEditor *editor); + void requestHover(LiteApi::IEditor *editor, const QTextCursor &cursor, + const QPoint &position); QString markupText(const QJsonValue &value) const; void applyWorkspaceEdit(const QJsonObject &workspaceEdit); void applyTextEdits(const QString &uri, QJsonArray edits); @@ -86,6 +92,8 @@ private slots: QAction *m_implementationAction; QHash m_hintEditors; QHash m_hintPositions; + QHash m_pendingHovers; + QHash m_hoverViewports; QAction *m_renameAction; QAction *m_formatAction; QAction *m_organizeImportsAction; diff --git a/liteidex/src/plugins/terminal/terminal.cpp b/liteidex/src/plugins/terminal/terminal.cpp index f7db0056..b7368591 100644 --- a/liteidex/src/plugins/terminal/terminal.cpp +++ b/liteidex/src/plugins/terminal/terminal.cpp @@ -271,10 +271,9 @@ Terminal::Terminal(LiteApi::IApplication *app, QObject *parent) : LiteApi::ITerm #ifdef Q_OS_MAC static QMap getProcessWorkDirList(const QStringList &pids) { - QString cmd = QString("lsof -a -p %1 -d cwd -Fn").arg(pids.join(",")); QMap kv; QProcess p; - p.start(cmd); + p.start("lsof",QStringList() << "-a" << "-p" << pids.join(",") << "-d" << "cwd" << "-Fn"); if (!p.waitForStarted(1000)) { return kv; } @@ -320,9 +319,8 @@ static QMap getProcessWorkDirList(const QStringList &pids) // pwdx 9194 9947 // 9194: /home/my // 9947: /home/my - QString cmd = QString("pwdx %1").arg(pids.join(" ")); QProcess p; - p.start(cmd); + p.start("pwdx",pids); if (!p.waitForStarted(1000)) { return kv; } diff --git a/liteidex/src/utils/processex/processex.cpp b/liteidex/src/utils/processex/processex.cpp index 18ad4708..7df2e027 100755 --- a/liteidex/src/utils/processex/processex.cpp +++ b/liteidex/src/utils/processex/processex.cpp @@ -186,7 +186,11 @@ void Process::stopAndWait(int termMs, int finishMs) void Process::startEx(const QString &cmd, const QStringList &args) { +#ifdef Q_OS_WIN this->startEx(cmd,args.join(" ")); +#else + this->start(cmd,args); +#endif } void Process::startEx(const QString &cmd, const QString &args) @@ -198,6 +202,9 @@ void Process::startEx(const QString &cmd, const QString &args) } else { this->start(cmd); } +#else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + this->start(cmd,QProcess::splitCommand(args)); #else if (cmd.contains(' ')) { this->start("\""+cmd+"\" "+args); @@ -205,6 +212,7 @@ void Process::startEx(const QString &cmd, const QString &args) this->start(cmd+" "+args); } #endif +#endif } bool Process::startDetachedExAndHide(const QString &cmd, const QStringList &args) @@ -275,9 +283,13 @@ void LiteProcess::startEx(const QString &cmd, const QString &args) this->setNativeArguments(args); this->start(cmd); } +#else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + this->start(cmd,QProcess::splitCommand(args)); #else this->start(cmd+" "+args); #endif +#endif } #ifdef Q_OS_WIN