Refactor context_wrap to share more code between draft/non draft case
Fixes #706
This commit is contained in:
parent
a8cf2a84c4
commit
fcf73c2293
|
@ -1430,30 +1430,37 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context* real_context = &context;
|
Context* base_context = &context;
|
||||||
if (auto client_name = parser.get_switch("client"))
|
if (auto client_name = parser.get_switch("client"))
|
||||||
real_context = &cm.get_client(*client_name).context();
|
base_context = &cm.get_client(*client_name).context();
|
||||||
else if (auto client_name = parser.get_switch("try-client"))
|
else if (auto client_name = parser.get_switch("try-client"))
|
||||||
{
|
{
|
||||||
if (Client* client = cm.get_client_ifp(*client_name))
|
if (Client* client = cm.get_client_ifp(*client_name))
|
||||||
real_context = &client->context();
|
base_context = &client->context();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser.get_switch("draft"))
|
Optional<InputHandler> input_handler;
|
||||||
|
Context* effective_context = base_context;
|
||||||
|
|
||||||
|
const bool draft = (bool)parser.get_switch("draft");
|
||||||
|
if (draft)
|
||||||
{
|
{
|
||||||
InputHandler input_handler(real_context->selections(),
|
input_handler.emplace(base_context->selections(),
|
||||||
Context::Flags::Transient,
|
Context::Flags::Transient,
|
||||||
real_context->name());
|
base_context->name());
|
||||||
Context& c = input_handler.context();
|
effective_context = &input_handler->context();
|
||||||
|
|
||||||
// Preserve window so that window scope is available
|
// Preserve window so that window scope is available
|
||||||
if (real_context->has_window())
|
if (base_context->has_window())
|
||||||
c.set_window(real_context->window());
|
effective_context->set_window(base_context->window());
|
||||||
|
|
||||||
// We do not want this draft context to commit undo groups if the real one is
|
// We do not want this draft context to commit undo groups if the real one is
|
||||||
// going to commit the whole thing later
|
// going to commit the whole thing later
|
||||||
if (real_context->is_editing())
|
if (base_context->is_editing())
|
||||||
c.disable_undo_handling();
|
effective_context->disable_undo_handling();
|
||||||
|
}
|
||||||
|
|
||||||
|
Context& c = *effective_context;
|
||||||
|
|
||||||
ScopedSetBool disable_hooks(c.user_hooks_disabled(), no_hooks);
|
ScopedSetBool disable_hooks(c.user_hooks_disabled(), no_hooks);
|
||||||
ScopedSetBool disable_keymaps(c.keymaps_disabled(), no_keymaps);
|
ScopedSetBool disable_keymaps(c.keymaps_disabled(), no_keymaps);
|
||||||
|
@ -1461,7 +1468,7 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
|
|
||||||
if (parser.get_switch("itersel"))
|
if (parser.get_switch("itersel"))
|
||||||
{
|
{
|
||||||
SelectionList sels{real_context->selections()};
|
SelectionList sels{base_context->selections()};
|
||||||
ScopedEdition edition{c};
|
ScopedEdition edition{c};
|
||||||
for (auto& sel : sels)
|
for (auto& sel : sels)
|
||||||
{
|
{
|
||||||
|
@ -1473,25 +1480,19 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
|
||||||
if (&sels.buffer() != &c.buffer())
|
if (&sels.buffer() != &c.buffer())
|
||||||
throw runtime_error("the buffer has changed while iterating on selections");
|
throw runtime_error("the buffer has changed while iterating on selections");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (not draft)
|
||||||
|
{
|
||||||
|
sels.update();
|
||||||
|
c.selections_write_only() = std::move(sels);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
func(parser, c);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (parser.get_switch("itersel"))
|
const bool collapse_jumps = not draft and (bool)parser.get_switch("collapse-jumps");
|
||||||
throw runtime_error("-itersel makes no sense without -draft");
|
|
||||||
|
|
||||||
Context& c = *real_context;
|
|
||||||
|
|
||||||
const bool collapse_jumps = (bool)parser.get_switch("collapse-jumps");
|
|
||||||
SelectionList jump = c.selections();
|
SelectionList jump = c.selections();
|
||||||
JumpList original_jump_list = collapse_jumps ? c.jump_list() : JumpList{};
|
JumpList original_jump_list = collapse_jumps ? c.jump_list() : JumpList{};
|
||||||
|
|
||||||
ScopedSetBool disable_hooks(c.user_hooks_disabled(), no_hooks);
|
|
||||||
ScopedSetBool disable_keymaps(c.keymaps_disabled(), no_keymaps);
|
|
||||||
ScopedSetBool disable_history(c.history_disabled());
|
|
||||||
|
|
||||||
func(parser, c);
|
func(parser, c);
|
||||||
|
|
||||||
if (collapse_jumps and c.jump_list() != original_jump_list)
|
if (collapse_jumps and c.jump_list() != original_jump_list)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user