#pragma once #include "dispatcher.hpp" #include "mutex.hpp" #include "process.hpp" #include "source_base.hpp" #include #include #include #include #include #include class Terminal : public Source::SearchView { Terminal(); public: static Terminal &get() { static Terminal singleton; return singleton; } int process(const std::string &command, const boost::filesystem::path &path = "", bool use_pipes = true); int process(std::istream &stdin_stream, std::ostream &stdout_stream, const std::string &command, const boost::filesystem::path &path = "", std::ostream *stderr_stream = nullptr); void async_process(const std::string &command, const boost::filesystem::path &path = "", const std::function &callback = nullptr, bool quiet = false); void kill_last_async_process(bool force = false); void kill_async_processes(bool force = false); /// Must be called from main thread void print(std::string message, bool bold = false); /// Callable from any thread. void async_print(std::string message, bool bold = false); void configure(); void clear(); std::function scroll_to_bottom; protected: bool on_motion_notify_event(GdkEventMotion *motion_event) override; bool on_button_press_event(GdkEventButton *button_event) override; bool on_key_press_event(GdkEventKey *event) override; private: Dispatcher dispatcher; Glib::RefPtr bold_tag; Glib::RefPtr link_tag; Glib::RefPtr invisible_tag; Glib::RefPtr red_tag, green_tag, yellow_tag, blue_tag, magenta_tag, cyan_tag; Glib::RefPtr link_mouse_cursor; Glib::RefPtr default_mouse_cursor; struct Link { int start_pos, end_pos; std::string path; int line, line_index; }; boost::optional find_link(const std::string &line, size_t pos = 0, size_t length = std::string::npos); Mutex processes_mutex; std::vector> processes GUARDED_BY(processes_mutex); Glib::ustring stdin_buffer; std::atomic perform_scroll_to_bottom = {false}; };