#ifndef client_hh_INCLUDED #define client_hh_INCLUDED #include "keys.hh" #include "completion.hh" #include "utils.hh" #include "string.hh" #include "editor.hh" namespace Kakoune { class Editor; class Window; class Context; using MenuCallback = std::function; using PromptCallback = std::function; using KeyCallback = std::function; class Client : public SafeCountable { public: Client(); virtual ~Client(); virtual void draw_window(Window& window) = 0; virtual void print_status(const String& status, CharCount cursor_pos = -1) = 0; void insert(Editor& editor, IncrementalInserter::Mode mode); void repeat_last_insert(Editor& editor, Context& context); void prompt(const String& prompt, Completer completer, PromptCallback callback); void menu(const memoryview& choices, MenuCallback callback); void on_next_key(KeyCallback callback); void handle_next_input(Context& context); private: virtual void menu_show(const memoryview& choices) = 0; virtual void menu_select(int selected) = 0; virtual void menu_hide() = 0; virtual Key get_key() = 0; void reset_normal_mode(); std::pair> m_last_insert; class Mode; std::unique_ptr m_mode; class NormalMode; class MenuMode; class PromptMode; class NextKeyMode; class InsertMode; }; struct prompt_aborted {}; } #endif // client_hh_INCLUDED