aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/terminalhooks.cpp
diff options
context:
space:
mode:
authorMarcus Tillmanns <[email protected]>2023-03-22 16:54:53 +0100
committerMarcus Tillmanns <[email protected]>2023-03-23 11:42:00 +0000
commit1d9c96a9f456833c027e4220c19b7b9622b9d22d (patch)
treef8ef60bae301a3b8d4ea55f2ecf3ded16d7d874d /src/libs/utils/terminalhooks.cpp
parent75bdaf25d044750af44cb8cc491f53f4af7ac01f (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.cpp79
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 &parameters) {
+ : m_getTerminalCommandsForDevicesHook([] { return QList<NameAndCommandLine>{}; })
+ {
+ auto openTerminal = [](const OpenTerminalParameters &parameters) {
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 &parameters) 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