diff options
author | Marcus Tillmanns <[email protected]> | 2023-05-25 10:56:07 +0200 |
---|---|---|
committer | Marcus Tillmanns <[email protected]> | 2023-05-25 09:24:36 +0000 |
commit | 06365fa39fd6621de2452d99ad057bb27cf190a4 (patch) | |
tree | 2fca3bc879e54e529b62c155b8090f38a37226e9 /src/libs/utils/terminalhooks.cpp | |
parent | 0d95c68b2146f704a77b9ba4a8c0b07df584d03d (diff) |
Terminal: External terminal if blocked by modal
Change-Id: I89ba438c7a9f4d593e849b9b7ca2daf202cca625
Reviewed-by: hjk <[email protected]>
Diffstat (limited to 'src/libs/utils/terminalhooks.cpp')
-rw-r--r-- | src/libs/utils/terminalhooks.cpp | 98 |
1 files changed, 1 insertions, 97 deletions
diff --git a/src/libs/utils/terminalhooks.cpp b/src/libs/utils/terminalhooks.cpp index 07ebbd98d2f..3bda25b109c 100644 --- a/src/libs/utils/terminalhooks.cpp +++ b/src/libs/utils/terminalhooks.cpp @@ -3,14 +3,11 @@ #include "terminalhooks.h" +#include "externalterminalprocessimpl.h" #include "filepath.h" #include "process.h" -#include "terminalcommand.h" -#include "terminalinterface.h" -#include "utilstr.h" #include <QMutex> -#include <QTemporaryFile> namespace Utils::Terminal { @@ -31,99 +28,6 @@ FilePath defaultShellForDevice(const FilePath &deviceRoot) return deviceRoot.withNewMappedPath(shell); } -class ExternalTerminalProcessImpl final : public TerminalInterface -{ - class ProcessStubCreator : public StubCreator - { - public: - ProcessStubCreator(ExternalTerminalProcessImpl *interface) - : m_interface(interface) - {} - - ~ProcessStubCreator() override = default; - - expected_str<qint64> startStubProcess(const ProcessSetupData &setupData) override - { - const TerminalCommand terminal = TerminalCommand::terminalEmulator(); - - 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(setupData.m_commandLine.executable().nativePath()) - .arg(setupData.m_commandLine.arguments()) - .toUtf8()); - f.close(); - - const QString path = f.fileName(); - const QString exe - = QString("tell app \"Terminal\" to do script \"'%1'; rm -f '%1'; exit\"") - .arg(path); - - Process process; - - process.setCommand( - {"osascript", {"-e", "tell app \"Terminal\" to activate", "-e", exe}}); - 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(setupData.m_commandLine); - process->setCreateConsoleOnWindows(true); - process->setProcessMode(ProcessMode::Writer); - } else { - QString extraArgsFromOptions = detached ? terminal.openArgs : terminal.executeArgs; - CommandLine cmdLine = {terminal.command, {}}; - if (!extraArgsFromOptions.isEmpty()) - cmdLine.addArgs(extraArgsFromOptions, CommandLine::Raw); - cmdLine.addCommandLineAsArgs(setupData.m_commandLine, CommandLine::Raw); - process->setCommand(cmdLine); - } - - 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; - }; - -public: - ExternalTerminalProcessImpl() { setStubCreator(new ProcessStubCreator(this)); } -}; - class HooksPrivate { public: |