diff --git a/src/libs/utils/processenums.h b/src/libs/utils/processenums.h index 1c16f22dcb4..6ea37a2d37a 100644 --- a/src/libs/utils/processenums.h +++ b/src/libs/utils/processenums.h @@ -24,7 +24,6 @@ enum class ProcessImpl { enum class TerminalMode { Off, - Pty, Run, Debug, Suspend, diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h index 210df7d268a..5f3a4378d48 100644 --- a/src/libs/utils/processinterface.h +++ b/src/libs/utils/processinterface.h @@ -50,7 +50,7 @@ public: ProcessMode m_processMode = ProcessMode::Reader; TerminalMode m_terminalMode = TerminalMode::Off; - Pty::Data m_ptyData; + std::optional m_ptyData; CommandLine m_commandLine; FilePath m_workingDirectory; Environment m_environment; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 4808764ddde..a5de95d29db 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -310,7 +310,7 @@ private: class PtyProcessImpl final : public DefaultImpl { public: - ~PtyProcessImpl() { m_setup.m_ptyData.setResizeHandler({}); } + ~PtyProcessImpl() { QTC_CHECK(m_setup.m_ptyData); m_setup.m_ptyData->setResizeHandler({}); } qint64 write(const QByteArray &data) final { @@ -338,7 +338,8 @@ public: void doDefaultStart(const QString &program, const QStringList &arguments) final { - m_setup.m_ptyData.setResizeHandler([this](const QSize &size) { + QTC_CHECK(m_setup.m_ptyData); + m_setup.m_ptyData->setResizeHandler([this](const QSize &size) { if (m_ptyProcess) m_ptyProcess->resize(size.width(), size.height()); }); @@ -357,8 +358,8 @@ public: arguments, m_setup.m_workingDirectory.path(), m_setup.m_environment.toProcessEnvironment().toStringList(), - m_setup.m_ptyData.size().width(), - m_setup.m_ptyData.size().height()); + m_setup.m_ptyData->size().width(), + m_setup.m_ptyData->size().height()); if (!startResult) { const ProcessResultData result = {-1, @@ -725,16 +726,16 @@ public: ProcessInterface *createProcessInterface() { - if (m_setup.m_terminalMode == TerminalMode::Pty) - return new PtyProcessImpl(); + if (m_setup.m_ptyData) + return new PtyProcessImpl; if (m_setup.m_terminalMode != TerminalMode::Off) return Terminal::Hooks::instance().createTerminalProcessInterfaceHook()(); const ProcessImpl impl = m_setup.m_processImpl == ProcessImpl::Default ? defaultProcessImpl() : m_setup.m_processImpl; if (impl == ProcessImpl::QProcess) - return new QProcessImpl(); - return new ProcessLauncherImpl(); + return new QProcessImpl; + return new ProcessLauncherImpl; } void setProcessInterface(ProcessInterface *process) @@ -1123,12 +1124,12 @@ void QtcProcess::setProcessImpl(ProcessImpl processImpl) d->m_setup.m_processImpl = processImpl; } -void QtcProcess::setPtyData(const Pty::Data &data) +void QtcProcess::setPtyData(const std::optional &data) { d->m_setup.m_ptyData = data; } -Pty::Data QtcProcess::ptyData() const +std::optional QtcProcess::ptyData() const { return d->m_setup.m_ptyData; } diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 72181051491..9d539f08e20 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -77,8 +77,8 @@ public: void setProcessImpl(ProcessImpl processImpl); - void setPtyData(const Pty::Data &data); - Pty::Data ptyData() const; + void setPtyData(const std::optional &data); + std::optional ptyData() const; void setTerminalMode(TerminalMode mode); TerminalMode terminalMode() const; diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index e96ce9d6a47..020aeec31f4 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -304,7 +304,7 @@ void DockerProcessImpl::start() m_setup.m_workingDirectory, interactive, true, - m_setup.m_terminalMode == TerminalMode::Pty); + m_setup.m_ptyData.has_value()); m_process.setCommand(fullCommandLine); m_process.start(); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 345f6e28497..57eaf8ccd14 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -535,7 +535,7 @@ QString LinuxProcessInterface::fullCommandLine(const CommandLine &commandLine) c cmd.addArgs("&&", CommandLine::Raw); } - if (m_setup.m_terminalMode == TerminalMode::Off) + if (m_setup.m_terminalMode == TerminalMode::Off && !m_setup.m_ptyData) cmd.addArgs(QString("echo ") + s_pidMarker + "$$" + s_pidMarker + " && ", CommandLine::Raw); const Environment &env = m_setup.m_environment; @@ -543,7 +543,7 @@ QString LinuxProcessInterface::fullCommandLine(const CommandLine &commandLine) c cmd.addArgs(key + "='" + env.expandVariables(value) + '\'', CommandLine::Raw); }); - if (m_setup.m_terminalMode == TerminalMode::Off) + if (m_setup.m_terminalMode == TerminalMode::Off && !m_setup.m_ptyData) cmd.addArg("exec"); if (!commandLine.isEmpty()) @@ -555,7 +555,7 @@ void LinuxProcessInterface::handleStarted(qint64 processId) { // Don't emit started() when terminal is off, // it's being done later inside handleReadyReadStandardOutput(). - if (m_setup.m_terminalMode == TerminalMode::Off) + if (m_setup.m_terminalMode == TerminalMode::Off && !m_setup.m_ptyData) return; m_pidParsed = true; @@ -740,7 +740,7 @@ CommandLine SshProcessInterfacePrivate::fullLocalCommandLine() const if (!m_sshParameters.x11DisplayName.isEmpty()) cmd.addArg("-X"); - if (q->m_setup.m_terminalMode != TerminalMode::Off) + if (q->m_setup.m_terminalMode != TerminalMode::Off || q->m_setup.m_ptyData) cmd.addArg("-tt"); cmd.addArg("-q"); diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 0321c0ce5ca..23da5088ce9 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -126,7 +126,7 @@ void TerminalWidget::setupPty() env.unset("CLINK_NOAUTORUN"); m_process->setProcessMode(ProcessMode::Writer); - m_process->setTerminalMode(TerminalMode::Pty); + m_process->setPtyData(Utils::Pty::Data()); m_process->setCommand(shellCommand); if (m_openParameters.workingDirectory.has_value()) m_process->setWorkingDirectory(*m_openParameters.workingDirectory); @@ -912,8 +912,8 @@ void TerminalWidget::applySizeChange() if (newLiveSize.width() <= 0) newLiveSize.setWidth(1); - if (m_process) - m_process->ptyData().resize(newLiveSize); + if (m_process && m_process->ptyData()) + m_process->ptyData()->resize(newLiveSize); m_surface->resize(newLiveSize); flushVTerm(true);