#ifndef JUCI_TERMINAL_H_ #define JUCI_TERMINAL_H_ #include #include #include "gtkmm.h" #include #include #include #include class Terminal : public Gtk::TextView { public: class Config { public: std::string cmake_command; std::string make_command; }; class InProgress { public: InProgress(const std::string& start_msg); ~InProgress(); void done(const std::string& msg); void cancel(const std::string& msg); private: void start(const std::string& msg); int line_nr; std::atomic stop; Glib::Dispatcher waiting_print; std::thread wait_thread; }; Terminal(); int execute(const std::string &command, const boost::filesystem::path &path=""); void async_execute(const std::string &command, const boost::filesystem::path &path="", std::function callback=nullptr); void kill_last_async_execute(bool force=false); void kill_async_executes(bool force=false); int print(const std::string &message, bool bold=false); void print(int line_nr, const std::string &message); std::shared_ptr print_in_progress(std::string start_msg); void async_print(const std::string &message, bool bold=false); void async_print(int line_nr, const std::string &message); protected: bool on_key_press_event(GdkEventKey *event); private: Glib::Dispatcher async_print_dispatcher; Glib::Dispatcher async_print_on_line_dispatcher; std::vector > async_print_strings; std::vector > async_print_on_line_strings; std::mutex async_print_strings_mutex; std::mutex async_print_on_line_strings_mutex; Glib::RefPtr bold_tag; std::mutex async_executes_mutex; std::list > async_executes; std::string stdin_buffer; }; #endif // JUCI_TERMINAL_H_