Propagate the hooks disabled state through prompt, menu, and command execution

Maintain it as well during buffer creation even if the hooks are not executed
in client context.

Fixes #818
This commit is contained in:
Maxime Coste 2016-11-14 13:59:33 +00:00
parent cb074793a0
commit b3ba769220
8 changed files with 49 additions and 12 deletions

View File

@ -710,6 +710,9 @@ void Buffer::on_option_changed(const Option& option)
void Buffer::run_hook_in_own_context(StringView hook_name, StringView param) void Buffer::run_hook_in_own_context(StringView hook_name, StringView param)
{ {
if (m_flags & Buffer::Flags::NoHooks)
return;
InputHandler hook_handler({ *this, Selection{} }, Context::Flags::Transient); InputHandler hook_handler({ *this, Selection{} }, Context::Flags::Transient);
hooks().run_hook(hook_name, param, hook_handler.context()); hooks().run_hook(hook_name, param, hook_handler.context());
} }

View File

@ -109,8 +109,9 @@ public:
New = 1 << 1, New = 1 << 1,
Fifo = 1 << 2, Fifo = 1 << 2,
NoUndo = 1 << 3, NoUndo = 1 << 3,
Debug = 1 << 4, NoHooks = 1 << 4,
ReadOnly = 1 << 5, Debug = 1 << 5,
ReadOnly = 1 << 6,
}; };
Buffer(String name, Flags flags, StringView data = {}, Buffer(String name, Flags flags, StringView data = {},

View File

@ -57,20 +57,20 @@ ByteCount get_byte_to_column(const Buffer& buffer, ColumnCount tabstop, DisplayC
return (int)(it - line.begin()); return (int)(it - line.begin());
} }
Buffer* open_file_buffer(StringView filename) Buffer* open_file_buffer(StringView filename, Buffer::Flags flags)
{ {
MappedFile file_data{filename}; MappedFile file_data{filename};
return BufferManager::instance().create_buffer( return BufferManager::instance().create_buffer(
filename.str(), Buffer::Flags::File, file_data, file_data.st.st_mtim); filename.str(), Buffer::Flags::File | flags, file_data, file_data.st.st_mtim);
} }
Buffer* open_or_create_file_buffer(StringView filename) Buffer* open_or_create_file_buffer(StringView filename, Buffer::Flags flags)
{ {
auto& buffer_manager = BufferManager::instance(); auto& buffer_manager = BufferManager::instance();
if (file_exists(filename)) if (file_exists(filename))
{ {
MappedFile file_data{filename}; MappedFile file_data{filename};
return buffer_manager.create_buffer(filename.str(), Buffer::Flags::File, return buffer_manager.create_buffer(filename.str(), Buffer::Flags::File | flags,
file_data, file_data.st.st_mtim); file_data, file_data.st.st_mtim);
} }
return buffer_manager.create_buffer( return buffer_manager.create_buffer(

View File

@ -76,8 +76,10 @@ ByteCount get_byte_to_column(const Buffer& buffer, ColumnCount tabstop,
DisplayCoord coord); DisplayCoord coord);
Buffer* create_fifo_buffer(String name, int fd, bool scroll = false); Buffer* create_fifo_buffer(String name, int fd, bool scroll = false);
Buffer* open_file_buffer(StringView filename); Buffer* open_file_buffer(StringView filename,
Buffer* open_or_create_file_buffer(StringView filename); Buffer::Flags flags = Buffer::Flags::None);
Buffer* open_or_create_file_buffer(StringView filename,
Buffer::Flags flags = Buffer::Flags::None);
void reload_file_buffer(Buffer& buffer); void reload_file_buffer(Buffer& buffer);
void write_to_debug_buffer(StringView str); void write_to_debug_buffer(StringView str);

View File

@ -222,6 +222,8 @@ void edit(const ParametersParser& parser, Context& context, const ShellContext&)
auto& buffer_manager = BufferManager::instance(); auto& buffer_manager = BufferManager::instance();
Buffer* buffer = buffer_manager.get_buffer_ifp(name); Buffer* buffer = buffer_manager.get_buffer_ifp(name);
const bool no_hooks = context.hooks_disabled();
const auto flags = no_hooks ? Buffer::Flags::NoHooks : Buffer::Flags::None;
if (force_reload and buffer and buffer->flags() & Buffer::Flags::File) if (force_reload and buffer and buffer->flags() & Buffer::Flags::File)
reload_file_buffer(*buffer); reload_file_buffer(*buffer);
@ -236,18 +238,20 @@ void edit(const ParametersParser& parser, Context& context, const ShellContext&)
} }
if (not buffer) if (not buffer)
buffer = buffer_manager.create_buffer(name, Buffer::Flags::None); buffer = buffer_manager.create_buffer(name, flags);
} }
else if (auto fifo = parser.get_switch("fifo")) else if (auto fifo = parser.get_switch("fifo"))
buffer = open_fifo(name, *fifo, (bool)parser.get_switch("scroll")); buffer = open_fifo(name, *fifo, (bool)parser.get_switch("scroll"));
else if (not buffer) else if (not buffer)
{ {
buffer = parser.get_switch("existing") ? open_file_buffer(name) buffer = parser.get_switch("existing") ? open_file_buffer(name, flags)
: open_or_create_file_buffer(name); : open_or_create_file_buffer(name, flags);
if (buffer->flags() & Buffer::Flags::New) if (buffer->flags() & Buffer::Flags::New)
context.print_status({ format("new file '{}'", name), context.print_status({ format("new file '{}'", name),
get_face("StatusLine") }); get_face("StatusLine") });
} }
buffer->flags() &= ~Buffer::Flags::NoHooks;
} }
const size_t param_count = parser.positional_count(); const size_t param_count = parser.positional_count();

View File

@ -528,6 +528,10 @@ public:
if (context().has_client()) if (context().has_client())
context().client().menu_hide(); context().client().menu_hide();
context().print_status(DisplayLine{}); context().print_status(DisplayLine{});
// Maintain hooks disabled in callback if they were before pop_mode
ScopedSetBool disable_hooks(context().hooks_disabled(),
context().hooks_disabled());
pop_mode(); pop_mode();
int selected = m_selected - m_choices.begin(); int selected = m_selected - m_choices.begin();
m_callback(selected, MenuEvent::Validate, context()); m_callback(selected, MenuEvent::Validate, context());
@ -546,6 +550,10 @@ public:
{ {
if (context().has_client()) if (context().has_client())
context().client().menu_hide(); context().client().menu_hide();
// Maintain hooks disabled in callback if they were before pop_mode
ScopedSetBool disable_hooks(context().hooks_disabled(),
context().hooks_disabled());
pop_mode(); pop_mode();
int selected = m_selected - m_choices.begin(); int selected = m_selected - m_choices.begin();
m_callback(selected, MenuEvent::Abort, context()); m_callback(selected, MenuEvent::Abort, context());
@ -680,6 +688,10 @@ public:
context().print_status(DisplayLine{}); context().print_status(DisplayLine{});
if (context().has_client()) if (context().has_client())
context().client().menu_hide(); context().client().menu_hide();
// Maintain hooks disabled in callback if they were before pop_mode
ScopedSetBool disable_hooks(context().hooks_disabled(),
context().hooks_disabled());
pop_mode(); pop_mode();
// call callback after pop_mode so that callback // call callback after pop_mode so that callback
// may change the mode // may change the mode
@ -693,6 +705,10 @@ public:
context().print_status(DisplayLine{}); context().print_status(DisplayLine{});
if (context().has_client()) if (context().has_client())
context().client().menu_hide(); context().client().menu_hide();
// Maintain hooks disabled in callback if they were before pop_mode
ScopedSetBool disable_hooks(context().hooks_disabled(),
context().hooks_disabled());
pop_mode(); pop_mode();
m_callback(line, PromptEvent::Abort, context()); m_callback(line, PromptEvent::Abort, context());
return; return;
@ -935,6 +951,9 @@ public:
void on_key(Key key) override void on_key(Key key) override
{ {
// maintain hooks disabled in the callback if they were before pop_mode
ScopedSetBool disable_hooks(context().hooks_disabled(),
context().hooks_disabled());
pop_mode(); pop_mode();
m_callback(key, context()); m_callback(key, context());
} }

View File

@ -201,7 +201,12 @@ void goto_commands(Context& context, NormalParams params)
Buffer* buffer = BufferManager::instance().get_buffer_ifp(path); Buffer* buffer = BufferManager::instance().get_buffer_ifp(path);
if (not buffer) if (not buffer)
buffer = open_file_buffer(path); {
buffer = open_file_buffer(path, context.hooks_disabled() ?
Buffer::Flags::NoHooks
: Buffer::Flags::None);
buffer->flags() &= ~Buffer::Flags::NoHooks;
}
if (buffer != &context.buffer()) if (buffer != &context.buffer())
{ {

View File

@ -369,6 +369,9 @@ void Window::on_option_changed(const Option& option)
void Window::run_hook_in_own_context(StringView hook_name, StringView param) void Window::run_hook_in_own_context(StringView hook_name, StringView param)
{ {
if (m_buffer->flags() & Buffer::Flags::NoHooks)
return;
InputHandler hook_handler({ *m_buffer, Selection{} }, Context::Flags::Transient); InputHandler hook_handler({ *m_buffer, Selection{} }, Context::Flags::Transient);
hook_handler.context().set_window(*this); hook_handler.context().set_window(*this);
if (m_client) if (m_client)