summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-04-04 13:10:38 +1100
committerMaxime Coste <mawww@kakoune.org>2019-04-04 13:10:38 +1100
commitcc788c888e3e7c273cb518337f593bd3a768e1ac (patch)
tree6560a1d408293053078485d947afaf7c67757398 /src
parentd91e017803aca3b75dbb3d1cfca26a811022c1d4 (diff)
Fix detection of client ungraceful disconnection
Diffstat (limited to 'src')
-rw-r--r--src/client_manager.cc12
-rw-r--r--src/client_manager.hh2
2 files changed, 11 insertions, 3 deletions
diff --git a/src/client_manager.cc b/src/client_manager.cc
index 2f2a9e84..63a9201e 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -75,7 +75,7 @@ Client* ClientManager::create_client(std::unique_ptr<UserInterface>&& ui, int pi
return contains(m_clients, client) ? client : nullptr;
}
-void ClientManager::process_pending_inputs() const
+void ClientManager::process_pending_inputs()
{
while (true)
{
@@ -84,8 +84,16 @@ void ClientManager::process_pending_inputs() const
// client input processing, which would break iterator based iteration.
// (its fine to skip a client if that happens as had_input will be true
// if a client triggers client removal)
- for (int i = 0; i < m_clients.size(); ++i)
+ for (int i = 0; i < m_clients.size(); )
+ {
+ if (not m_clients[i]->is_ui_ok())
+ {
+ remove_client(*m_clients[i], false, -1);
+ continue;
+ }
had_input = m_clients[i]->process_pending_inputs() or had_input;
+ ++i;
+ }
if (not had_input)
break;
diff --git a/src/client_manager.hh b/src/client_manager.hh
index 465b74b5..104d2124 100644
--- a/src/client_manager.hh
+++ b/src/client_manager.hh
@@ -35,7 +35,7 @@ public:
void add_free_window(std::unique_ptr<Window>&& window, SelectionList selections);
void redraw_clients() const;
- void process_pending_inputs() const;
+ void process_pending_inputs();
bool has_pending_inputs() const;
Client* get_client_ifp(StringView name);