4fc20b8d7d
Client quitting no longer immediately unwinds, client is just pushed for deletion until we get back to the main loop, similarly to what happens for buffer and window deletion.
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
#ifndef client_manager_hh_INCLUDED
|
|
#define client_manager_hh_INCLUDED
|
|
|
|
#include "client.hh"
|
|
#include "completion.hh"
|
|
|
|
namespace Kakoune
|
|
{
|
|
|
|
struct WindowAndSelections
|
|
{
|
|
std::unique_ptr<Window> window;
|
|
SelectionList selections;
|
|
size_t timestamp;
|
|
};
|
|
|
|
class ClientManager : public Singleton<ClientManager>
|
|
{
|
|
public:
|
|
ClientManager();
|
|
~ClientManager();
|
|
|
|
Client* create_client(std::unique_ptr<UserInterface>&& ui,
|
|
EnvVarMap env_vars, StringView init_cmd);
|
|
|
|
bool empty() const { return m_clients.empty(); }
|
|
size_t count() const { return m_clients.size(); }
|
|
|
|
void clear();
|
|
|
|
void ensure_no_client_uses_buffer(Buffer& buffer);
|
|
|
|
WindowAndSelections get_free_window(Buffer& buffer);
|
|
void add_free_window(std::unique_ptr<Window>&& window, SelectionList selections);
|
|
|
|
void redraw_clients() const;
|
|
void handle_pending_inputs() const;
|
|
|
|
Client* get_client_ifp(StringView name);
|
|
Client& get_client(StringView name);
|
|
bool validate_client_name(StringView name) const;
|
|
void remove_client(Client& client, bool graceful);
|
|
|
|
using ClientList = Vector<std::unique_ptr<Client>, MemoryDomain::Client>;
|
|
using iterator = ClientList::const_iterator;
|
|
|
|
iterator begin() const { return m_clients.begin(); }
|
|
iterator end() const { return m_clients.end(); }
|
|
|
|
CandidateList complete_client_name(StringView name,
|
|
ByteCount cursor_pos = -1) const;
|
|
|
|
void clear_window_trash();
|
|
void clear_client_trash();
|
|
private:
|
|
String generate_name() const;
|
|
|
|
ClientList m_clients;
|
|
ClientList m_client_trash;
|
|
Vector<WindowAndSelections, MemoryDomain::Client> m_free_windows;
|
|
Vector<std::unique_ptr<Window>> m_window_trash;
|
|
};
|
|
|
|
}
|
|
|
|
#endif // client_manager_hh_INCLUDED
|