From 0c41c141875dd91a12e20fa99fc7876d0ee8a792 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 26 Aug 2015 19:33:52 +0100 Subject: [PATCH] Reorganize slightly local client creation --- src/client_manager.cc | 14 +++---- src/client_manager.hh | 2 +- src/main.cc | 86 +++++++++++++++++++++---------------------- 3 files changed, 48 insertions(+), 54 deletions(-) diff --git a/src/client_manager.cc b/src/client_manager.cc index 922ee2502..927c1c0e0 100644 --- a/src/client_manager.cc +++ b/src/client_manager.cc @@ -66,15 +66,11 @@ void ClientManager::handle_pending_inputs() const void ClientManager::remove_client(Client& client) { - for (auto it = m_clients.begin(); it != m_clients.end(); ++it) - { - if (it->get() == &client) - { - m_clients.erase(it); - return; - } - } - kak_assert(false); + auto it = find_if(m_clients, + [&](const std::unique_ptr& ptr) + { return ptr.get() == &client; }); + kak_assert(it != m_clients.end()); + m_clients.erase(it); } WindowAndSelections ClientManager::get_free_window(Buffer& buffer) diff --git a/src/client_manager.hh b/src/client_manager.hh index 01bb2bfc4..3db5fb8fd 100644 --- a/src/client_manager.hh +++ b/src/client_manager.hh @@ -28,7 +28,7 @@ public: bool empty() const { return m_clients.empty(); } size_t count() const { return m_clients.size(); } - void ensure_no_client_uses_buffer(Buffer& buffer); + void ensure_no_client_uses_buffer(Buffer& buffer); WindowAndSelections get_free_window(Buffer& buffer); void add_free_window(std::unique_ptr&& window, SelectionList selections); diff --git a/src/main.cc b/src/main.cc index fb0741fad..fce01de95 100644 --- a/src/main.cc +++ b/src/main.cc @@ -227,40 +227,63 @@ void register_options() UserInterface::Options{}); } -template -void create_local_client(StringView init_command, bool startup_error) +std::unique_ptr create_local_ui(bool dummy_ui) { - struct LocalUI : UI + struct DummyUI : UserInterface + { + void menu_show(ConstArrayView, CharCoord, Face, Face, MenuStyle) override {} + void menu_select(int) override {} + void menu_hide() override {} + + void info_show(StringView, StringView, CharCoord, Face, InfoStyle) override {} + void info_hide() override {} + + void draw(const DisplayBuffer&, const Face&) override {} + void draw_status(const DisplayLine&, const DisplayLine&, const Face&) override {} + CharCoord dimensions() override { return {24,80}; } + bool is_key_available() override { return false; } + Key get_key() override { return Key::Invalid; } + void refresh() override {} + void set_input_callback(InputCallback) override {} + void set_ui_options(const Options&) override {} + }; + + if (dummy_ui) + return make_unique(); + + struct LocalUI : NCursesUI { ~LocalUI() { if (not ClientManager::instance().empty() and fork()) { - this->UI::~UI(); + this->NCursesUI::~NCursesUI(); write_stdout("detached from terminal\n"); exit(0); } } }; - if (std::is_same::value) - { - if (not isatty(1)) - throw runtime_error("stdout is not a tty"); + if (not isatty(1)) + throw runtime_error("stdout is not a tty"); - if (not isatty(0)) - { - // move stdin to another fd, and restore tty as stdin - int fd = dup(0); - int tty = open("/dev/tty", O_RDONLY); - dup2(tty, 0); - close(tty); - create_fifo_buffer("*stdin*", fd); - } + if (not isatty(0)) + { + // move stdin to another fd, and restore tty as stdin + int fd = dup(0); + int tty = open("/dev/tty", O_RDONLY); + dup2(tty, 0); + close(tty); + create_fifo_buffer("*stdin*", fd); } + return make_unique(); +} + +void create_local_client(std::unique_ptr ui, StringView init_command, bool startup_error) +{ static Client* client = ClientManager::instance().create_client( - make_unique(), get_env_vars(), init_command); + std::move(ui), get_env_vars(), init_command); if (startup_error) client->print_status({ @@ -329,26 +352,6 @@ int run_client(StringView session, StringView init_command) return 0; } -struct DummyUI : UserInterface -{ -public: - void menu_show(ConstArrayView, CharCoord, Face, Face, MenuStyle) override {} - void menu_select(int) override {} - void menu_hide() override {} - - void info_show(StringView, StringView, CharCoord, Face, InfoStyle) override {} - void info_hide() override {} - - void draw(const DisplayBuffer&, const Face&) override {} - void draw_status(const DisplayLine&, const DisplayLine&, const Face&) override {} - CharCoord dimensions() override { return {24,80}; } - bool is_key_available() override { return false; } - Key get_key() override { return Key::Invalid; } - void refresh() override {} - void set_input_callback(InputCallback) override {} - void set_ui_options(const Options&) override {} -}; - int run_server(StringView session, StringView init_command, bool ignore_kakrc, bool daemon, bool dummy_ui, ConstArrayView files) @@ -445,12 +448,7 @@ int run_server(StringView session, StringView init_command, new Buffer("*scratch*", Buffer::Flags::None); if (not daemon) - { - if (dummy_ui) - create_local_client(init_command, startup_error); - else - create_local_client(init_command, startup_error); - } + create_local_client(create_local_ui(dummy_ui), init_command, startup_error); while (not terminate and (not client_manager.empty() or daemon)) {