diff options
| author | Maxime Coste <mawww@kakoune.org> | 2019-04-04 13:10:38 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2019-04-04 13:10:38 +1100 |
| commit | cc788c888e3e7c273cb518337f593bd3a768e1ac (patch) | |
| tree | 6560a1d408293053078485d947afaf7c67757398 /src | |
| parent | d91e017803aca3b75dbb3d1cfca26a811022c1d4 (diff) | |
Fix detection of client ungraceful disconnection
Diffstat (limited to 'src')
| -rw-r--r-- | src/client_manager.cc | 12 | ||||
| -rw-r--r-- | src/client_manager.hh | 2 |
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); |
