/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace HackStudio { class TerminalWrapper final : public GUI::Widget { C_OBJECT(TerminalWrapper) public: virtual ~TerminalWrapper() override; enum class WaitForExit { No, Yes }; void run_command(const String&, Optional working_directory = {}, WaitForExit = WaitForExit::No); void kill_running_command(); void clear_including_history(); bool user_spawned() const { return m_user_spawned; } VT::TerminalWidget& terminal() { return *m_terminal_widget; } enum class WaitForChildOnExit { No, Yes, }; ErrorOr setup_master_pseudoterminal(WaitForChildOnExit = WaitForChildOnExit::Yes); static ErrorOr setup_slave_pseudoterminal(int master_fd); int child_exit_status() const; Function on_command_exit; private: explicit TerminalWrapper(bool user_spawned = true); RefPtr m_terminal_widget; pid_t m_pid { -1 }; bool m_user_spawned { true }; bool m_child_exited { false }; Optional m_child_exit_status; }; }