#pragma once #include #include #include #include #include #include class SshTerminal { public: SshTerminal(); ~SshTerminal(); bool connect(const std::string& host, int port, const std::string& user, const std::string& keyfile, const std::string& password); void disconnect(); bool is_connected() const { return connected_; } GtkWidget* widget() const { return GTK_WIDGET(vte_box_); } const std::string& server_name() const { return server_name_; } void set_server_name(const std::string& name) { server_name_ = name; } std::function on_status_change; private: void cleanup(); static gpointer io_thread_func(gpointer data); static void on_size_changed(VteTerminal* term, guint cols, guint rows, gpointer data); GtkWidget* vte_box_; VteTerminal* terminal_; ssh_session session_; ssh_channel channel_; int pty_master_; int pty_slave_; std::atomic running_; std::atomic connected_; GThread* thread_; std::string server_name_; };