diff options
author | Marcus Tillmanns <[email protected]> | 2023-05-04 08:09:40 +0200 |
---|---|---|
committer | Marcus Tillmanns <[email protected]> | 2023-05-04 10:43:36 +0000 |
commit | e6081aaa0a845a3cb9af1e4ff9cc8278aca2c276 (patch) | |
tree | 2e713b9cbf24cd66b2b780f7e511ffcfa354cbbb /src/libs/utils/terminalhooks.cpp | |
parent | a059f87754c68aec9095b092f23a8cab325a5dfc (diff) |
Utils: Add TerminalMode::Detached
Change-Id: Ic36845d3469719e17f24602ce80f3e6cfc984fbf
Reviewed-by: Christian Stenger <[email protected]>
Diffstat (limited to 'src/libs/utils/terminalhooks.cpp')
-rw-r--r-- | src/libs/utils/terminalhooks.cpp | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/src/libs/utils/terminalhooks.cpp b/src/libs/utils/terminalhooks.cpp index b6faae765d5..355aefe2c22 100644 --- a/src/libs/utils/terminalhooks.cpp +++ b/src/libs/utils/terminalhooks.cpp @@ -7,6 +7,7 @@ #include "process.h" #include "terminalcommand.h" #include "terminalinterface.h" +#include "utilstr.h" #include <QMutex> #include <QTemporaryFile> @@ -39,24 +40,20 @@ class ExternalTerminalProcessImpl final : public TerminalInterface : m_interface(interface) {} - void startStubProcess(const CommandLine &cmd, const ProcessSetupData &) override + ~ProcessStubCreator() override = default; + + expected_str<qint64> startStubProcess(const CommandLine &cmd, + const ProcessSetupData &setupData) override { const TerminalCommand terminal = TerminalCommand::terminalEmulator(); - if (HostOsInfo::isWindowsHost()) { - m_terminalProcess.setCommand(cmd); - QObject::connect(&m_terminalProcess, &Process::done, this, [this] { - m_interface->onStubExited(); - }); - m_terminalProcess.setCreateConsoleOnWindows(true); - m_terminalProcess.setProcessMode(ProcessMode::Writer); - m_terminalProcess.start(); - } else if (HostOsInfo::isMacHost() && terminal.command == "Terminal.app") { + if (HostOsInfo::isMacHost() && terminal.command == "Terminal.app") { QTemporaryFile f; f.setAutoRemove(false); f.open(); f.setPermissions(QFile::ExeUser | QFile::ReadUser | QFile::WriteUser); f.write("#!/bin/sh\n"); + f.write(QString("cd %1\n").arg(setupData.m_workingDirectory.nativePath()).toUtf8()); f.write("clear\n"); f.write(QString("exec '%1' %2\n") .arg(cmd.executable().nativePath()) @@ -69,20 +66,59 @@ class ExternalTerminalProcessImpl final : public TerminalInterface = QString("tell app \"Terminal\" to do script \"'%1'; rm -f '%1'; exit\"") .arg(path); - m_terminalProcess.setCommand( + Process process; + + process.setCommand( {"osascript", {"-e", "tell app \"Terminal\" to activate", "-e", exe}}); - m_terminalProcess.runBlocking(); + process.runBlocking(); + + if (process.exitCode() != 0) { + return make_unexpected(Tr::tr("Failed to start terminal process: \"%1\"") + .arg(process.errorString())); + } + + return 0; + } + + bool detached = setupData.m_terminalMode == TerminalMode::Detached; + + Process *process = new Process(detached ? nullptr : this); + if (detached) + QObject::connect(process, &Process::done, process, &Process::deleteLater); + + QObject::connect(process, + &Process::done, + m_interface, + &ExternalTerminalProcessImpl::onStubExited); + + process->setWorkingDirectory(setupData.m_workingDirectory); + + if constexpr (HostOsInfo::isWindowsHost()) { + process->setCommand(cmd); + process->setCreateConsoleOnWindows(true); + process->setProcessMode(ProcessMode::Writer); } else { - CommandLine cmdLine = {terminal.command, {terminal.executeArgs}}; + QString extraArgsFromOptions = detached ? terminal.openArgs : terminal.executeArgs; + CommandLine cmdLine = {terminal.command, {}}; + if (!extraArgsFromOptions.isEmpty()) + cmdLine.addArgs(extraArgsFromOptions, CommandLine::Raw); cmdLine.addCommandLineAsArgs(cmd, CommandLine::Raw); + process->setCommand(cmdLine); + } - m_terminalProcess.setCommand(cmdLine); - m_terminalProcess.start(); + process->start(); + process->waitForStarted(); + if (process->error() != QProcess::UnknownError) { + return make_unexpected( + Tr::tr("Failed to start terminal process: \"%1\"").arg(process->errorString())); } + + qint64 pid = process->processId(); + + return pid; } ExternalTerminalProcessImpl *m_interface; - Process m_terminalProcess; }; public: |