From d2b0dba39dfc87fe7da7610b0ed68df65d89ded8 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Mon, 14 Dec 2015 19:06:30 +0000 Subject: [PATCH] Support quitting while executing RuntimeError hooks Fixes #529 --- src/client.cc | 35 +++++++++++++++++++---------------- src/client_manager.cc | 17 ++++++++++------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/client.cc b/src/client.cc index ec7f3ce8..3a4f44ed 100644 --- a/src/client.cc +++ b/src/client.cc @@ -67,24 +67,27 @@ void Client::handle_available_input(EventMode mode) try { - while (Optional key = get_next_key(mode)) + try { - if (*key == ctrl('c')) - killpg(getpgrp(), SIGINT); - else if (*key == Key::FocusIn) - context().hooks().run_hook("FocusIn", context().name(), context()); - else if (*key == Key::FocusOut) - context().hooks().run_hook("FocusOut", context().name(), context()); - else if (key->modifiers == Key::Modifiers::Resize) - force_redraw(); - else - m_input_handler.handle_key(*key); + while (Optional key = get_next_key(mode)) + { + if (*key == ctrl('c')) + killpg(getpgrp(), SIGINT); + else if (*key == Key::FocusIn) + context().hooks().run_hook("FocusIn", context().name(), context()); + else if (*key == Key::FocusOut) + context().hooks().run_hook("FocusOut", context().name(), context()); + else if (key->modifiers == Key::Modifiers::Resize) + force_redraw(); + else + m_input_handler.handle_key(*key); + } + } + catch (Kakoune::runtime_error& error) + { + context().print_status({ error.what().str(), get_face("Error") }); + context().hooks().run_hook("RuntimeError", error.what(), context()); } - } - catch (Kakoune::runtime_error& error) - { - context().print_status({ error.what().str(), get_face("Error") }); - context().hooks().run_hook("RuntimeError", error.what(), context()); } catch (Kakoune::client_removed& removed) { diff --git a/src/client_manager.cc b/src/client_manager.cc index 7e70d5c4..b71dfc75 100644 --- a/src/client_manager.cc +++ b/src/client_manager.cc @@ -42,13 +42,16 @@ Client* ClientManager::create_client(std::unique_ptr&& ui, m_clients.emplace_back(client); try { - CommandManager::instance().execute(init_commands, client->context()); - } - catch (Kakoune::runtime_error& error) - { - client->context().print_status({ error.what().str(), get_face("Error") }); - client->context().hooks().run_hook("RuntimeError", error.what(), - client->context()); + try + { + CommandManager::instance().execute(init_commands, client->context()); + } + catch (Kakoune::runtime_error& error) + { + client->context().print_status({ error.what().str(), get_face("Error") }); + client->context().hooks().run_hook("RuntimeError", error.what(), + client->context()); + } } catch (Kakoune::client_removed& removed) {