Redraw relevant clients after adding/removing highlighters

This commit is contained in:
Maxime Coste 2019-12-28 11:27:04 +11:00
parent 7c1d4f5bd6
commit 22bfbd06af
3 changed files with 31 additions and 11 deletions

View File

@ -171,20 +171,21 @@ void Client::change_buffer(Buffer& buffer)
close_buffer_reload_dialog();
auto& client_manager = ClientManager::instance();
WindowAndSelections ws = client_manager.get_free_window(buffer);
m_window->options().unregister_watcher(*this);
m_window->set_client(nullptr);
WindowAndSelections ws = client_manager.get_free_window(buffer);
client_manager.add_free_window(std::move(m_window),
std::move(context().selections()));
m_window = std::move(ws.window);
m_window->set_client(this);
m_window->options().register_watcher(*this);
m_ui->set_ui_options(m_window->options()["ui_options"].get<UserInterface::Options>());
context().selections_write_only() = std::move(ws.selections);
context().set_window(*m_window);
m_window->set_dimensions(m_ui->dimensions());
m_ui->set_ui_options(m_window->options()["ui_options"].get<UserInterface::Options>());
m_window->hooks().run_hook(Hook::WinDisplay, buffer.name(), context());
force_redraw();

View File

@ -900,6 +900,27 @@ Highlighter& get_highlighter(const Context& context, StringView path)
return *root;
}
static void redraw_relevant_clients(Context& context, StringView highlighter_path)
{
StringView scope{highlighter_path.begin(), find(highlighter_path, '/')};
if (scope == "window")
context.window().force_redraw();
else if (scope == "buffer" or prefix_match(scope, "buffer="))
{
auto& buffer = scope == "buffer" ? context.buffer() : BufferManager::instance().get_buffer(scope.substr(7_byte));
for (auto&& client : ClientManager::instance())
{
if (&client->context().buffer() == &buffer)
client->context().window().force_redraw();
}
}
else
{
for (auto&& client : ClientManager::instance())
client->context().window().force_redraw();
}
}
const CommandDesc add_highlighter_cmd = {
"add-highlighter",
"addhl",
@ -948,9 +969,7 @@ const CommandDesc add_highlighter_cmd = {
parent.add_child(name.empty() ? auto_name(parser.positionals_from(1)) : std::move(name),
it->value.factory(highlighter_params, &parent));
// TODO: better, this will fail if we touch scopes highlighters that impact multiple windows
if (context.has_window())
context.window().force_redraw();
redraw_relevant_clients(context, path);
}
};
@ -973,9 +992,7 @@ const CommandDesc remove_highlighter_cmd = {
if (sep_it == rev_path.end())
return;
get_highlighter(context, {path.begin(), sep_it.base()}).remove_child({sep_it.base(), path.end()});
if (context.has_window())
context.window().force_redraw();
redraw_relevant_clients(context, path);
}
};

View File

@ -178,7 +178,6 @@ void Context::change_buffer(Buffer& buffer)
m_last_buffer = contains(BufferManager::instance(), current) ? current : nullptr;
}
m_window.reset();
if (has_client())
{
client().info_hide();
@ -186,7 +185,10 @@ void Context::change_buffer(Buffer& buffer)
client().change_buffer(buffer);
}
else
{
m_window.reset();
m_selections = SelectionList{buffer, Selection{}};
}
if (has_input_handler())
input_handler().reset_normal_mode();