forked from qt-creator/qt-creator
Adds a new helper app "process_stub" that replaces the previous. "process_stub_unix/win". The purpose was and is to allow processes to be "injected" into other hosts apps like terminals while still being able to control and debug them. A new base class called "TerminalInterface" is used for both the new Terminal plugin and the legacy TerminalProcess implementation. Fixes: QTCREATORBUG-16364 Change-Id: If21273fe53ad545d1a768c17c83db4bf2fd85395 Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> Reviewed-by: hjk <hjk@qt.io>
68 lines
2.1 KiB
C++
68 lines
2.1 KiB
C++
// Copyright (C) 2022 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
|
|
|
#include "terminalprocessimpl.h"
|
|
#include "terminalwidget.h"
|
|
|
|
#include <QCoreApplication>
|
|
#include <QLocalServer>
|
|
#include <QLocalSocket>
|
|
#include <QLoggingCategory>
|
|
#include <QTemporaryFile>
|
|
#include <QTimer>
|
|
|
|
Q_LOGGING_CATEGORY(terminalProcessLog, "qtc.terminal.stubprocess", QtDebugMsg)
|
|
|
|
using namespace Utils;
|
|
using namespace Utils::Terminal;
|
|
|
|
namespace Terminal {
|
|
|
|
class ProcessStubCreator : public StubCreator
|
|
{
|
|
public:
|
|
ProcessStubCreator(TerminalProcessImpl *interface, TerminalPane *terminalPane)
|
|
: m_terminalPane(terminalPane)
|
|
, m_process(interface)
|
|
{}
|
|
|
|
void startStubProcess(const CommandLine &cmd, const ProcessSetupData &setup) override
|
|
{
|
|
const Id id = Id::fromString(setup.m_commandLine.executable().toUserOutput());
|
|
|
|
TerminalWidget *terminal = m_terminalPane->stoppedTerminalWithId(id);
|
|
|
|
const OpenTerminalParameters openParameters{cmd,
|
|
std::nullopt,
|
|
std::nullopt,
|
|
ExitBehavior::Keep,
|
|
id};
|
|
|
|
if (!terminal) {
|
|
terminal = new TerminalWidget(nullptr, openParameters);
|
|
|
|
terminal->setShellName(setup.m_commandLine.executable().fileName());
|
|
m_terminalPane->addTerminal(terminal, "App");
|
|
} else {
|
|
terminal->restart(openParameters);
|
|
}
|
|
|
|
connect(terminal, &TerminalWidget::destroyed, m_process, [process = m_process] {
|
|
if (process->inferiorProcessId())
|
|
process->emitFinished(-1, QProcess::CrashExit);
|
|
});
|
|
}
|
|
|
|
TerminalPane *m_terminalPane;
|
|
TerminalProcessImpl *m_process;
|
|
};
|
|
|
|
TerminalProcessImpl::TerminalProcessImpl(TerminalPane *terminalPane)
|
|
{
|
|
auto creator = new ProcessStubCreator(this, terminalPane);
|
|
creator->moveToThread(qApp->thread());
|
|
setStubCreator(creator);
|
|
}
|
|
|
|
} // namespace Terminal
|