forked from qt-creator/qt-creator
Terminal: Enable TerminalProcessInterface
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>
This commit is contained in:
67
src/plugins/terminal/terminalprocessimpl.cpp
Normal file
67
src/plugins/terminal/terminalprocessimpl.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
// 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
|
Reference in New Issue
Block a user