// 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 #pragma once #include "commandline.h" #include "environment.h" #include "filepath.h" #include "id.h" #include #include #include namespace Utils { class ProcessInterface; template class Hook { Q_DISABLE_COPY_MOVE(Hook) public: using Callback = std::function; public: Hook() = delete; explicit Hook(Callback defaultCallback) { set(defaultCallback); } void set(Callback cb) { m_callback = cb; } R operator()(Params &&...params) { return m_callback(std::forward(params)...); } private: Callback m_callback; }; namespace Terminal { class HooksPrivate; enum class ExitBehavior { Close, Restart, Keep }; struct OpenTerminalParameters { OpenTerminalParameters() = default; OpenTerminalParameters(const CommandLine &commandLine) : shellCommand(commandLine) {} OpenTerminalParameters(const FilePath &directory, std::optional env) : workingDirectory(directory), environment(env) {} OpenTerminalParameters(const CommandLine &commandLine, const FilePath &directory, std::optional env) : shellCommand(commandLine), workingDirectory(directory), environment(env) {} std::optional shellCommand; std::optional workingDirectory; std::optional environment; QIcon icon; ExitBehavior m_exitBehavior{ExitBehavior::Close}; std::optional identifier{std::nullopt}; }; struct NameAndCommandLine { QString name; CommandLine commandLine; }; QTCREATOR_UTILS_EXPORT Result defaultShellForDevice(const FilePath &deviceRoot); class QTCREATOR_UTILS_EXPORT Hooks { public: using OpenTerminal = std::function; using CreateTerminalProcessInterface = std::function; struct CallbackSet { OpenTerminal openTerminal; CreateTerminalProcessInterface createTerminalProcessInterface; }; public: static Hooks &instance(); ~Hooks(); void openTerminal(const OpenTerminalParameters ¶meters) const; ProcessInterface *createTerminalProcessInterface() const; void addCallbackSet(const QString &name, const CallbackSet &callbackSet); void removeCallbackSet(const QString &name); private: Hooks(); std::unique_ptr d; }; } // namespace Terminal } // namespace Utils