From ef1fd3acb95a58900d73a194ce8339b5301dfd0b Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Fri, 12 Apr 2019 09:02:59 +1000 Subject: [PATCH] Prevent conversion to client on suspend from disconnecting other clients clear the client manager in the to be converted process without sending exit messages as the forked server will still be there. Fixes #2847 --- src/buffer_manager.cc | 2 +- src/client_manager.cc | 13 +++++++++---- src/client_manager.hh | 2 +- src/main.cc | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index d4e88b6c..30056525 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -21,7 +21,7 @@ BufferManager::~BufferManager() // Make sure not clients exists if (ClientManager::has_instance()) - ClientManager::instance().clear(); + ClientManager::instance().clear(true); } Buffer* BufferManager::create_buffer(String name, Buffer::Flags flags, diff --git a/src/client_manager.cc b/src/client_manager.cc index 9dd32df5..ca32678f 100644 --- a/src/client_manager.cc +++ b/src/client_manager.cc @@ -14,13 +14,18 @@ namespace Kakoune ClientManager::ClientManager() = default; ClientManager::~ClientManager() { - clear(); + clear(true); } -void ClientManager::clear() +void ClientManager::clear(bool disconnect_clients) { - while (not m_clients.empty()) - remove_client(*m_clients.front(), true, 0); + if (disconnect_clients) + { + while (not m_clients.empty()) + remove_client(*m_clients.front(), true, 0); + } + else + m_clients.clear(); m_client_trash.clear(); for (auto& window : m_free_windows) diff --git a/src/client_manager.hh b/src/client_manager.hh index 104d2124..7d92ed7e 100644 --- a/src/client_manager.hh +++ b/src/client_manager.hh @@ -27,7 +27,7 @@ public: bool empty() const { return m_clients.empty(); } size_t count() const { return m_clients.size(); } - void clear(); + void clear(bool exit); void ensure_no_client_uses_buffer(Buffer& buffer); diff --git a/src/main.cc b/src/main.cc index 6b533003..d115ef2f 100644 --- a/src/main.cc +++ b/src/main.cc @@ -801,6 +801,7 @@ int run_server(StringView session, StringView server_init, if (fork_server_to_background()) { + ClientManager::instance().clear(false); String session = server.session(); server.close_session(false); throw convert_to_client_mode{ std::move(session), std::move(client_name), std::move(buffer_name), std::move(selections) };