diff options
author | Marcus Tillmanns <[email protected]> | 2023-03-22 16:54:53 +0100 |
---|---|---|
committer | Marcus Tillmanns <[email protected]> | 2023-03-23 11:42:00 +0000 |
commit | 1d9c96a9f456833c027e4220c19b7b9622b9d22d (patch) | |
tree | f8ef60bae301a3b8d4ea55f2ecf3ded16d7d874d /src/libs/utils/terminalhooks.cpp | |
parent | 75bdaf25d044750af44cb8cc491f53f4af7ac01f (diff) |
Terminal: Add enable setting
Change-Id: I13cca8b2d4c55df7db29807c1252718e2819ea0b
Reviewed-by: Cristian Adam <[email protected]>
Diffstat (limited to 'src/libs/utils/terminalhooks.cpp')
-rw-r--r-- | src/libs/utils/terminalhooks.cpp | 79 |
1 files changed, 67 insertions, 12 deletions
diff --git a/src/libs/utils/terminalhooks.cpp b/src/libs/utils/terminalhooks.cpp index 6ee46b33616..6922f5c4304 100644 --- a/src/libs/utils/terminalhooks.cpp +++ b/src/libs/utils/terminalhooks.cpp @@ -8,6 +8,7 @@ #include "terminalcommand.h" #include "terminalinterface.h" +#include <QMutex> #include <QTemporaryFile> namespace Utils::Terminal { @@ -88,21 +89,65 @@ public: ExternalTerminalProcessImpl() { setStubCreator(new ProcessStubCreator(this)); } }; -struct HooksPrivate +class HooksPrivate { +public: HooksPrivate() - : m_openTerminalHook([](const OpenTerminalParameters ¶meters) { + : m_getTerminalCommandsForDevicesHook([] { return QList<NameAndCommandLine>{}; }) + { + auto openTerminal = [](const OpenTerminalParameters ¶meters) { DeviceFileHooks::instance().openTerminal(parameters.workingDirectory.value_or( FilePath{}), parameters.environment.value_or(Environment{})); - }) - , m_createTerminalProcessInterfaceHook([] { return new ExternalTerminalProcessImpl(); }) - , m_getTerminalCommandsForDevicesHook([] { return QList<NameAndCommandLine>{}; }) - {} + }; + auto createProcessInterface = []() { return new ExternalTerminalProcessImpl(); }; + + addCallbackSet("External", {openTerminal, createProcessInterface}); + } + + void addCallbackSet(const QString &name, const Hooks::CallbackSet &callbackSet) + { + QMutexLocker lk(&m_mutex); + m_callbackSets.push_back(qMakePair(name, callbackSet)); + + m_createTerminalProcessInterface + = m_callbackSets.back().second.createTerminalProcessInterface; + m_openTerminal = m_callbackSets.back().second.openTerminal; + } + + void removeCallbackSet(const QString &name) + { + if (name == "External") + return; + + QMutexLocker lk(&m_mutex); + m_callbackSets.removeIf([name](const auto &pair) { return pair.first == name; }); + + m_createTerminalProcessInterface + = m_callbackSets.back().second.createTerminalProcessInterface; + m_openTerminal = m_callbackSets.back().second.openTerminal; + } + + Hooks::CreateTerminalProcessInterface createTerminalProcessInterface() + { + QMutexLocker lk(&m_mutex); + return m_createTerminalProcessInterface; + } + + Hooks::OpenTerminal openTerminal() + { + QMutexLocker lk(&m_mutex); + return m_openTerminal; + } - Hooks::OpenTerminalHook m_openTerminalHook; - Hooks::CreateTerminalProcessInterfaceHook m_createTerminalProcessInterfaceHook; Hooks::GetTerminalCommandsForDevicesHook m_getTerminalCommandsForDevicesHook; + +private: + Hooks::OpenTerminal m_openTerminal; + Hooks::CreateTerminalProcessInterface m_createTerminalProcessInterface; + + QMutex m_mutex; + QList<QPair<QString, Hooks::CallbackSet>> m_callbackSets; }; Hooks &Hooks::instance() @@ -117,14 +162,14 @@ Hooks::Hooks() Hooks::~Hooks() = default; -Hooks::OpenTerminalHook &Hooks::openTerminalHook() +void Hooks::openTerminal(const OpenTerminalParameters ¶meters) const { - return d->m_openTerminalHook; + d->openTerminal()(parameters); } -Hooks::CreateTerminalProcessInterfaceHook &Hooks::createTerminalProcessInterfaceHook() +ProcessInterface *Hooks::createTerminalProcessInterface() const { - return d->m_createTerminalProcessInterfaceHook; + return d->createTerminalProcessInterface()(); } Hooks::GetTerminalCommandsForDevicesHook &Hooks::getTerminalCommandsForDevicesHook() @@ -132,4 +177,14 @@ Hooks::GetTerminalCommandsForDevicesHook &Hooks::getTerminalCommandsForDevicesHo return d->m_getTerminalCommandsForDevicesHook; } +void Hooks::addCallbackSet(const QString &name, const CallbackSet &callbackSet) +{ + d->addCallbackSet(name, callbackSet); +} + +void Hooks::removeCallbackSet(const QString &name) +{ + d->removeCallbackSet(name); +} + } // namespace Utils::Terminal |